Sadržaj:

Daljinski upravljač koji se može hakirati za mikro automobil ZenWheels: 7 koraka
Daljinski upravljač koji se može hakirati za mikro automobil ZenWheels: 7 koraka

Video: Daljinski upravljač koji se može hakirati za mikro automobil ZenWheels: 7 koraka

Video: Daljinski upravljač koji se može hakirati za mikro automobil ZenWheels: 7 koraka
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Novembar
Anonim
Image
Image
Montaža
Montaža

U ovom vodiču ćemo izgraditi prilagođeni daljinski upravljač za mikroautomobil ZenWheels. Mikroautomobil ZenWheels je automobil od 5 cm koji se može kontrolirati putem Android ili iPhone aplikacije. Pokazat ću vam kako preokrenuti Android aplikaciju kako biste saznali o komunikacijskom protokolu i kako možete izgraditi daljinski upravljač pomoću arduina i žiroskopa.

Korak 1: Komponente i alati

Dijelovi:

1. Mikroautomobil ZenWheels

2. Arduino pro mini 328p

3. Oglasna ploča

4. Žiroskop MPU6050

5. izvor napajanja <= 5 v (neka baterija koju možemo priključiti na matičnu ploču)

6. Premosni kablovi u obliku slova U (opcionalno). Koristio sam ove kratkospojne kablove jer izgledaju bolje na osnovnoj ploči. Umjesto toga mogu se koristiti obični kratkospojni kablovi

7. HC-05 bluetooth modul (s gumbom za ulazak u način rada AT)

Alati:

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

2. Arduino IDE

3. Android telefon

4. Android Studio [Opcionalno]

Korak 2: Obrnite inženjering ZenWheels Android aplikacije [opcionalno]

Za razumijevanje ovog dijela potrebno je određeno znanje o Javi i Androidu.

Cilj projekta je kontrola mikroautomobila pomoću žiroskopa. Za to moramo saznati više o bluetooth komunikaciji između ove igračke i android aplikacije.

U ovom koraku ću objasniti kako preokrenuti komunikacijski protokol između mikroautomobila i android aplikacije. Ako samo želite izgraditi daljinski upravljač, ovaj korak nije neophodan. Jedan od načina da otkrijete protokol je da pogledate izvorni kod. Hmm, ali to nije jednostavno, android aplikacije se sastavljaju i možete instalirati apk putem google playa.

Stoga sam napravio osnovni vodič za to:

1. Preuzmite APK. Android paket paketa (skraćeno APK) je format datoteke paketa koji koristi operativni sistem Android za distribuciju i instalaciju mobilnih aplikacija

Prvo pretražite aplikaciju u google play trgovini, u našem slučaju pretražite "zenwheels" i dobit ćete vezu do aplikacije

Zatim potražite na googlu "online apk downloader" i pomoću jednog preuzmite apk. Obično će tražiti vezu za aplikaciju (onu koju smo ranije dobili), a zatim ćemo pritisnuti dugme za preuzimanje i sačuvati je na računaru.

2. Dekompilirajte APK. Dekompilator u našoj situaciji je alat koji uzima APK i proizvodi Java izvorni kod.

Najjednostavnije rješenje je korištenje internetskog dekompilatora za obavljanje posla. Pretražio sam na google -u "online decompliler" i odabrao sam https://www.javadecompilers.com/. Samo trebate učitati APK koji ste ranije dobili i

pritisnite dekompilaciju. Zatim samo preuzmite izvore.

3. Pokušajte obrnuti inženjering gledajući šifru

Za otvaranje projekta potreban vam je uređivač teksta ili bolje IDE (integrirano razvojno okruženje). Zadani IDE za Android projekte je Android Studio (https://developer.android.com/studio). Nakon što instalirate Android Studio, otvorite fasciklu projekta.

Budući da naš automobil kontrolira bluetooth, započeo sam pretraživanje u dekompiliranom kodu s ključnom riječi "bluetooth", od pojavljivanja koje sam otkrio da je "BluetoothSerialService" u ruci komunikacije. Ako ova klasa upravlja komunikacijom, onda mora imati metod naredbe za slanje. Ispostavilo se da postoji jedna metoda pisanja koja šalje podatke putem bluetooth kanala:

public void write (byte out)

Ovo je dobar početak, tražio sam.write (koristi se metoda i postoji klasa "ZenWheelsMicrocar" koja proširuje našu "BluetoothSerialService". Ova klasa sadrži većinu logike naše komunikacije preko Bluetooth -a. Drugi dio logika je u kontrolerima: BaseController i StandardController.

U BaseControlleru imamo inicijalizaciju usluge, a također i definicije kanala upravljanja i gasa, kanali su zapravo prefiksi naredbi za navođenje da će slijediti neka vrsta naredbe:

zaštićen ZenWheelsMicrocar mikroautomobil = novi ZenWheelsMicrocar (ovaj, this.btHandler);

zaštićeni ChannelOutput izlazi = {novi TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), novi TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

U StandardControlleru upravljanjem se upravlja na:

public void handleSteering (TouchEvent touchEvent) {

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

Analizirajući metodu, upravljački kanal OutOutput.channel ima vrijednost 129 (kanal koji se koristi za upravljanje), a upravljanjeOutput.resolveValue () može imati vrijednost između -90 i 90. Vrijednost kanala (129) šalje se izravno, a vrijednost upravljanja se mijenja primjenom bitovnih operacija:

privatni konačni int value_convert_out (int vrijednost) {

boolean negative = false; if (vrijednost <0) {negativno = f6D; } int vrijednost2 = vrijednost & 63; if (negativno) {povratna vrijednost2 | 64; } return value2; }

U StandardController -u postoji slična metoda koja se naziva

ručica javne praznineThrottle (TouchEvent touchEvent)

Korak 3: Komponente

Dijelovi:

1. Arduino pro mini 328p 2 $

2. Oglasna ploča

3. Žiroskop MPU6050 1,2 USD

4. HC-05 master-slave 6-pinski modul 3 USD

5. 4 x AA baterije sa 4 baterije

6. Premosni kablovi u obliku slova U (opcionalno). Koristio sam ove kratkospojne kabele jer izgledaju bolje na ploči, a LED diode su tako vidljivije. Ako nemate ove kabele, možete ih zamijeniti dupont žicama.

Gore navedene cijene preuzete su s eBay -a.

Alati:

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

2. Arduino IDE

3. Android Studio (opcionalno ako sami želite obrnuti inženjering)

Korak 4: Montaža

Montaža
Montaža

Sastavljanje je vrlo jednostavno jer to radimo na ploči:)

- prvo stavljamo naše komponente na ploču: mikrokontroler, bluetooth modul i žiroskop

- spojite HC-05 bluetooth RX i TX pinove na arduino 10 i 11 pinove. Žiroskop SDA i SCL trebaju biti spojeni na pinove arduino A4 i A5

- spojite pinove za napajanje na bluetooth, žiroskop i arduino. pinovi bi trebali biti povezani sa + i - sa strane matične ploče

- zadnji put priključite napajanje (između 3,3 V do 5 V) na matičnu ploču, koristio sam malu LiPo bateriju s jednom ćelijom, ali svaka će raditi sve dok je u rasponu snage

Za više detalja pogledajte gornje slike

Korak 5: Uparite HC-05 Bluetooth s mikroautomobilom

Uparite HC-05 Bluetooth s mikroautomobilom
Uparite HC-05 Bluetooth s mikroautomobilom
Uparite HC-05 Bluetooth s mikroautomobilom
Uparite HC-05 Bluetooth s mikroautomobilom
Uparite HC-05 Bluetooth s mikroautomobilom
Uparite HC-05 Bluetooth s mikroautomobilom

Za to će vam trebati Android telefon, bluetooth HC-05 modul i serijski FTDI adapter sa žicama. Također ćemo koristiti Arduino IDE za komunikaciju s bluetooth modulom.

Prvo moramo saznati Bluetooth adresu mikroautomobila:

- omogućite bluetooth na telefonu

- uključite automobil i idite na Bluetooth odjeljak vaših postavki u Androidu

- potraga za novim uređajima i trebao bi se pojaviti neki uređaj pod nazivom "Microcar"

- uparite s ovim uređajem

- da bih izvukao bluetooth MAC, koristio sam ovu aplikaciju sa google play serijskog Bluetooth terminala

Nakon instaliranja ove aplikacije, idite na izbornik -> uređaji i tamo ćete imati popis sa svim Bluetooth uparenim uređajima. Zanima nas samo kôd ispod rudnika "Microcar" 00: 06: 66: 49: A0: 4B

Zatim spojite FTDI adapter na bluetooth modul. Prvo VCC i GROUND pinovi, a zatim FTDI RX na bluetooth TX i FTDI TX na bluetooth RX. Također bi trebao postojati pin na bluetooth modulu koji bi trebao biti spojen na VCC. Na taj način bluetooth modul ulazi u "programabilni način rada". Moj modul ima dugme koje povezuje VCC sa tim posebnim pinom. Kada priključite FTDI na USB, trebao bi biti povezan sa pinom / pritisnutim gumbom za ulazak u ovaj poseban programibilni način rada. Bluetooth potvrđuje ulazak u ovaj način rada polako trepćući svake 2 sekunde.

U Arduino IDE -u odaberite serijski port, a zatim otvorite serijski monitor (i NL i CR sa 9600 brzina prijenosa). Upišite AT i modul bi trebao potvrditi sa "OK".

Upišite "AT+ROLE = 1" da biste modul prebacili u master način rada. Za uparivanje s vašim bluetooh modulom napišite: "AT+BIND = 0006, 66, 49A04B". Primijetite kako se naš "00: 06: 66: 49: A0: 4B" pretvara u "0006, 66, 49A04B". Pa, trebali biste napraviti istu transformaciju za svoj bluetooh MAC.

Sada uključite automobil Zenwheels, zatim isključite FTDI i ponovo ga uključite bez pritiskanja tipke / priključivanja posebnog pina. Nakon nekog vremena trebao bi se povezati s automobilom i primijetit ćete kako automobil pravi specifičan zvuk uspješne veze.

Rješavanje problema:

- Otkrio sam da je od svih Bluetooth modula koje sam imao samo jedan s gumbom radio kao master!

- uverite se da je automobil potpuno napunjen

- uverite se da automobil nije povezan sa telefonom

- ako Bluetooth uđe u način rada AT (sporo treperi), ali ne reagira na naredbu, provjerite imate li OBA NL & CR, a također eksperimentirajte s drugim BAUD stopama

- dvaput provjerite je li RX spojen na TX i obrnuto

- isprobajte ovaj vodič

Korak 6: Kôd i upotreba

Prvo morate preuzeti i instalirati dvije biblioteke:

1. Biblioteka MPU6050 za žiroskop

2. Izvor biblioteke I2CDev

Zatim preuzmite i instalirajte moju biblioteku odavde ili je kopirajte odozdo:

/** * Biblioteke: * 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 inicijalizacija = false; // postavljanje true ako je DMP init bio uspješan

uint8_t mpuIntStatus; // sadrži stvarni bajt statusa prekida iz MPU -a uint8_t devStatus; // vraća status nakon svake operacije uređaja (0 = uspjeh,! 0 = greška) uint16_t packetSize; // očekivana veličina DMP paketa (zadano je 42 bajta) uint16_t fifoCount; // broj svih bajtova trenutno u FIFO uint8_t fifoBuffer [64]; // FIFO memorijski bafer Quaternion q; // [w, x, y, z] kvaterionski kontejner VectorFloat gravity; // [x, y, z] plovak gravitacije vektora ypr [3]; // [skretanje, nagib, kotrljanje] kontejner za skretanje/nagib/kotrljanje i vektor gravitacije volatile bool mpuInterrupt = false; // označava da li je pin prekida MPU previsoko

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

void setup ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Program je pokrenut"); initialization = initializeGyroscope (); }

void loop () {{100} {101}

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

/*

* Prima ugao od 0 do 180 gdje je 0 maksimalno lijevo, a 180 maksimalno desno * Prima brzinu od -90 do 90 gdje je -90 maksimalno unatrag, a 90 maksimalno naprijed */ void moveZwheelsCar (kut bajtova, int brzina) {if (millis () - lastMoveTime = 90) {resultAngle = map (kut, 91, 180, 1, 60); } else if (ugao 0) {resultSpeed = map (brzina, 0, 90, 0, 60); } else if (brzina <0) {resultSpeed = map (brzina, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (angle); 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 = ograničiti (x, -1 * MAX_ANGLE, MAX_ANGLE); y = ograničiti (y, -1 * MAX_ANGLE, MAX_ANGLE); z = ograničiti (z, -MAX_ANGLE, MAX_ANGLE); int angle = map (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int brzina = mapa (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, kut, brzina); moveZwheelsCar (kut, brzina); }

void printDebug (int x, int y, int z, int kut, int brzina)

{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 = millis (); }

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Veza MPU6050 uspješna"): F ("Veza MPU6050 nije uspjela")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP inicijalizacija nije uspjela (kôd")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Omogućavanje detekcija prekida (Arduino vanjski prekid 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP spreman! Čekanje prvog prekida … ")); = mpu.dmpGetFIFOPacketSize (); vrati true;}

void dmpDataReady ()

{mpuInterrupt = true; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Prenesite kôd pomoću FTDI adaptera na arduino, a zatim spojite baterije.

Pomoću daljinskog upravljača:

Nakon što se arduino uključi, uključite i automobil. HC-05 modul trebao bi se povezati s automobilom, kada se to dogodi, automobil će emitirati zvuk. Ako ne radi, provjerite prethodni korak i odjeljak za rješavanje problema.

Ako nagnete ploču prema naprijed, automobil bi trebao krenuti naprijed, udesno, a automobil udesno. Također izvodi postupnije pokrete, poput nagiba malo prema naprijed i malo lijevo u ovom slučaju automobil bi polako krenuo ulijevo.

Ako automobil ide na drugačiji način pri nagibu ploče, prvo držite ploču u različitim smjerovima.

Kako radi:

Skica dobija koordinate žiroskopa svakih 100 ms, vrši proračune i zatim preko bluetootha prenosi komande automobila. Prvo postoji "upravljačka" metoda koja se poziva sa sirovim uglovima x, y i z. Ova metoda pretvara upravljanje između 0 i 180 stepeni i ubrzanje između -90 i 90. Ova metoda poziva

void moveZwheelsCar (kut u bajtovima, int brzina) koji pretvara upravljanje i ubrzanje u ZenWheels specifikacije, a zatim prenosi naredbe koristeći bluetooth.

Razlog zašto sam napravio transformaciju u dva koraka je ponovna upotreba. ako bih ovu skicu morao prilagoditi daljinskom upravljaču nekim drugim uređajem, krenuo bih od osnovne metode "upravljati" koja već preslikava brzinu i upravljanje na neke korisne vrijednosti.

Korak 7: Alternative

Alternativa "obrnutom inženjeringu". Govorio sam o tome kako obrnuti inženjering projekta počevši od Android aplikacije. Ali postoji alternativa tome što možete postaviti serijski FTDI + bluetooth slave (obični HC-05 bez navođenja glavnih postavki). Zatim se iz aplikacije ZenWheels povežite na HC-05 umjesto na "mikroautomobil".

Za dekodiranje naredbi potrebno je držati upravljač u nekom položaju, a zatim pomoću python skripte analizirati serijsku komunikaciju. Predlažem python skriptu jer postoje znakovi koji se ne mogu ispisati, a Arduino IDE nije prikladan za to. Primijetit ćete da ako držite kotač u jednom položaju, aplikacija će redovito prenositi ista dva bajta. Ako promijenite položaj kotača, prvi bajt će ostati isti, druga će se promijeniti. Nakon mnogo pokušaja možete smisliti algoritam upravljanja, zatim gas unatrag, itd.

Alternativa daljinskom upravljaču zasnovanom na arduinu bio bi daljinski upravljač RaspberryPi. Raspberry pi ima ugrađen bluetooth modul koji je bezbolno postaviti u "master" načinu rada, a python bluetooth biblioteka radi poput šarma. Mogući su i neki zanimljiviji projekti poput upravljanja automobilom pomoću Alexa echo:)

Nadam se da vam se svidio projekt i ostavite komentare ispod!

Preporučuje se: