Obsah:

Hackovatelné dálkové ovládání pro ZenWheels Microcar: 7 kroků
Hackovatelné dálkové ovládání pro ZenWheels Microcar: 7 kroků

Video: Hackovatelné dálkové ovládání pro ZenWheels Microcar: 7 kroků

Video: Hackovatelné dálkové ovládání pro ZenWheels Microcar: 7 kroků
Video: RC micro car 1:48/2 2024, Červen
Anonim
Image
Image
Shromáždění
Shromáždění

V tomto tutoriálu vytvoříme vlastní dálkové ovládání pro ZenWheels microcar. Microcar ZenWheels je 5 cm autíčko, které lze ovládat pomocí aplikace pro Android nebo Iphone. Ukážu vám, jak zpětně analyzovat aplikaci pro Android, abyste se dozvěděli o komunikačním protokolu a jak můžete postavit dálkové ovládání pomocí arduina a gyroskopu.

Krok 1: Komponenty a nástroje

Díly:

1. Automobil ZenWheels

2. Arduino pro mini 328p

3. Breadboard

4. Gyroskop MPU6050

5. zdroj energie <= 5 v (nějaká baterie, kterou můžeme připojit na prkénko)

6. Propojovací kabely ve tvaru U (volitelně). Použil jsem tyto propojovací kabely, protože na prkénku vypadají lépe. Místo toho lze použít běžné propojovací kabely

7. Modul bluetooth HC-05 (s tlačítkem pro vstup do režimu AT)

Nástroje:

1. Adaptér FTDI USB na sériový FT232RL k programování Arduino pro mini

2. Arduino IDE

3. Telefon Android

4. Android Studio [Volitelné]

Krok 2: Zpětné inženýrství aplikace ZenWheels pro Android [volitelně]

K pochopení této části jsou nutné určité znalosti jazyka Java a Android.

Cílem projektu je ovládání mikroauta pomocí gyroskopu. K tomu musíme zjistit více o bluetooth komunikaci mezi touto hračkou a aplikací pro Android.

V tomto kroku vysvětlím, jak zpětně analyzovat komunikační protokol mezi microcar a aplikací pro Android. Pokud chcete pouze vytvořit dálkový ovladač, tento krok není nutný. Jedním ze způsobů, jak zjistit protokol, je podívat se na zdrojový kód. Hmm, ale to není přímočaré, aplikace pro Android jsou kompilovány a lze nainstalovat apk prostřednictvím Google Play.

Udělal jsem tedy základní příručku, jak to udělat:

1. Stáhněte si APK. Android Package Kit (zkráceně APK) je formát souboru balíčku používaný operačním systémem Android k distribuci a instalaci mobilních aplikací

Nejprve vyhledejte aplikaci v obchodě Google Play, v našem případě vyhledejte „zenwheels“a získáte odkaz na aplikaci

Poté na Googlu vyhledejte „online stahovač apk“a pomocí jednoho si apk stáhněte. Obvykle požádají o odkaz na aplikaci (ten, který jsme získali dříve), poté stiskneme tlačítko pro stažení a uložíme ho do počítače.

2. Dekompilovat APK. Dekompiler v naší situaci je nástroj, který přebírá APK a produkuje zdrojový kód Java.

Nejjednodušším řešením je použít online dekompilátor. Hledal jsem na Google „online dekomplikovač“a vybral jsem si https://www.javadecompilers.com/. Stačí nahrát dříve získaný APK a

stiskněte dekompilovat. Poté stačí stáhnout zdroje.

3. Zkuste zpětně analyzovat kód

K otevření projektu potřebujete textový editor nebo lépe IDE (integrované vývojové prostředí). Výchozí IDE pro projekty Android je Android Studio (https://developer.android.com/studio). Po instalaci aplikace Android Studio otevřete složku projektu.

Protože je naše auto ovládáno bluetooth, zahájil jsem vyhledávání v dekompilovaném kódu s klíčovým slovem „bluetooth“, z výskytů, které jsem zjistil, „BluetoothSerialService“ovládal komunikaci. Pokud tato třída zpracovává komunikaci, pak musí mít metodu příkazu send. Ukázalo se, že existuje jedna metoda zápisu, která odesílá data přes kanál bluetooth:

public void write (byte out)

To je dobrý začátek, hledal jsem.write (používá se metoda a existuje třída „ZenWheelsMicrocar“, která rozšiřuje naši „BluetoothSerialService“. Tato třída obsahuje většinu logiky naší komunikace přes Bluetooth. Druhá část logika je v řadičích: BaseController a StandardController.

V BaseController máme inicializaci služby a také definice řídicích a škrticích kanálů, kanály jsou ve skutečnosti předpony příkazů, které určují, že bude následovat nějaký typ příkazu:

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

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

V ovladači StandardController je řízení ovládáno:

public void handleSteering (TouchEvent touchEvent) {

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

Analizací metody má volantOutput.channel hodnotu 129 (kanál používaný pro řízení) a volantOutput.resolveValue () může mít hodnotu mezi -90 a 90. Hodnota kanálu (129) je odeslána přímo a hodnota řízení je upravena použitím bitových operací:

private final int value_convert_out (int hodnota) {

booleovský negativní = nepravdivý; if (hodnota <0) {negativní = f6D; } int hodnota2 = hodnota & 63; if (negative) {return value2 | 64; } návratová hodnota2; }

V StandardController je podobná metoda s názvem

public void handleThrottle (TouchEvent touchEvent)

Krok 3: Komponenty

Díly:

1. Arduino pro mini 328p 2 $

2. Breadboard

3. Gyroskop MPU6050 1,2 $

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

5. Sada baterií 4 x AA se 4 bateriemi

6. Propojovací kabely ve tvaru U (volitelně). Použil jsem tyto propojovací kabely, protože na prkénku vypadají lépe a LED diody jsou tímto způsobem viditelnější. Pokud tyto kabely nemáte, můžete je nahradit dupontními vodiči.

Výše uvedené ceny jsou převzaty z eBay.

Nástroje:

1. Adaptér FTDI USB na sériový FT232RL pro programování arduino pro mini

2. Arduino IDE

3. Android Studio (volitelné, pokud chcete provést zpětnou analýzu sami)

Krok 4: Sestavení

Shromáždění
Shromáždění

Montáž je velmi jednoduchá, protože ji děláme na prkénku:)

- nejprve umístíme na prkénko naše komponenty: mikrokontrolér, modul bluetooth a gyroskop

- Připojte vývody HC-05 bluetooth RX a TX k vývodům arduino 10 a 11. Gyroskop SDA a SCL by měl být připojen k pinům arduino A4 a A5

- připojte napájecí piny k bluetooth, gyroskopu a arduinu. kolíky by měly být připojeny k + a - na straně prkénka

- naposledy připojte napájecí zdroj (mezi 3,3 V až 5 V) na prkénko, použil jsem malou LiPo jednočlánkovou baterii, ale jakákoli bude fungovat tak dlouho, dokud bude v napájecím rozsahu

Další podrobnosti naleznete na obrázcích výše

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

K tomu budete potřebovat telefon Android, modul bluetooth HC-05 a sériový adaptér FTDI s vodiči. Také budeme používat Arduino IDE ke komunikaci s modulem bluetooth.

Nejprve musíme zjistit adresu microcar bluetooth:

- ve svém telefonu povolte bluetooth

- zapněte auto a v systému Android přejděte do sekce bluetooth

- vyhledejte nová zařízení a mělo by se objevit nějaké zařízení s názvem „Microcar“

- spárovat s tímto zařízením

- pro extrahování bluetooth MAC jsem použil tuto aplikaci z Google Play Serial Bluetooth Terminal

Po instalaci této aplikace přejděte do nabídky -> zařízení a tam budete mít seznam se všemi spárovanými zařízeními bluetooth. Nás zajímá pouze kód pod dolem „Microcar“je 00: 06: 66: 49: A0: 4B

Poté připojte adaptér FTDI k modulu bluetooth. Nejprve VCC a GROUND piny a poté FTDI RX na bluetooth TX a FTDI TX na bluetooth RX. Také by měl být pin na modulu bluetooth, který by měl být připojen k VCC. Modul bluetooth tím přejde do „programovatelného režimu“. Můj modul má tlačítko, které spojuje VCC s tímto speciálním pinem. Když zapojíte FTDI do USB, mělo by být stisknuto připojený pin / tlačítko pro vstup do tohoto speciálního programovatelného režimu. Bluetooth potvrzuje vstup do tohoto provozního režimu pomalým blikáním každé 2 sekundy.

V Arduino IDE vyberte sériový port a poté otevřete sériový monitor (NL i CR s 9600 baud rate). Zadejte AT a modul by měl potvrdit „OK“.

Chcete -li modul přepnout do hlavního režimu, zadejte „AT+ROLE = 1“. Pro spárování s vaším modulem bluetooh napište: „AT+BIND = 0006, 66, 49A04B“, Všimněte si, jak se naše „00: 06: 66: 49: A0: 4B“transformuje na „0006, 66, 49A04B“. Stejnou transformaci byste měli udělat i pro svůj bluetooh MAC.

Nyní zapněte vůz Zenwheels, poté odpojte FTDI a znovu jej připojte bez stisknutého tlačítka / připojeného speciálního kolíku. Po chvíli by se měl připojit k autu a všimnete si, že auto vydává konkrétní připojení úspěšný zvuk.

Odstraňování problémů:

- Zjistil jsem, že ze všech modulů Bluetooth, které jsem měl, fungoval jako hlavní pouze ten s tlačítkem!

- ujistěte se, že je vůz plně nabitý

- ujistěte se, že auto není připojeno k telefonu

- pokud Bluetooth přejde do režimu AT (bliká pomalu), ale nereaguje na příkaz, ujistěte se, že máte OBO NL i CR, a také experimentujte s jinými rychlostmi BAUD

- znovu zkontrolujte, zda je RX připojeno k TX a naopak

- zkuste tento návod

Krok 6: Kód a použití

Nejprve musíte stáhnout a nainstalovat dvě knihovny:

1. Knihovna MPU6050 pro gyroskop

2. Zdroj knihovny I2CDev

Potom si stáhněte a nainstalujte moji knihovnu odtud nebo ji zkopírujte níže:

/** * Knihovny: * 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;

příkaz const byteStering = 129; const byte commandSpeed = 130;

inicializace bool = false; // set true, pokud byla inicializace DMP úspěšná

uint8_t mpuIntStatus; // uchovává skutečný stavový byte přerušení z MPU uint8_t devStatus; // návrat stavu po každé operaci zařízení (0 = úspěch,! 0 = chyba) uint16_t packetSize; // očekávaná velikost paketu DMP (výchozí hodnota je 42 bajtů) uint16_t fifoCount; // počet všech bytů aktuálně ve FIFO uint8_t fifoBuffer [64]; // vyrovnávací paměť FIFO Quaternion q; // [w, x, y, z] čtveřičný kontejner VectorFloat gravitace; // [x, y, z] gravitační vektor float ypr [3]; // [stáčení, stoupání, otáčení] vybočování/stoupání/převíjení kontejneru a gravitační vektor volatile bool mpuInterrupt = false; // indikuje, zda pin přerušení MPU dosáhl vysoké hodnoty

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

neplatné nastavení ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Program spuštěn"); inicializace = initializeGyroscope (); }

prázdná smyčka () {

if (! initialization) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); vrátit se; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitace, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); řízení (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Přijímá úhel od 0 do 180, kde 0 je max. Vlevo a 180 je max. Vpravo * Přijímá rychlost od -90 do 90, kde -90 je max. Dozadu a 90 je max. Vpřed */ void moveZwheelsCar (byte byte, int speed) {if (millis () - lastMoveTime = 90) {resultAngle = mapa (úhel, 91, 180, 1, 60); } else if (úhel 0) {resultSpeed = mapa (rychlost, 0, 90, 0, 60); } else if (rychlost <0) {resultSpeed = mapa (rychlost, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (úhel); 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 = omezení (x, -1 * MAX_ANGLE, MAX_ANGLE); y = omezení (y, -1 * MAX_ANGLE, MAX_ANGLE); z = omezení (z, -MAX_ANGLE, MAX_ANGLE); int úhel = mapa (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int rychlost = mapa (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, úhel, rychlost); moveZwheelsCar (úhel, rychlost); }

void printDebug (int x, int y, int z, int angle, 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 ("úhel ="); Serial.print (úhel); Serial.print (";"); Serial.print ("speed ="); Serial.print (speed); Serial.println (";"); lastPrintTime = millis (); }

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Připojení MPU6050 úspěšné"): F ("Připojení MPU6050 se nezdařilo")); 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 detekce přerušení (externí přerušení Arduino 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP připraven! Čekání na první přerušení … ")); = mpu.dmpGetFIFOPacketSize (); return true;}

neplatné dmpDataReady ()

{mpuInterrupt = true; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Nahrajte kód pomocí adaptéru FTDI do arduina a poté připojte baterie.

Pomocí dálkového ovladače:

Poté, co je arduino zapnuto, zapněte také auto. Modul HC-05 by se měl připojit k automobilu, když k tomu dojde, auto vydá zvuk. Pokud to nefunguje, zkontrolujte předchozí krok a část pro řešení potíží.

Pokud nakloníte prkénko dopředu, auto by se mělo pohnout dopředu, doprava a auto by se mělo pohnout doprava. Provádí také pozvolnější pohyby, jako je naklonění trochu dopředu a trochu vlevo, v tomto případě by auto šlo pomalu doleva.

Pokud jde auto při naklánění prkénka jiným způsobem, přidržte prkénko v různých směrech.

Jak to funguje:

Náčrt získává souřadnice gyroskopu každých 100 ms, provádí výpočty a poté přenáší přes bluetooth povely do auta. Nejprve existuje metoda „řízení“, která je volána se surovými úhly x, y a z. Tato metoda transformuje řízení mezi 0 a 180 stupni a zrychlení mezi -90 a 90. Tato metoda volá

void moveZwheelsCar (bajtový úhel, int rychlost), který převádí řízení a zrychlení na specifikace ZenWheels a poté přenáší příkazy pomocí bluetooth.

Důvodem, proč jsem transformaci provedl ve dvou krocích, je opětovné použití. pokud bych potřeboval upravit tuto skicu na dálkové ovládání nějakého jiného zařízení, začal bych od základní metody „řízení“, která již mapuje rychlost a řízení na některé užitečné hodnoty.

Krok 7: Alternativy

Alternativa k „reverznímu inženýrství“. Mluvil jsem o tom, jak reverzně inženýrovat projekt spuštěním aplikace pro Android. Existuje však alternativa k tomu, že můžete nastavit sériový FTDI + bluetooth slave (běžný HC-05 bez zadání hlavního nastavení). Poté se z aplikace ZenWheels připojte k HC-05 namísto „mikroauta“.

Chcete -li dekódovat příkazy, budete muset držet volant v určité poloze a poté pomocí skriptu python analyzovat sériovou komunikaci. Navrhuji skript pythonu, protože existují netisknutelné znaky a Arduino IDE na to není vhodné. Zjistíte, že pokud držíte kolo v jedné poloze, aplikace bude pravidelně vysílat stejné dva bajty. Pokud změníte polohu kola, první bajt zůstane stejný, druhý se změní. Po mnoha pokusech můžete vymyslet algoritmus řízení, pak zpátečku atd.

Alternativou k dálkovému ovládání založenému na arduinu by bylo dálkové ovládání RaspberryPi. Raspberry pi má integrovaný bluetooth modul, který je bezbolestné nastavit v režimu „master“a knihovna bluetooth pythonu funguje jako kouzlo. Jsou možné i další zajímavé projekty, jako je ovládání vozu pomocí Alexa echo:)

Doufám, že se vám projekt líbil a zanechte prosím komentáře níže!

Doporučuje: