Përmbajtje:

Telekomandë e Hackable për Mikrokarinën ZenWheels: 7 hapa
Telekomandë e Hackable për Mikrokarinën ZenWheels: 7 hapa

Video: Telekomandë e Hackable për Mikrokarinën ZenWheels: 7 hapa

Video: Telekomandë e Hackable për Mikrokarinën ZenWheels: 7 hapa
Video: Sincronizare Telecomanda UPC cu Televizorul 2024, Qershor
Anonim
Image
Image
Kuvendi
Kuvendi

Në këtë tutorial ne do të ndërtojmë një telekomandë të personalizuar për mikrokarinën ZenWheels. Mikrokarina ZenWheels është një makinë lodër 5 cm që mund të kontrollohet përmes një aplikacioni Android ose Iphone. Unë do t'ju tregoj se si të inxhinieroni në mënyrë të kundërt aplikacionin Android për të mësuar rreth protokollit të komunikimit dhe si mund të ndërtoni një telekomandë duke përdorur arduino dhe një xhiroskop.

Hapi 1: Përbërësit dhe mjetet

Pjesët:

1. Mikrokarina ZenWheels

2. Arduino pro mini 328p

3. Tabela e bukës

4. Xhiroskop MPU6050

5. burimi i energjisë <= 5 v (një bateri që mund ta lidhim në dërrasën e bukës)

6. Kabllo kërcyese në formë U (opsionale). Unë i kam përdorur këto kabllo kërcyes sepse duken më mirë në tabelën e bukës. Në vend të kësaj mund të përdoren kabllo të rregullt të kërcyesit

7. Moduli bluetooth HC-05 (me një buton për të hyrë në modalitetin AT)

Mjetet:

1. Përshtatës USB serik FTDI FT232RL për të programuar Arduino pro mini

2. Arduino IDE

3. Telefoni Android

4. Android Studio [Opsionale]

Hapi 2: Inxhinieri e kundërt e Aplikacionit Android ZenWheels [opsionale]

Për të kuptuar këtë pjesë kërkohen disa njohuri për Java dhe Android.

Qëllimi i projektit është të kontrollojë mikro makinën duke përdorur një xhiroskop. Për këtë ne duhet të mësojmë më shumë rreth komunikimit bluetooth midis kësaj lodre dhe aplikacionit android.

Në këtë hap, unë do të shpjegoj se si të inxhinieroj në mënyrë të kundërt protokollin e komunikimit midis mikro makinës dhe aplikacionit android. Nëse thjesht doni të ndërtoni telekomandën, ky hap nuk është i nevojshëm. Një mënyrë për të zbuluar protokollin është të shikoni kodin burimor. Hmm, por kjo nuk është drejtpërdrejt, aplikacionet android përpilohen dhe dikush mund të instalojë apk përmes google play.

Kështu që unë kam bërë një udhëzues bazë për ta bërë këtë:

1. Shkarkoni APK -në. Një Paketë Pakete Android (shkurt APK) është formati i skedarit të paketës i përdorur nga sistemi operativ Android për shpërndarjen dhe instalimin e aplikacioneve celulare

Kërkoni së pari aplikacionin në google play store, në rastin tonë kërkoni "zenwheels" dhe do të merrni lidhjen e aplikacionit

Pastaj kërkoni në Google për "shkarkuesin apk në internet" dhe përdorni një për të shkarkuar apk -në. Zakonisht ata do të kërkojnë lidhjen e aplikacionit (atë që kemi marrë më herët), pastaj ne do të shtypim një buton shkarkimi dhe do ta ruajmë në kompjuterin tonë.

2. Zhbllokoni APK -në. Një dekompilues në situatën tonë është një mjet që merr APK dhe prodhon kodin burimor Java.

Zgjidhja më e thjeshtë është të përdorni një dekompilues online për të bërë punën. Unë kam kërkuar në Google për "dekompiluesin online" dhe kam zgjedhur https://www.javadecompilers.com/. Thjesht duhet të ngarkoni APK -në që keni marrë më herët dhe

shtypni dekompilimin. Pastaj thjesht shkarkoni burimet.

3. Përpiquni ta ktheni inxhinierin duke shikuar kodin

Për të hapur projektin ju nevojitet një redaktues teksti ose më mirë një IDE (mjedis zhvillimi i integruar). IDE e paracaktuar për Projektet Android është Android Studio (https://developer.android.com/studio). Pasi të keni instaluar Android Studio hapni dosjen e projektit.

Për shkak se makina jonë kontrollohet nga bluetooth fillova kërkimin tim në kodin e dekompiluar me fjalën kyçe "bluetooth", nga ndodhitë që kam gjetur "BluetoothSerialService" ishte në dorën e komunikimit. Nëse kjo klasë trajton komunikimin, atëherë duhet të ketë një metodë të komandës send. Rezulton se ekziston një metodë shkrimi që dërgon të dhëna përmes kanalit bluetooth:

zbrazëti publike e shkruar (byte out)

Ky është një fillim i mirë, kam kërkuar për.write (metoda që përdoret dhe ekziston një klasë "ZenWheelsMicrocar" që zgjeron "BluetoothSerialService" tonë. Kjo klasë përmban shumicën e logjikës së komunikimit tonë mbi Bluetooth. Pjesa tjetër e logjika është në kontrolluesit: BaseController dhe StandardController.

Në BaseController kemi inicimin e shërbimit, dhe gjithashtu përkufizimet e kanaleve të drejtimit dhe mbytjes, kanalet janë në të vërtetë parashtesa komandash për të specifikuar se do të pasojë një lloj komande:

mikrocar i ZenWheelsMicrocar = ZenWheelsMicrocar i ri (kjo, kjo.btHandler);

ChannelOutput daljet e mbrojtura = {new TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), TrimChannelOutput i ri (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

Në StandardController, drejtuesi merret me:

dorezë publike e zbrazët Drejtimi (TouchEvent touchEvent) {

… This.microcar.setChannel (steeringOutput.channel, steeringOutput.resolveValue ()); }

Duke analizuar metodën, kanali steeringOutput.ka vlerën 129 (kanali i përdorur për drejtimin) dhe steeringOutput.resolveValue () mund të ketë një vlerë midis -90 dhe 90. Vlera e kanalit (129) dërgohet drejtpërdrejt, dhe vlera e drejtimit modifikohet duke zbatuar operacionet bitwise:

int përfundimtar int value_convert_out (vlera int) {

negative boolean = false; nëse (vlera <0) {negative = f6D; } int vlera2 = vlera & 63; nëse (negative) {vlera e kthimit2 | 64; } vlera e kthimit2; }

Ekziston një metodë e ngjashme në StandardController e quajtur

dorezë publike me zbrazëti Thottle (TouchEvent touchEvent)

Hapi 3: Përbërësit

Pjesët:

1. Arduino pro mini 328p 2 $

2. Tabela e bukës

3. Xhiroskop MPU6050 1.2 $

4. HC-05 master-slave modul 6 pin 3 $

5. Paketë baterie 4 x AA me 4 bateri

6. Kabllo kërcyese në formë U (opsionale). Unë i kam përdorur këto kabllo kërcyes sepse duken më mirë në tabelën e bukës, dhe llambat janë më të dukshme në këtë mënyrë. Nëse nuk i keni këto kabllo, mund t'i zëvendësoni me tela dupont.

Çmimet e mësipërme janë marrë nga eBay.

Mjetet:

1. Përshtatës USB në serial FTDI FT232RL për të programuar arduino pro mini

2. Arduino IDE

3. Android Studio (opsionale nëse doni të bëni inxhinier të kundërt vetë)

Hapi 4: Asambleja

Kuvendi
Kuvendi

Asambleja është shumë e thjeshtë sepse po e bëjmë në një pjatë:)

- së pari i vendosim përbërësit tanë në tabelën e bukës: mikrokontrolluesin, modulin bluetooth dhe xhiroskopin

- lidhni kunjat HC-05 bluetooth RX dhe TX me kunjat arduino 10 dhe 11. Xhiroskopi SDA dhe SCL duhet të lidhen me kunjat arduino A4 dhe A5

- lidhni kunjat e energjisë me bluetooth, gyro dhe arduino. kunjat duhet të lidhen me + dhe - në anën e dërrasës së bukës

- së fundmi lidhni një furnizim me energji elektrike (midis 3.3V deri në 5V) në tabelën e bukës, unë kam përdorur një bateri të vogël LiPo me një qelizë, por çdo do të bëjë për aq kohë sa është në rangun e energjisë

Ju lutemi kontrolloni fotografitë e mësipërme për më shumë detaje

Hapi 5: Çiftoni Bluetooth-in HC-05 me Mikrokarinën

Çiftoni Bluetooth HC-05 me Mikrokarkën
Çiftoni Bluetooth HC-05 me Mikrokarkën
Çiftoni Bluetooth HC-05 me Mikrokarkën
Çiftoni Bluetooth HC-05 me Mikrokarkën
Çiftoni Bluetooth HC-05 me Mikrokarkën
Çiftoni Bluetooth HC-05 me Mikrokarkën

Për këtë do t'ju duhet një telefon Android, moduli bluetooth HC-05 dhe përshtatësi serik FTDI me tela. Gjithashtu ne do të përdorim Arduino IDE për të komunikuar me modulin bluetooth.

Së pari ne duhet të zbulojmë adresën e mikrokarit bluetooth:

- aktivizoni bluetooth -in në telefonin tuaj

- ndizni makinën dhe shkoni te pjesa bluetooth e cilësimeve tuaja në Android

- kërkoni për pajisje të reja dhe duhet të shfaqet ndonjë pajisje e quajtur "Microcar"

- lidheni me këtë pajisje

- pastaj për të nxjerrë MAC bluetooth, e kam përdorur këtë aplikacion nga Google play Serial Bluetooth Terminal

Pas instalimit të këtij aplikacioni, shkoni te menuja -> pajisjet dhe atje do të keni një listë me të gjitha pajisjet e çiftuara me bluetooth. Ne jemi të interesuar vetëm për kodin më poshtë miniera "Mikrokarina" është 00: 06: 66: 49: A0: 4B

Tjetra lidhni përshtatësin FTDI me modulin bluetooth. Së pari kunjat VCC dhe GROUND dhe më pas FTDI RX në bluetooth TX dhe FTDI TX në bluetooth RX. Gjithashtu duhet të ketë një kunj në modulin bluetooth që duhet të lidhet me VCC. Duke e bërë këtë, moduli bluetooth hyn në një "mënyrë programimi". Moduli im ka një buton që lidh VCC me atë pin të veçantë. Kur futni FTDI në USB duhet të jetë me pin të lidhur / shtypur butonin për të hyrë në këtë mënyrë speciale të programueshme. Bluetooth konfirmon hyrjen në këtë mënyrë të funksionimit duke ndezur ngadalë çdo 2 sekonda.

Në Arduino IDE zgjidhni portin serik, pastaj hapni monitorin serik (Si NL ashtu edhe CR me normë baud 9600). Shkruani AT dhe moduli duhet të konfirmojë me "OK".

Shkruani "AT+ROLE = 1" për ta vendosur modulin në modalitetin kryesor. Për t'u çiftuar me modulin tuaj bluetooh shkruani: "AT+BIND = 0006, 66, 49A04B", Vini re se si "00: 06: 66: 49: A0: 4B" jonë transformohet në "0006, 66, 49A04B". Epo ju duhet të bëni të njëjtin transformim për MAC tuaj bluetooh.

Tani ndizni makinën Zenwheels pastaj shkëputni FTDI -n nga priza dhe lidheni sërish pa shtypur butonin / lidhur pinin special. Pas një kohe ajo duhet të lidhet me makinën dhe do të vini re se makina bën një tingull të suksesshëm të një lidhjeje specifike.

Zgjidhja e problemeve:

- Kam gjetur se nga të gjitha modulet Bluetooth që kisha, vetëm ai me një buton funksionoi si mjeshtër!

- sigurohuni që makina të jetë e ngarkuar plotësisht

- sigurohuni që makina të mos jetë e lidhur me telefonin

- nëse Bluetooth hyn në modalitetin AT (pulson ngadalë) por nuk i përgjigjet komandës sigurohuni që keni të dyja NL & CR, dhe gjithashtu eksperimentoni me tarifa të tjera BAUD

- kontrolloni dy herë që RX është i lidhur me TX dhe anasjelltas

- provoni këtë tutorial

Hapi 6: Kodi dhe Përdorimi

Së pari ju duhet të shkarkoni dhe instaloni dy biblioteka:

1. Biblioteka MPU6050 për xhiroskopin

2. Burimi i bibliotekës I2CDev

Pastaj shkarkoni dhe instaloni bibliotekën time nga këtu ose kopjoni atë nga poshtë:

/** * Bibliotekat: * https://github.com/jrowberg/i2cdevlib * https://github.com/jrowberg/i2cdevlib */#include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h "#include" SoftwareSerial.h"

const int MAX_ANGLE = 45;

const byte commandStering = 129; const byte commandSpeed = 130;

inicimi i bool = false; // vendoset e vërtetë nëse DMP init ishte i suksesshëm

uint8_t mpuIntStatus; // mban bajt të statusit aktual të ndërprerjes nga MPU uint8_t devStatus; // kthe statusin pas çdo operacioni të pajisjes (0 = sukses,! 0 = gabim) uint16_t packetSize; // madhësia e pritshme e paketës DMP (parazgjedhja është 42 bajt) uint16_t fifoCount; // numërimi i të gjithë byteve aktualisht në FIFO uint8_t fifoBuffer [64]; // Tampon i ruajtjes FIFO Quaternion q; // [w, x, y, z] enë kuaternion VectorFloat graviteti; // [x, y, z] vektori i gravitetit noton ypr [3]; // [yaw, pitch, roll] yaw/katran/rrotull enë dhe vektori i gravitetit bool i paqëndrueshëm mpuInterrupt = false; // tregon nëse kunja e ndërprerjes MPU ka shkuar lartë

pa shenjë e gjatë lastPrintTime, lastMoveTime = 0;

SoftueriStar BT serial (10, 11);

MPU6050 mpu;

void setup ()

{Serial.fillo (9600); BTserial.filloj (38400); Serial.println ("Programi filloi"); inicimi = fillimiGyroskopi (); }

lak void () {

nëse (! inicimi) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); kthim; } if (mpuIntStatus & 0x02) {ndërsa (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= PaketaSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetra graviteti (& graviteti, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & graviteti); drejtoj (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Merr kënd nga 0 në 180 ku 0 është max majtas dhe 180 max max djathtas * Merr shpejtësi nga -90 në 90 ku -90 është max prapa dhe 90 është max përpara */ lëvizje e pavlerëZwheelsCar (këndi i bajtit, shpejtësia int) {nëse (millis () - lastMoveTime = 90) {resultAngle = hartë (kënd, 91, 180, 1, 60); } else if (këndi 0) {resultSpeed = harta (shpejtësia, 0, 90, 0, 60); } else if (shpejtësia <0) {resultSpeed = harta (shpejtësia, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (kënd); Serial.print (";"); Serial.print ("actualSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((byte) resultSpeed); lastMoveTime = milis (); }

drejtues i pavlefshëm (int x, int y, int z)

{x = kufizim (x, -1 * MAX_ANGLE, MAX_ANGLE); y = kufizim (y, -1 * MAX_ANGLE, MAX_ANGLE); z = kufizim (z, -MAX_ANGLE, MAX_ANGLE); këndi int = harta (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int shpejtësia = harta (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, këndi, shpejtësia); moveZwheelsCar (kënd, shpejtësi); }

printim i zbrazët Debug (int x, int y, int z, kënd int, shpejtësi int)

{if (millis () - lastPrintTime <1000) {return; } Serial.print ("z ="); Serial.print (x); Serial.print (";"); Serial.print ("y ="); Serial.print (y); Serial.print (";"); Serial.print ("z ="); Serial.print (z); Serial.print (";"); Serial.print ("angle ="); Serial.print (angle); Serial.print (";"); Serial.print ("speed ="); Serial.print (speed); Serial.println (";"); lastPrintTime = milis (); }

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Lidhja MPU6050 e suksesshme"): F ("Lidhja MPU6050 dështoi")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("Inicimi i DMP dështoi (kodi")); Serial.println (devStatus); kthimi false;} mpu.setDMPEnabled (true); Serial.println (F ("Enabling zbulimi i ndërprerjes (Ndërprerja e jashtme Arduino 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP gati! Duke pritur ndërprerjen e parë … ")); paketaSize = mpu.dmpGetFIFOPacketSize (); kthehu e vërtetë;}

void dmpDataReady ()

{mpuInterrupt = e vërtetë; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

{kthehu mpuIntStatus & 0x10 || fifoCount == 1024; }

Ngarko kodin duke përdorur përshtatësin FTDI në arduino pastaj lidh bateritë.

Duke përdorur telekomandën:

Pasi të jetë ndezur arduino, gjithashtu ndizni makinën. Moduli HC-05 duhet të lidhet me makinën, kur kjo të ndodhë makina do të lëshojë një tingull. Nëse nuk funksionon, ju lutemi kontrolloni hapin e mëparshëm dhe seksionin e zgjidhjes së problemeve.

Nëse e pjerrët bukën përpara makina duhet të ecë përpara, djathtas dhe makina duhet të lëvizë djathtas. Ai gjithashtu kryen lëvizje më graduale si pjerrësia pak përpara dhe pak majtas në këtë rast makina do të shkonte ngadalë në të majtë.

Nëse makina shkon në një mënyrë tjetër kur anoni pjatën e bukës, së pari mbani atë në drejtime të ndryshme.

Si punon:

Skica merr koordinatat e xhiroskopit çdo 100 ms, bën llogaritjet dhe më pas transmeton komandat e makinës përmes bluetooth. Së pari ekziston një metodë "drejtimi" që quhet me këndet e papërpunuara x, y dhe z. Kjo metodë transformon drejtimin midis 0 dhe 180 gradë dhe nxitimin midis -90 dhe 90. Kjo metodë thërret

void moveZwheelsCar (këndi i bajtit, shpejtësia int) që konverton drejtimin dhe nxitimin në specifikimet e ZenWheels dhe më pas transmeton komandat duke përdorur bluetooth.

Arsyeja pse e kam bërë transformimin në dy hapa, është ripërdorimi. nëse do të më duhej ta përshtasja këtë skicë në telekomandë ndonjë pajisje tjetër do të filloja nga metoda bazë "drejtoj" që tashmë e përcakton shpejtësinë dhe drejtimin në disa vlera të dobishme.

Hapi 7: Alternativat

Një alternativë ndaj "inxhinierisë së kundërt". Kam folur për mënyrën e inxhinierimit të kundërt të projektit duke filluar me aplikacionin Android. Por ka një alternativë për këtë ju mund të vendosni një skllav serik FTDI + bluetooth (i rregullt HC-05 pa specifikuar cilësimet kryesore). Pastaj nga aplikacioni ZenWheels lidheni me HC-05 në vend të "mikro makinës".

Për të deshifruar komandat do t'ju duhet të mbani timonin në një pozicion, pastaj duke përdorur një shkrim python analizoni komunikimin serik. Unë po sugjeroj një shkrim python sepse ka karaktere jo të printueshme dhe Arduino IDE nuk është i përshtatshëm për këtë. Ju do të vini re se nëse e mbani timonin në një pozicion, aplikacioni do të transmetojë rregullisht të njëjtat dy bajtë. Nëse ndryshoni pozicionin e rrotës, bajti i grushtit do të mbetet i njëjtë, i dyti do të ndryshojë. Pas shumë sprovave mund të dalësh me algoritmin e drejtimit, pastaj mbytjen e inxhinierit të kundërt etj.

Një alternativë për telekomandën me bazë arduino do të ishte një telekomandë RaspberryPi. Mjedra pi ka një modul të integruar bluetooth që është pa dhimbje për t'u vendosur në modalitetin "master" dhe biblioteka bluetooth blu Python punon si një bukuri. Gjithashtu disa projekte më interesante janë të mundshme si kontrolli i makinës duke përdorur Alexa echo:)

Shpresoj se ju ka pëlqyer projekti dhe ju lutemi lini komentet më poshtë!

Recommended: