Sisukord:

Häkkitav kaugjuhtimispult ZenWheels Microcarile: 7 sammu
Häkkitav kaugjuhtimispult ZenWheels Microcarile: 7 sammu

Video: Häkkitav kaugjuhtimispult ZenWheels Microcarile: 7 sammu

Video: Häkkitav kaugjuhtimispult ZenWheels Microcarile: 7 sammu
Video: КАКИМ БУДЕТ PORTAL 3 2024, Juuni
Anonim
Image
Image
Kokkupanek
Kokkupanek

Selles õpetuses ehitame ZenWheelsi mikroauto jaoks kohandatud kaugjuhtimispuldi. ZenWheels mikroauto on 5 cm mänguauto, mida saab juhtida Androidi või iPhone'i rakenduse kaudu. Näitan teile, kuidas muuta Androidi rakendust pöördprojekteerimiseks, et saada teada sideprotokollist ja kuidas saate arduino ja güroskoobi abil kaugjuhtimispulti luua.

Samm: komponendid ja tööriistad

Osad:

1. ZenWheels mikroauto

2. Arduino pro mini 328p

3. Leivalaud

4. MPU6050 güroskoop

5. toiteallikas <= 5 v (mõni aku, mille saame leivaplaadile kinnitada)

6. U-kujulised hüppajakaablid (valikuline). Olen kasutanud neid hüppajakaableid, sest need näevad leivaplaadil paremad välja. Selle asemel saab kasutada tavalisi hüppajakaableid

7. Bluetooth-moodul HC-05 (AT-režiimi sisenemise nupuga)

Tööriistad:

1. USB -seeria FTDI -adapter FT232RL Arduino pro mini programmeerimiseks

2. Arduino IDE

3. Android -telefon

4. Android Studio [valikuline]

2. toiming: ZenWheels Androidi rakenduse pöördprojekteerimine [valikuline]

Selle osa mõistmiseks on vaja teatud teadmisi Java ja Androidi kohta.

Projekti eesmärk on juhtida mikroautot güroskoobi abil. Selleks peame lisateavet selle mänguasja ja android -rakenduse vahelise Bluetooth -ühenduse kohta.

Selles etapis selgitan, kuidas muuta mikroauto ja android -rakenduse vahelist suhtlusprotokolli ümber. Kui soovite lihtsalt kaugjuhtimispuldi ehitada, pole see samm vajalik. Üks võimalus protokolli avastamiseks on vaadata lähtekoodi. Hmm, aga see pole otse, androidrakendused on koostatud ja APK saab installida Google Play kaudu.

Nii et ma koostasin selle tegemiseks põhijuhendi:

1. Laadige alla APK. Androidi paketikomplekt (lühendatult APK) on pakettfailivorming, mida Androidi operatsioonisüsteem kasutab mobiilirakenduste levitamiseks ja installimiseks

Esmalt otsige rakendusest Google Play poest, meie puhul otsige "zenwheels" ja saate rakenduse lingi

Seejärel otsige Google'ist "online apk downloader" ja kasutage seda APK allalaadimiseks. Tavaliselt küsivad nad rakenduse linki (see, mille oleme varem hankinud), seejärel vajutame allalaadimisnuppu ja salvestame selle oma arvutisse.

2. Kompileerige APK. Meie olukorras on dekompileerija tööriist, mis võtab APK ja toodab Java lähtekoodi.

Lihtsaim lahendus on kasutada töö tegemiseks veebipõhist dekompilerit. Olen otsinud googlest "online decompliler" ja valinud https://www.javadecompilers.com/. Peate lihtsalt üles laadima varem hankitud APK ja

vajutage dekompile. Seejärel laadige lihtsalt allikad alla.

3. Proovige koodi läbi vaadata

Projekti avamiseks vajate tekstiredaktorit või paremat IDE -d (integreeritud arenduskeskkond). Androidi projektide IDE vaikeseade on Android Studio (https://developer.android.com/studio). Pärast Android Studio installimist avage projekti kaust.

Kuna meie autot juhib bluetooth, alustasin otsingut dekompileeritud koodist märksõnaga "bluetooth", leidsin juhtumitest, et juhtumitest on leitud "BluetoothSerialService". Kui see klass tegeleb suhtlusega, peab sellel olema saatmise käsumeetod. Selgub, et on olemas üks kirjutusmeetod, mis saadab andmeid bluetooth -kanali kaudu:

public void write (bait välja)

See on hea algus, olen otsinud.write (meetodit kasutatakse ja seal on klass "ZenWheelsMicrocar", mis laiendab meie "BluetoothSerialService". See klass sisaldab enamikku meie Bluetoothi kaudu suhtlemise loogikast. Teine osa loogika on kontrollerites: BaseController ja StandardController.

BaseControlleris on meil teenuse initsialiseerimine, samuti rooli- ja gaasikanalite määratlused, kanalid on tegelikult käskude eesliited, et täpsustada, et teatud tüüpi käske järgitakse:

kaitstud ZenWheelsMicrocar mikroauto = uus ZenWheelsMicrocar (see, see.btHandler);

kaitstud ChannelOutput väljundid = {uus TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), uus TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

Standardkontrolleris juhitakse rooli:

public void handleJuhtimine (TouchEvent touchEvent) {

… This.microcar.setChannel (rooliväljund.kanal, rooliväljund.resolveVäärtus ()); }

Meetodi analüüsimisel on roolivõrguOutput.channel väärtus 129 (juhtimiseks kasutatav kanal) ja rooliOutput.resolveValue () väärtus võib olla vahemikus -90 kuni 90. Kanali väärtus (129) saadetakse otse ja juhtimisväärtust muudetakse bitipõhiste toimingute abil:

private final int value_convert_out (int väärtus) {

loogiline negatiivne = vale; kui (väärtus <0) {negatiivne = f6D; } int väärtus2 = väärtus & 63; kui (negatiivne) {tagastusväärtus2 | 64; } tagastamisväärtus2; }

StandardControlleris on sarnane meetod nimega

avalik tühikäepide Gaasiklapp (TouchEvent touchEvent)

3. samm: komponendid

Osad:

1. Arduino pro mini 328p 2 $

2. Leivalaud

3. MPU6050 güroskoop 1,2 $

4. HC-05 ülem-alam 6-pin moodul 3 $

5. 4 x AA patareipakk 4 patareiga

6. U-kujulised hüppajakaablid (valikuline). Olen kasutanud neid hüppajakaableid, sest need näevad leivaplaadil paremad välja ja ledid on sel viisil paremini nähtavad. Kui teil neid kaableid pole, saate need asendada dupontjuhtmetega.

Ülaltoodud hinnad on võetud eBayst.

Tööriistad:

1. USB to serial FTDI adapter FT232RL arduino pro mini programmeerimiseks

2. Arduino IDE

3. Android Studio (valikuline, kui soovite end ümber kujundada)

4. samm: kokkupanek

Kokkupanek
Kokkupanek

Kokkupanek on väga lihtne, sest me teeme seda leivaplaadil:)

- kõigepealt asetame oma komponendid leivalauale: mikrokontrolleri, Bluetooth -mooduli ja güroskoobi

- ühendage HC-05 Bluetooth RX ja TX kontaktid arduino 10 ja 11 kontaktiga. Güroskoop SDA ja SCL tuleks ühendada arduino A4 ja A5 tihvtidega

- ühendage toitepistikud bluetoothi, güroskoobi ja arduinoga. tihvtid tuleks ühendada leivalaua küljel olevate + ja - külgedega

- viimati ühendage toiteallikas (vahemikus 3,3 V kuni 5 V) leivaplaadiga, olen kasutanud väikest üheelemendilist LiPo akut, kuid igaüks teeb seda seni, kuni see jääb võimsusvahemikku

Lisateabe saamiseks vaadake ülaltoodud pilte

Samm: siduge Bluetooth-HC-mikro mikroautoga

Paarige HC-05 Bluetooth mikroautoga
Paarige HC-05 Bluetooth mikroautoga
Paarige HC-05 Bluetooth mikroautoga
Paarige HC-05 Bluetooth mikroautoga
Paarige HC-05 Bluetooth mikroautoga
Paarige HC-05 Bluetooth mikroautoga

Selleks vajate Android-telefoni, Bluetooth-moodulit HC-05 ja juhtmetega jada-FTDI-adapterit. Samuti kasutame Bluetooth -mooduliga suhtlemiseks Arduino IDE -d.

Kõigepealt peame välja selgitama mikroauto Bluetooth -aadressi:

- lubage oma telefonis bluetooth

- lülitage auto sisse ja minge Androidi seadete Bluetoothi jaotisesse

- otsige uusi seadmeid ja ilmub mõni seade nimega "Microcar"

- siduda selle seadmega

- siis Bluetoothi MAC -i ekstraheerimiseks olen seda rakendust kasutanud Google Play jada Bluetooth -terminalist

Pärast selle rakenduse installimist minge menüüsse -> seadmed ja seal on kõigi Bluetoothiga ühendatud seadmete loend. Oleme huvitatud ainult koodist, mis asub kaevanduse "Microcar" all: 00: 06: 66: 49: A0: 4B

Seejärel ühendage FTDI -adapter bluetooth -mooduliga. Esmalt VCC ja GROUND tihvtid ning seejärel FTDI RX bluetooth TX ja FTDI TX bluetooth RX. Samuti peaks Bluetooth -moodulil olema tihvt, mis tuleks ühendada VCC -ga. Seda tehes siseneb Bluetooth -moodul "programmeerimisrežiimi". Minu moodulil on nupp, mis ühendab VCC selle spetsiaalse tihvtiga. Kui ühendate FTDI USB -d, peaks sellesse programmeerimisrežiimi sisenemiseks olema ühendatud tihvt / nupp. Bluetooth kinnitab sellesse töörežiimi sisenemist, vilgudes aeglaselt iga 2 sekundi järel.

Valige Arduino IDE -s jadaport, seejärel avage jadamonitor (nii NL kui ka CR 9600 -bitise kiirusega). Tippige AT ja moodul peaks kinnitama nupuga "OK".

Sisestage moodul põhirežiimi "AT+ROLE = 1". Sidumiseks oma bluetooh mooduliga kirjutage: "AT+BIND = 0006, 66, 49A04B", pange tähele, kuidas meie "00: 06: 66: 49: A0: 4B" muudetakse "0006, 66, 49A04B". Peaksite sama muutuse tegema ka oma bluetoo MAC -i jaoks.

Nüüd lülitage Zenwheels auto sisse, seejärel eemaldage FTDI ja ühendage see uuesti ilma nuppu vajutamata / spetsiaalset tihvti ühendamata. Mõne aja pärast peaks see autoga ühenduma ja märkate, et auto teeb konkreetset ühendust edukalt.

Veaotsing:

- Ma leidsin, et kõigist Bluetooth -moodulitest, mis mul olid, töötas kaptenina ainult see, millel oli nupp!

- veenduge, et auto oleks täielikult laetud

- veenduge, et auto pole telefoniga ühendatud

- kui Bluetooth lülitub AT -režiimi (vilgub aeglaselt), kuid see ei reageeri käsule, veenduge, et teil oleks nii NL kui ka CR, ning katsetage ka teiste BAUD -sagedustega

- kontrollige veel kord, kas RX on TX -ga ühendatud ja vastupidi

- proovige seda õpetust

6. samm: kood ja kasutamine

Kõigepealt peate alla laadima ja installima kaks raamatukogu:

1. MPU6050 raamatukogu güroskoobi jaoks

2. I2CDev raamatukogu allikas

Seejärel laadige alla ja installige minu kogu siit või kopeerige see altpoolt:

/** * Raamatukogud: * 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 bait käskStering = 129; const bait käskKiirus = 130;

booli initsialiseerimine = vale; // määrake tõene, kui DMP -algatus õnnestus

uint8_t mpuIntStatus; // omab tegelikku katkestuse oleku baiti MPU -st uint8_t devStatus; // tagastab oleku pärast iga seadme toimingut (0 = õnnestumine,! 0 = viga) uint16_t packetSize; // eeldatav DMP paketi suurus (vaikimisi on 42 baiti) uint16_t fifoCount; // kõigi baitide arv praegu FIFO -s uint8_t fifoBuffer [64]; // FIFO salvestuspuhver Quaternion q; // [w, x, y, z] kvaternionikonteiner VectorFloat gravity; // [x, y, z] gravitatsioonivektori ujuk ypr [3]; // [kaldumine, kaldenurk, veeremine] yaw/pitch/roll konteiner ja gravitatsioonivektor lenduv bool mpuInterrupt = false; // näitab, kas MPU katkestusnõel on kõrgele tõusnud

allkirjastamata pikk lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

tühine seadistus ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Programm käivitati"); initsialiseerimine = initializeGyroscope (); }

void loop () {

kui (! initsialiseerimine) {return; } mpuInterrupt = vale; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); tagasipöördumine; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitatsioon, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravitatsioon); juhtima (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Võtab nurga vahemikus 0 kuni 180, kus 0 on maksimaalselt vasakul ja 180 on maksimaalselt paremal * Saab kiiruse vahemikus -90 kuni 90, kus -90 on maksimaalselt tagurpidi ja 90 on maksimaalselt edasi */ tühine liikumine ZwheelsCar (baitnurk, int kiirus) {if (millis () - lastMoveTime = 90) {resultAngle = kaart (nurk, 91, 180, 1, 60); } else if (nurk 0) {resultSpeed = kaart (kiirus, 0, 90, 0, 60); } else if (kiirus <0) {resultSpeed = kaart (kiirus, 0, -90, 120, 60); } Serial.print ("factAngle ="); Serial.print (nurk); Serial.print (";"); Serial.print ("factSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((bait) resultSpeed); lastMoveTime = millis (); }

tühi juhtimine (int x, int y, int z)

{x = piirata (x, -1 * MAX_ANGLE, MAX_ANGLE); y = piirata (y, -1 * MAX_ANGLE, MAX_ANGLE); z = piirata (z, -MAX_ANGLE, MAX_ANGLE); int nurk = kaart (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int kiirus = kaart (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, nurk, kiirus); moveZwheelsCar (nurk, kiirus); }

void printDebug (int x, int y, int z, int nurk, int kiirus)

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

bool InitializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 ühendus õnnestus"): F ("MPU6050 ühendus nurjus")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP -i initsialiseerimine ebaõnnestus (kood")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("lubamine) katkestuse tuvastamine (Arduino väline katkestus 0)… "")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F ("DMP valmis! Ootan esimest katkestust …")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;}

void dmpDataReady ()

{mpuInterrupt = tõsi; }

Boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Laadige kood FTDI -adapteri abil arduino -sse, seejärel ühendage patareid.

Kaugjuhtimispuldi kasutamine:

Pärast arduino sisselülitamist lülitage ka auto sisse. Moodul HC-05 peaks ühenduma autoga, kui see juhtub, annab auto heli. Kui see ei tööta, kontrollige eelmist sammu ja veaotsingu jaotist.

Kui leivaplaati ettepoole kallutate, peaks auto liikuma edasi, paremale ja auto paremale. See sooritab ka järk -järgulisemaid liigutusi, näiteks kallutades natuke ette ja veidi vasakule, sel juhul liiguks auto aeglaselt vasakule.

Kui auto liigub leivalaua kaldel mõnevõrra teisiti, hoidke leivalauda kõigepealt eri suundades.

Kuidas see töötab:

Eskiis saab güroskoobi koordinaadid iga 100 ms järel, teeb arvutused ja edastab seejärel Bluetoothi kaudu auto käsud. Esiteks on juhtimismeetod, mida kutsutakse toores x, y ja z nurkadega. See meetod muudab rooli 0 ja 180 kraadi vahel ja kiirenduse vahemikus -90 kuni 90. See meetod nõuab

void moveZwheelsCar (baitnurk, int kiirus), mis muudab rooli ja kiirenduse ZenWheels spetsifikatsioonideks ning edastab seejärel käsud bluetoothi abil.

Põhjus, miks tegin ümberkujundamise kahes etapis, on korduvkasutatavus. kui mul oleks vaja seda visandit mõne muu seadme kaugjuhtimiseks kohandada, alustaksin baasmeetodist "juhtimine", mis juba kaardistab kiiruse ja juhtimise mõnele väärtusele.

7. samm: alternatiivid

Alternatiiv "pöördprojekteerimisele". Olen rääkinud sellest, kuidas projekti ümber kujundada, alustades Androidi rakendusega. Kuid sellele on ka alternatiiv, saate seadistada jadase FTDI + bluetooth-alamseadme (tavaline HC-05 ilma põhiseadeid täpsustamata). Seejärel ühendage ZenWheels rakendusest mikroauto asemel HC-05.

Käskude dekodeerimiseks peate rooli mingis asendis hoidma ja seejärel pythoni skripti abil jadamisi analüüsima. Ma soovitan pythoni skripti, kuna seal on mitteprinditavad märgid ja Arduino IDE pole selleks sobiv. Te märkate, et kui hoiate ratast ühes asendis, edastab rakendus regulaarselt samu kahte baiti. Kui muudate ratta asendit, jääb rusika bait samaks, teine muutub. Pärast paljusid katseid saate välja pakkuda roolimisalgoritmi, seejärel tagurpidi konstrueeritud gaasi jne.

Alternatiiviks arduino -põhisele kaugjuhtimispuldile oleks RaspberryPi kaugjuhtimispult. Vaarika pi -l on sisseehitatud bluetooth -moodul, mida on "master" -režiimis valutu seadistada ja pythoni bluetooth -raamatukogu töötab nagu võlu. Võimalikud on ka mõned huvitavamad projektid, näiteks auto juhtimine Alexa kaja abil:)

Loodan, et teile projekt meeldis ja jätke palun kommentaarid allpool!

Soovitan: