Kazalo:

Daljinski upravljalnik, ki ga je mogoče vdreti za mikro avtomobil ZenWheels: 7 korakov
Daljinski upravljalnik, ki ga je mogoče vdreti za mikro avtomobil ZenWheels: 7 korakov

Video: Daljinski upravljalnik, ki ga je mogoče vdreti za mikro avtomobil ZenWheels: 7 korakov

Video: Daljinski upravljalnik, ki ga je mogoče vdreti za mikro avtomobil ZenWheels: 7 korakov
Video: Я ПРОБУДИЛ ЗАПЕЧАТАННОГО ДЬЯВОЛА / I HAVE AWAKENED THE SEALED DEVIL 2024, November
Anonim
Image
Image
Montaža
Montaža

V tej vadnici bomo izdelali daljinski upravljalnik po meri za mikro avtomobil ZenWheels. Mikroavtomobil ZenWheels je 5 cm avtomobil z igračami, ki ga je mogoče upravljati prek aplikacije Android ali iPhone. Pokazal vam bom, kako obrniti inženiring aplikacije Android, če želite izvedeti o komunikacijskem protokolu in kako lahko z arduinom in žiroskopom sestavite daljinski upravljalnik.

Korak: Komponente in orodja

Deli:

1. Mikroavtomobil ZenWheels

2. Arduino pro mini 328p

3. Ogledna plošča

4. Žiroskop MPU6050

5. vir energije <= 5 v (nekaj baterije, ki jo lahko pritrdimo na mizo)

6. Mostični kabli v obliki črke U (neobvezno). Uporabil sem te mostične kable, ker izgledajo bolje na plošči. Namesto tega lahko uporabite običajne mostične kable

7. Modul bluetooth HC-05 (z gumbom za vstop v način AT)

Orodja:

1. USB za serijski adapter FTDI FT232RL za programiranje Arduino pro mini

2. Arduino IDE

3. Telefon Android

4. Android Studio [izbirno]

2. korak: Obratno inženiring aplikacije za Android ZenWheels [neobvezno]

Za razumevanje tega dela je potrebno nekaj znanja o Javi in Androidu.

Cilj projekta je nadzor mikro avtomobila z žiroskopom. Za to moramo izvedeti več o komunikaciji Bluetooth med to igračo in aplikacijo za Android.

V tem koraku bom razložil, kako obrniti inženiring komunikacijskega protokola med mikro avtomobilom in aplikacijo za Android. Če želite samo zgraditi daljinski upravljalnik, ta korak ni potreben. Eden od načinov odkrivanja protokola je ogled izvorne kode. Hmm, vendar to ni naravnost, aplikacije za Android so sestavljene in apk lahko namestite prek google play.

Zato sem naredil osnovni vodnik za to:

1. Prenesite APK. Paket Android Kit (na kratko APK) je oblika datoteke paketa, ki jo operacijski sistem Android uporablja za distribucijo in namestitev mobilnih aplikacij

Najprej poiščite aplikacijo v trgovini Google Play, v našem primeru poiščite »zenwheels« in dobili boste povezavo do aplikacije

Nato v Googlu poiščite "spletni apk downloader" in z njim naložite apk. Običajno bodo zahtevali povezavo do aplikacije (tisto, ki smo jo dobili prej), nato pa pritisnemo gumb za prenos in jo shranimo v računalnik.

2. Dekompilirajte APK. Dekompiler v naših razmerah je orodje, ki vzame APK in ustvari izvorno kodo Java.

Najenostavnejša rešitev je, da za delo uporabite spletni dekompiler. V Googlu sem iskal "spletni dekomplirnik" in izbral sem https://www.javadecompilers.com/. Naložiti morate le APK, ki ste ga pridobili prej, in

pritisnite dekompilacijo. Nato samo naložite vire.

3. Poskusite obrniti inženir skozi kodo

Če želite odpreti projekt, potrebujete urejevalnik besedil ali bolje IDE (integrirano razvojno okolje). Privzeti IDE za projekte Android je Android Studio (https://developer.android.com/studio). Ko namestite Android Studio, odprite mapo projekta.

Ker naš avto nadzoruje bluetooth, sem iskal v dekompilirani kodi s ključno besedo "bluetooth", od dogodkov, ki sem jih našel, pa je "BluetoothSerialService" v roki komunikacije. Če ta razred upravlja komunikacijo, mora imeti način pošiljanja ukazov. Izkazalo se je, da obstaja en način pisanja, ki pošilja podatke po kanalu bluetooth:

public void write (byte out)

To je dober začetek, iskal sem.write (uporablja se metoda in obstaja razred "ZenWheelsMicrocar", ki razširja našo "BluetoothSerialService". Ta razred vsebuje večino logike naše komunikacije prek Bluetootha. Drugi del logika je v krmilnikih: BaseController in StandardController.

V BaseControllerju imamo inicializacijo storitve in tudi definicije krmilnih in dušilnih kanalov, kanali so v resnici ukazne predpone, ki določajo, da bo sledila neka vrsta ukaza:

zaščiten mikroavtomobil ZenWheelsMicrocar = nov ZenWheelsMicrocar (to, this.btHandler);

zaščiteni ChannelOutput izhodi = {novi TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), novi TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

V standardnem krmilniku krmiljenje poteka na naslednji način:

public void handleSteering (TouchEvent touchEvent) {

… This.microcar.setChannel (usmerjevalni izhod.kanal, krmilni izhod.resolveValue ()); }

Če analiziramo metodo, ima channelOutput.channel vrednost 129 (kanal, ki se uporablja za krmiljenje), krmiljenjeOutput.resolveValue () pa ima lahko vrednost med -90 in 90. Vrednost kanala (129) se pošlje neposredno, vrednost krmiljenja pa se spremeni z uporabo bitnih operacij:

zasebni končni int value_convert_out (vrednost int) {

logično negativno = napačno; if (vrednost <0) {negativno = f6D; } int vrednost2 = vrednost & 63; if (negativno) {povratna vrednost2 | 64; } return value2; }

V StandardControllerju obstaja podobna metoda

javna ročica praznineThrottle (TouchEvent touchEvent)

Korak: Komponente

Deli:

1. Arduino pro mini 328p 2 $

2. Ogledna plošča

3. Žiroskop MPU6050 1,2 $

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

5. 4 x AA baterija s 4 baterijami

6. Mostični kabli v obliki črke U (neobvezno). Uporabil sem te mostične kable, ker izgledajo bolje na plošči, LED diode pa so tako bolj vidne. Če teh kablov nimate, jih lahko zamenjate z dupont žicami.

Zgornje cene so vzete iz eBay.

Orodja:

1. USB za serijski adapter FTDI FT232RL za programiranje arduino pro mini

2. Arduino IDE

3. Android Studio (neobvezno, če želite sami spremeniti inženiring)

4. korak: Montaža

Montaža
Montaža

Sestavljanje je zelo preprosto, ker to počnemo na krovu:)

- najprej na mizo postavimo naše komponente: mikrokrmilnik, modul bluetooth in žiroskop

- priključke za RX in TX bluetooth HC-05 na 10 in 11 nožic arduino. Žiroskop SDA in SCL morata biti priključena na nožici arduino A4 in A5

- priključke za napajanje priključite na bluetooth, žiroskop in arduino. zatiči morajo biti povezani s + in - na strani plošče

- nazadnje priključite napajalnik (med 3,3 V in 5 V) na ploščo, uporabil sem majhno enocelično baterijo LiPo, vendar bo vsaka delovala, dokler je v območju moči

Za več podrobnosti si oglejte zgornje slike

5. korak: Povežite Bluetooth HC-05 Bluetooth z mikrocarjem

Povežite Bluetooth HC-05 Bluetooth z mikro avtomobilom
Povežite Bluetooth HC-05 Bluetooth z mikro avtomobilom
Povežite Bluetooth HC-05 Bluetooth z mikro avtomobilom
Povežite Bluetooth HC-05 Bluetooth z mikro avtomobilom
Povežite Bluetooth HC-05 Bluetooth z mikro avtomobilom
Povežite Bluetooth HC-05 Bluetooth z mikro avtomobilom

Za to potrebujete telefon Android, modul bluetooth HC-05 in serijski adapter FTDI z žicami. Za komunikacijo z modulom bluetooth bomo uporabljali tudi Arduino IDE.

Najprej moramo ugotoviti naslov bluetooth za mikro avto:

- omogočite bluetooth v telefonu

- vklopite avto in pojdite na razdelek Bluetooth v nastavitvah v sistemu Android

- iskanje novih naprav in prikazala bi se neka naprava z imenom "Microcar"

- povežite s to napravo

- potem, da izvlečem bluetooth MAC, sem to aplikacijo uporabil iz serijskega Bluetooth terminala google play

Ko namestite to aplikacijo, pojdite v meni -> naprave in tam boste imeli seznam vseh povezanih naprav Bluetooth. Zanima nas samo koda pod rudnikom "Microcar" 00: 06: 66: 49: A0: 4B

Nato priključite adapter FTDI na modul bluetooth. Najprej zatiči VCC in GROUND in nato FTDI RX do bluetooth TX in FTDI TX do bluetooth RX. Na modulu bluetooth mora biti tudi pin, ki ga je treba priključiti na VCC. S tem modul bluetooth preide v "programirljiv način". Moj modul ima gumb, ki poveže VCC s tem posebnim zatičem. Ko priključite FTDI na USB, ga morate s priključenim zatičem / tipko pritisniti za vstop v ta poseben programirljiv način. Bluetooth potrdi vstop v ta način delovanja tako, da vsake 2 sekundi počasi utripa.

V Arduino IDE izberite serijska vrata, nato odprite serijski monitor (NL in CR s 9600 baud hitrostjo). Vnesite AT in modul mora potrditi z "OK".

Vnesite "AT+ROLE = 1", da modul preklopite v glavni način. Če se želite seznaniti z vašim modulom bluetooh, napišite: "AT+BIND = 0006, 66, 49A04B". Upoštevajte, kako se naš "00: 06: 66: 49: A0: 4B" pretvori v "0006, 66, 49A04B". No, enako spremembo bi morali narediti za svoj bluetooh MAC.

Zdaj vklopite avtomobil Zenwheels, nato odklopite FTDI in ga znova vklopite, ne da bi pritisnil gumb / priključil poseben zatič. Čez nekaj časa bi se moral povezati z avtomobilom in opazili boste, da avto oddaja posebno povezavo.

Odpravljanje težav:

- Ugotovil sem, da je od vseh modulov Bluetooth, ki sem jih imel, le tisti z gumbom deloval kot mojster!

- zagotovite, da je avtomobil popolnoma napolnjen

- poskrbite, da avto ni povezan s telefonom

- če Bluetooth vstopi v način AT (počasi utripa), vendar se ne odziva na ukaz, zagotovite, da imate OBA NL & CR, in poskusite tudi z drugimi stopnjami BAUD

- dvakrat preverite, ali je RX priključen na TX in obratno

- preizkusite to vadnico

6. korak: Koda in uporaba

Najprej morate prenesti in namestiti dve knjižnici:

1. Knjižnica MPU6050 za žiroskop

2. Vir knjižnice I2CDev

Nato prenesite in namestite mojo knjižnico od tukaj ali jo kopirajte od spodaj:

/** * Knjižnice: * 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;

bool inicializacija = false; // če je DMP init uspešen, nastavite vrednost true

uint8_t mpuIntStatus; // vsebuje dejanski bajt stanja prekinitve iz MPU uint8_t devStatus; // vrne stanje po vsaki operaciji naprave (0 = uspeh,! 0 = napaka) uint16_t packetSize; // pričakovana velikost paketa DMP (privzeto je 42 bajtov) uint16_t fifoCount; // štetje vseh bajtov, ki so trenutno v FIFO uint8_t fifoBuffer [64]; // pomnilnik za shranjevanje FIFO Quaternion q; // [w, x, y, z] kvaterionski vsebnik VectorFloat gravitacija; // [x, y, z] plovec gravitacijskega vektorja ypr [3]; // [nihanje, nagib, zvitek] nihanje/smola/zvitek vsebnika in vektor gravitacije hlapna bool mpuInterrupt = false; // označuje, ali je prekinitveni pin MPU previsok

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

void setup ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Program se je začel"); initialization = initializeGyroscope (); }

void loop () {

if (! inicializacija) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); vrnitev; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= velikost paketa; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); krmiljenje (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Prejema kot od 0 do 180, kjer je 0 največ levo, 180 pa maksimalno desno * Prejema hitrost od -90 do 90, kjer je -90 največ nazaj in 90 največje premikanje naprej */ void premik ZwheelsCar (bajtni kot, int hitrost) {if (millis () - lastMoveTime = 90) {resultAngle = map (kot, 91, 180, 1, 60); } else if (kot 0) {resultSpeed = map (hitrost, 0, 90, 0, 60); } else if (speed <0) {resultSpeed = map (hitrost, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (kot); Serial.print (";"); Serial.print ("actualSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((byte) resultSpeed); lastMoveTime = millis (); }

void volan (int x, int y, int z)

{x = omeji (x, -1 * MAX_ANGLE, MAX_ANGLE); y = omeji (y, -1 * MAX_ANGLE, MAX_ANGLE); z = omeji (z, -MAX_ANGLE, MAX_ANGLE); int kot = zemljevid (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int hitrost = zemljevid (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, kot, hitrost); moveZwheelsCar (kot, hitrost); }

void printDebug (int x, int y, int z, int kot, int hitrost)

{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 ("kot ="); Serial.print (kot); Serial.print (";"); Serial.print ("hitrost ="); Serial.print (hitrost); Serial.println (";"); lastPrintTime = millis (); }

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Povezava MPU6050 uspešna"): F ("Povezava MPU6050 ni uspela")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP Initialization failed (code")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Omogočanje zaznavanje prekinitev (Arduino zunanji prekinitev 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP pripravljen! Čakanje na prvo prekinitev … ")); packetSize = mpu.dmpGetFIFOPacketSize (); vrni true;}

void dmpDataReady ()

{mpuInterrupt = true; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Kodo z adapterjem FTDI naložite na arduino in nato priključite baterije.

Z daljinskim upravljalnikom:

Po vklopu arduina vklopite tudi avto. Modul HC-05 se mora povezati z avtomobilom, ko se to zgodi, bo avto oddajal zvok. Če ne deluje, preverite prejšnji korak in razdelek za odpravljanje težav.

Če nagibate ploščo naprej, se mora avto premakniti naprej, desno, avto pa desno. Izvaja tudi bolj postopne gibe, kot je nagib malce naprej in v tem primeru bi avtomobil šel počasi v levo.

Če gre pri nagibu plošče na drugačen način, jo najprej držite v različnih smereh.

Kako deluje:

Skica dobi koordinate žiroskopa vsakih 100 ms, izračuna in nato prek bluetootha posreduje ukaze avtomobila. Najprej obstaja metoda "krmiljenja", ki se pokliče s surovimi koti x, y in z. Ta metoda spremeni krmiljenje med 0 in 180 stopinjami in pospešek med -90 in 90. Ta metoda zahteva

void moveZwheelsCar (bajtni kot, int hitrost), ki pretvori krmiljenje in pospeševanje v specifikacije ZenWheels in nato posreduje ukaze s pomočjo bluetootha.

Razlog, da sem preoblikovanje naredil v dveh korakih, je njegova ponovna uporaba. če bi moral to skico prilagoditi daljinskemu upravljanju na kakšni drugi napravi, bi začel z osnovno metodo "krmiljenje", ki že preslika hitrost in krmiljenje na nekatere uporabne vrednosti.

7. korak: Alternative

Alternativa "povratnemu inženiringu". Govoril sem o tem, kako obrniti inženiring projekta z uporabo aplikacije Android. Obstaja pa alternativa temu, da lahko nastavite serijskega FTDI + podrejenega bluetootha (navaden HC-05 brez določanja glavnih nastavitev). Nato se iz aplikacije ZenWheels namesto z "mikro avtomobilom" povežite s HC-05.

Za dekodiranje ukazov morate volan držati v nekem položaju in nato s pomočjo skripta python analizirati serijsko komunikacijo. Predlagam skript python, ker ni znakov za tiskanje in Arduino IDE ni primeren za to. Opazili boste, da če držite kolo v enem položaju, bo aplikacija redno prenašala enaka dva bajta. Če spremenite položaj kolesa, bo pestna bajta enaka, druga se bo spremenila. Po številnih preizkusih lahko pridete do algoritma za krmiljenje, nato za vzvratno inženirstvo za plin itd.

Alternativa daljinskemu upravljalniku, ki temelji na arduinu, bi bil daljinski upravljalnik RaspberryPi. Raspberry pi ima vgrajen modul bluetooth, ki ga je neboleče nastaviti v načinu "master", knjižnica bluetooth python pa deluje kot čar. Možni so tudi nekateri bolj zanimivi projekti, kot je nadzor avtomobila z Alexa echo:)

Upam, da vam je bil projekt všeč in pustite komentarje spodaj!

Priporočena: