Obsah:

Hackovateľné diaľkové ovládanie pre ZenWheels Microcar: 7 krokov
Hackovateľné diaľkové ovládanie pre ZenWheels Microcar: 7 krokov

Video: Hackovateľné diaľkové ovládanie pre ZenWheels Microcar: 7 krokov

Video: Hackovateľné diaľkové ovládanie pre ZenWheels Microcar: 7 krokov
Video: Тест-драйв Hyundai KONA 2024 года — самый полный обзор KONA. 2024, November
Anonim
Image
Image
zhromaždenie
zhromaždenie

V tomto návode postavíme vlastné diaľkové ovládanie pre malé auto ZenWheels. Microcar ZenWheels je 5 cm veľké autíčko, ktoré je ovládateľné pomocou aplikácie pre Android alebo Iphone. Ukážem vám, ako spätne analyzovať aplikáciu Android, aby ste sa dozvedeli o komunikačnom protokole, a ako môžete vytvoriť diaľkové ovládanie pomocou arduina a gyroskopu.

Krok 1: Komponenty a nástroje

Diely:

1. Mikromobil ZenWheels

2. Arduino pro mini 328p

3. Breadboard

4. Gyroskop MPU6050

5. zdroj energie <= 5 v (nejaká batéria, ktorú môžeme pripojiť na dosku)

6. Prepojovacie káble v tvare U (voliteľné). Použil som tieto prepojovacie káble, pretože vyzerajú lepšie na doske. Namiesto toho je možné použiť bežné prepojovacie káble

7. Modul bluetooth HC-05 (s tlačidlom na vstup do režimu AT)

Náradie:

1. Adaptér USB na sériový FTDI FT232RL na programovanie Arduino pro mini

2. Arduino IDE

3. Telefón s Androidom

4. Android Studio [voliteľné]

Krok 2: Spätné inžinierstvo aplikácie ZenWheels pre Android [voliteľné]

Na pochopenie tejto časti sú potrebné určité znalosti jazyka Java a Android.

Cieľom projektu je ovládanie mikroauta pomocou gyroskopu. Na to potrebujeme zistiť viac o bluetooth komunikácii medzi touto hračkou a aplikáciou pre Android.

V tomto kroku vysvetlím, ako spätne analyzovať komunikačný protokol medzi mikrobusom a aplikáciou pre Android. Ak si len chcete postaviť diaľkové ovládanie, tento krok nie je potrebný. Jeden zo spôsobov, ako objaviť protokol, je pozrieť sa na zdrojový kód. Hmm, ale to nie je jednoduché, aplikácie pre Android sú zostavené a apk je možné nainštalovať prostredníctvom služby Google Play.

Preto som urobil základný návod, ako to urobiť:

1. Stiahnite si APK. Android Package Kit (skratka APK) je formát súboru balíka, ktorý používa operačný systém Android na distribúciu a inštaláciu mobilných aplikácií.

Najprv vyhľadajte aplikáciu v obchode Google Play, v našom prípade vyhľadajte „zenwheels“a získate odkaz na aplikáciu

Potom vyhľadajte na Googli „online sťahovač apk“a pomocou jedného si apk stiahnite. Obvykle požiadajú o odkaz na aplikáciu (ten, ktorý sme získali skôr), potom stlačíme tlačidlo sťahovania a uložíme ho do počítača.

2. Dekompilovajte APK. Dekompiler v našej situácii je nástroj, ktorý preberá APK a vytvára zdrojový kód Java.

Najjednoduchším riešením je použiť online dekompilátor. Hľadal som na Googli „online dekomplikátor“a vybral som si https://www.javadecompilers.com/. Stačí nahrať súbor APK, ktorý ste získali predtým, a

stlačte dekompilovať. Potom stačí stiahnuť zdroje.

3. Skúste spätne analyzovať kód

Na otvorenie projektu potrebujete textový editor alebo lepšie IDE (integrované vývojové prostredie). Predvolené IDE pre projekty Android je Android Studio (https://developer.android.com/studio). Po nainštalovaní aplikácie Android Studio otvorte priečinok projektu.

Pretože je naše auto ovládané technológiou bluetooth, začal som hľadať v dekompilovanom kóde s kľúčovým slovom „bluetooth“, z toho, že som zistil, že „BluetoothSerialService“ovládal komunikáciu. Ak táto trieda zvláda komunikáciu, potom musí mať metódu príkazu odoslať. Ukazuje sa, že existuje jedna metóda zápisu, ktorá odosiela údaje prostredníctvom kanála bluetooth:

verejné prázdne zapisovanie (bajt von)

Toto je dobrý začiatok, hľadal som.write (používa sa metóda a existuje trieda „ZenWheelsMicrocar“, ktorá rozširuje našu „BluetoothSerialService“. Táto trieda obsahuje väčšinu logiky našej komunikácie cez Bluetooth. Druhá časť logika je v ovládačoch: BaseController a StandardController.

V BaseController máme inicializáciu služby a tiež definície kanálov riadenia a plynu, kanály sú v skutočnosti predponami príkazov, ktoré určujú, že bude nasledovať určitý typ príkazu:

chránený ZenWheelsMicrocar microcar = nový ZenWheelsMicrocar (this, this.btHandler);

chránené výstupy ChannelOutput = {nový TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), nový TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

V ovládači StandardController je riadenie ovládané:

public void handleSteering (TouchEvent touchEvent) {

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

Analogizáciou metódy má riadiaci výstupOutput.channel hodnotu 129 (kanál používaný na riadenie) a riadenieOutput.resolveValue () môže mať hodnotu medzi -90 a 90. Hodnota kanála (129) sa odošle priamo a hodnota riadenia sa zmení. použitím bitových operácií:

private final int value_convert_out (int value) {

booleovský negatívny = nepravdivý; if (hodnota <0) {záporný = f6D; } int hodnota2 = hodnota & 63; ak (záporné) {návratová hodnota2 | 64; } návratová hodnota2; }

V StandardController je podobná metóda

public void handleThrottle (TouchEvent touchEvent)

Krok 3: Komponenty

Diely:

1. Arduino pro mini 328p 2 $

2. Breadboard

3. Gyroskop MPU6050 1,2 $

4. 6-pinový modul HC-05 master-slave 3 $

5. 4 x batéria AA so 4 batériami

6. Prepojovacie káble v tvare U (voliteľné). Použil som tieto prepojovacie káble, pretože vyzerajú lepšie na doske a LED diódy sú týmto spôsobom viditeľnejšie. Ak tieto káble nemáte, môžete ich nahradiť káblami dupont.

Vyššie uvedené ceny sú prevzaté z eBay.

Náradie:

1. Adaptér USB na sériový FTDI FT232RL na programovanie arduino pro mini

2. Arduino IDE

3. Android Studio (voliteľné, ak chcete spätne analyzovať sami)

Krok 4: Zostavenie

zhromaždenie
zhromaždenie

Montáž je veľmi jednoduchá, pretože ju robíme na doske::)

- najskôr umiestnime naše komponenty na dosku: mikrokontrolér, modul bluetooth a gyroskop

- prepojte vývody HC-05 bluetooth RX a TX s vývodmi arduino 10 a 11. Gyroskop SDA a SCL by mali byť spojené s kolíkmi arduino A4 a A5

- pripojte napájacie piny k bluetooth, gyroskopu a arduinu. kolíky by mali byť spojené s + a - na bočnej strane dosky

- Naposledy pripojte napájací zdroj (medzi 3,3 V až 5 V) na dosku, použil som malú jednočlánkovú batériu LiPo, ale akákoľvek bude fungovať, pokiaľ bude v rozsahu napájania.

Bližšie informácie nájdete na obrázkoch vyššie

Krok 5: Spárujte Bluetooth HC-05 s Microcar

Spárujte Bluetooth HC-05 s Microcar
Spárujte Bluetooth HC-05 s Microcar
Spárujte Bluetooth HC-05 s Microcar
Spárujte Bluetooth HC-05 s Microcar
Spárujte Bluetooth HC-05 s Microcar
Spárujte Bluetooth HC-05 s Microcar

Na to budete potrebovať telefón s Androidom, modul bluetooth HC-05 a sériový adaptér FTDI s káblami. Tiež budeme používať IDE Arduino na komunikáciu s modulom bluetooth.

Najprv musíme zistiť adresu bluetooth microcar:

- povoľte vo svojom telefóne bluetooth

- zapnite auto a v nastaveniach systému Android prejdite do sekcie bluetooth

- vyhľadajte nové zariadenia a malo by sa objaviť nejaké zariadenie s názvom „Microcar“

- spárovať s týmto zariadením

- Potom som na extrakciu bluetooth MAC použil túto aplikáciu z Google Play Serial Bluetooth Terminal

Po inštalácii tejto aplikácie prejdite do ponuky -> zariadenia a tam budete mať zoznam so všetkými spárovanými zariadeniami bluetooth. Nás zaujíma iba kód pod baňou „Microcar“je 00: 06: 66: 49: A0: 4B

Potom pripojte adaptér FTDI k modulu bluetooth. Najprv piny VCC a GROUND a potom FTDI RX na bluetooth TX a FTDI TX na bluetooth RX. Na module bluetooth by mal byť tiež kolík, ktorý by mal byť pripojený k VCC. Modul bluetooth sa tým dostane do „programovateľného režimu“. Môj modul má tlačidlo, ktoré spája VCC s týmto špeciálnym pinom. Keď zapojíte FTDI do USB, malo by to byť stlačením pripojeného kolíka / tlačidla, aby ste vstúpili do tohto špeciálneho programovateľného režimu. Bluetooth potvrdí vstup do tohto režimu prevádzky pomalým blikaním každé 2 sekundy.

V Arduino IDE vyberte sériový port a potom otvorte sériový monitor (NL aj CR s 9600 baud rate). Zadajte AT a modul by mal potvrdiť „OK“.

Zadajte "AT+ROLE = 1", aby sa modul prepol do hlavného režimu. Na spárovanie s modulom bluetooh napíšte: „AT+BIND = 0006, 66, 49A04B“, všimnite si, ako sa naše „00: 06: 66: 49: A0: 4B“transformuje na „0006, 66, 49A04B“. Rovnakú transformáciu by ste mali vykonať aj pre svoj bluetooh MAC.

Teraz zapnite auto Zenwheels, potom odpojte FTDI a znova ho zapojte bez stlačeného tlačidla / špeciálneho kolíka. Po chvíli by sa malo pripojiť k autu a všimnete si, že auto vydáva úspešný zvuk pri konkrétnom pripojení.

Riešenie problémov:

- Zistil som, že zo všetkých modulov Bluetooth, ktoré som mal, fungoval ako hlavný iba ten s tlačidlom!

- uistite sa, že je auto úplne nabité

- uistite sa, že auto nie je pripojené k telefónu

- ak sa Bluetooth prepne do režimu AT (bliká pomaly), ale nereaguje na príkaz, uistite sa, že máte obidve NL a CR, a tiež experimentujte s inými rýchlosťami BAUD

- znova skontrolujte, či je RX pripojené k TX a naopak

- vyskúšajte tento návod

Krok 6: Kód a použitie

Najprv si musíte stiahnuť a nainštalovať dve knižnice:

1. Knižnica MPU6050 pre gyroskop

2. Zdroj knižnice I2CDev

Potom si stiahnite a nainštalujte moju knižnicu odtiaľto alebo ju skopírujte nižšie:

/** * Kniž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;

príkaz príkazu byte byteStering = 129; const byte commandSpeed = 130;

inicializácia bool = false; // nastavte true, ak bol inicializácia DMP úspešná

uint8_t mpuIntStatus; // uchováva bajt skutočného stavu prerušenia z MPU uint8_t devStatus; // návrat stavu po každej operácii zariadenia (0 = úspech,! 0 = chyba) uint16_t packetSize; // očakávaná veľkosť paketu DMP (predvolená hodnota je 42 bajtov) uint16_t fifoCount; // počet všetkých bajtov aktuálne vo FIFO uint8_t fifoBuffer [64]; // Vyrovnávacia pamäť FIFO Quaternion q; // [w, x, y, z] kvartérny kontajner VectorFloat gravitácia; // [x, y, z] gravitačný vektor float ypr [3]; // [vybočenie, rozstup, zvinutie] vybočenie/rozstup/zvinutie kontajnera a vektor gravitácie volatile bool mpuInterrupt = false; // indikuje, či pin prerušenia MPU stúpol vysoko

bez znamienka long lastPrintTime, lastMoveTime = 0;

Softvér Sériový rad BT (10, 11);

MPU6050 mpu;

neplatné nastavenie ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Program spustený"); inicializácia = initializeGyroscope (); }

prázdna slučka () {

if (! initialization) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); návrat; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= veľkosť balíka; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitácia, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); riadenie (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Prijíma uhol od 0 do 180, kde 0 je maximálne vľavo a 180 je maximálne vpravo * Prijíma rýchlosť od -90 do 90, kde -90 je maximálne dozadu a 90 je maximálne dopredu */ neplatný pohybZWheelsCar (uhol bajtu, vnútorná rýchlosť) {ak (millis () - lastMoveTime = 90) {resultAngle = mapa (uhol, 91, 180, 1, 60); } else if (uhol 0) {resultSpeed = mapa (rýchlosť, 0, 90, 0, 60); } else if (rýchlosť <0) {resultSpeed = mapa (rýchlosť, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (uhol); 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 steer (int x, int y, int z)

{x = obmedzenie (x, -1 * MAX_ANGLE, MAX_ANGLE); y = obmedzenie (y, -1 * MAX_ANGLE, MAX_ANGLE); z = obmedzenie (z, -MAX_ANGLE, MAX_ANGLE); int uhol = mapa (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int speed = mapa (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, uhol, rýchlosť); moveZwheelsCar (uhol, rýchlosť); }

void printDebug (int x, int y, int z, int uhol, int speed)

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

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Pripojenie MPU6050 bolo úspešné"): F ("Pripojenie MPU6050 zlyhalo")); 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 ("Enabling detekcia prerušenia (externé prerušenie Arduino 0) … "));; = mpu.dmpGetFIFOPacketSize (); return true;}

neplatné dmpDataReady ()

{mpuInterrupt = true; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Odošlite kód pomocou adaptéra FTDI do arduina a potom pripojte batérie.

Použitie diaľkového ovládača:

Keď je arduino zapnuté, zapnite aj auto. Modul HC-05 by sa mal pripojiť k automobilu, keď k tomu dôjde, auto vydá zvuk. Ak to nefunguje, skontrolujte predchádzajúci krok a časť o riešení problémov.

Ak nakloníte dosku dopredu, auto by sa malo pohnúť dopredu, doprava a auto by sa malo pohnúť doprava. Vykonáva tiež postupnejšie pohyby, ako napríklad naklonenie trochu dopredu a trochu doľava, v tomto prípade by auto išlo pomaly doľava.

Ak ide auto pri nakláňaní dosky na pečenie iným spôsobom, držte dosku najskôr v rôznych smeroch.

Ako to funguje:

Náčrt získava súradnice gyroskopu každých 100 ms, robí výpočty a potom cez bluetooth prenáša príkazy auta. Najprv existuje metóda „riadenia“, ktorá sa volá so surovými uhlami x, y a z. Táto metóda transformuje riadenie medzi 0 a 180 stupňami a zrýchlenie medzi -90 a 90. Táto metóda vyžaduje

void moveZwheelsCar (uhol bajtu, vnútorná rýchlosť), ktorý prevádza riadenie a zrýchlenie na špecifikácie ZenWheels a potom prenáša príkazy pomocou bluetooth.

Dôvod, prečo som transformáciu vykonal v dvoch krokoch, je opätovné použitie. ak by som potreboval prispôsobiť tento náčrt diaľkovému ovládaniu iného zariadenia, vychádzal by som zo základnej metódy „riadenia“, ktorá už mapuje rýchlosť a riadenie na niektoré užitočné hodnoty.

Krok 7: Alternatívy

Alternatíva k „reverznému inžinierstvu“. Hovoril som o tom, ako obrátiť inžinierstvo projektu tým, že začnete s aplikáciou pre Android. Existuje však alternatíva k tomu, že môžete nastaviť sériový podriadený modul FTDI + bluetooth (bežný HC-05 bez zadania hlavných nastavení). Potom sa z aplikácie ZenWheels pripojte k HC-05 namiesto „mikro auta“.

Na dekódovanie príkazov budete musieť držať volant v určitej polohe a potom pomocou skriptu python analyzovať sériovú komunikáciu. Navrhujem skript python, pretože existujú netlačiteľné znaky a Arduino IDE na to nie je vhodné. Uvidíte, že ak držíte koleso v jednej polohe, aplikácia bude pravidelne vysielať rovnaké dva bajty. Ak zmeníte polohu kolesa, prvý bajt zostane rovnaký, druhý sa zmení. Po mnohých pokusoch môžete prísť s algoritmom riadenia, potom plynom spätného inžinierstva atď.

Alternatívou k diaľkovému ovládaniu arduino by bol diaľkový ovládač RaspberryPi. Raspberry pi má vstavaný modul bluetooth, ktorý je bezbolestné nastaviť v režime „master“a knižnica bluetooth v pythone funguje ako kúzlo. Možné sú aj ďalšie zaujímavé projekty, ako je ovládanie auta pomocou Alexa echo:)

Dúfam, že sa vám projekt páčil a zanechajte komentáre nižšie!

Odporúča: