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, Lipanj
Anonim
Image
Image
Skupština
Skupština

U ovom ćemo vodiču 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 pričvrstiti na ploču s ploču)

6. Premosni kabeli u obliku slova U (opcionalno). Koristio sam ove kratkospojne kabele jer izgledaju bolje na 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 [Izborno]

Korak 2: Obrnuti inženjering ZenWheels Android aplikacije [nije obavezno]

Za razumijevanje ovog dijela potrebno je malo znanja o Javi i Androidu.

Cilj projekta je kontrolirati mikroautomobil 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 za otkrivanje protokola je pogledati izvorni kod. Hmm, ali to nije ravno naprijed, android aplikacije se sastavljaju i apk možete instalirati putem google playa.

Stoga sam napravio osnovni vodič za to:

1. Preuzmite APK. Android Package Kit (skraćeno APK) format je datoteke paketa koju operativni sustav Android koristi 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 upotrijebite ga za preuzimanje apk -a. Obično će tražiti vezu za aplikaciju (onu koju smo ranije dobili), a zatim ćemo pritisnuti gumb za preuzimanje i spremiti je na svoje računalo.

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

Najjednostavnije rješenje je korištenje internetskog dekompilatora za obavljanje posla. Pretražio sam google za "online decompliler" i odabrao sam https://www.javadecompilers.com/. Samo trebate prenijeti 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 mapu projekta.

Budući da našim automobilom upravlja bluetooth, započeo sam pretraživanje u dekompiliranom kodu s ključnom riječi "bluetooth", od pojavljivanja koje sam otkrio da je "BluetoothSerialService" u upravljanju komunikacijom. Ako ova klasa upravlja komunikacijom, onda mora imati metodu 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 putem Bluetootha. Drugi dio logika je u kontrolerima: BaseController i StandardController.

U BaseControlleru imamo inicijalizaciju usluge, kao i definicije kanala upravljanja i gasa, kanali su zapravo prefiksi naredbi koji određuju 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 StandardControlleru 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 $

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

5. 4 x AA baterije sa 4 baterije

6. Premosni kabeli 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 (izborno ako sami želite obrnuti inženjering)

Korak 4: Montaža

Skupština
Skupština

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 trebali bi biti spojeni na pinove A4 i A5 arduina

- spojite pinove za napajanje na bluetooth, žiroskop i arduino. pinovi bi trebali biti spojeni na + i - na bočnoj strani ploče

- zadnji put spojite napajanje (između 3,3 V do 5 V) na matičnu ploču, koristio sam malu LiPo jednoćelijsku bateriju, 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 s google play serijskog Bluetooth terminala

Nakon instaliranja ove aplikacije idite na izbornik -> uređaji i tamo ćete imati popis sa svim Bluetooth uređajima uparenim. 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 gumb koji povezuje VCC s tim posebnim pinom. Kad priključite FTDI na USB, trebao bi biti s priključenim pinom / tipkom pritisnutom za ulazak u ovaj poseban programabilni način rada. Bluetooth potvrđuje ulazak u ovaj način rada polaganim treptanjem 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 s "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, a zatim isključite FTDI i ponovno ga uključite bez pritiskanja gumba / spojenog posebnog pina. Nakon nekog vremena trebao bi se povezati s automobilom i primijetit ćete kako automobil pravi uspješan zvuk povezivanja.

Rješavanje problema:

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

- provjerite je li automobil potpuno napunjen

- provjerite nije li automobil povezan s 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 stopama BAUD -a

- 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. Knjižnica MPU6050 za žiroskop

2. Izvor knjižnice I2CDev

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

/** * 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 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 = pogreška) uint16_t packetSize; // očekivana veličina paketa DMP (zadana vrijednost je 42 bajta) uint16_t fifoCount; // broj svih bajtova trenutno u FIFO uint8_t fifoBuffer [64]; // FIFO međuspremnik za pohranu Quaternion q; // [w, x, y, z] kvaterionski spremnik VectorFloat gravitacija; // [x, y, z] plovak gravitacijskog vektora ypr [3]; // [skretanje, nagib, kotrljanje] spremnik za skretanje/nagib/kotrljanje i vektor gravitacije hlapiva bool mpuInterrupt = false; // označava je li pin za prekid MPU -a otišao visoko

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 (); povratak; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, veličina paketa); fifoCount -= veličina paketa; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitacija, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); upravljati (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Prima kut 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 = karta (kut, 91, 180, 1, 60); } else if (kut 0) {resultSpeed = map (brzina, 0, 90, 0, 60); } else if (brzina <0) {resultSpeed = map (brzina, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (kut); 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 kut = karta (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int brzina = karta (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! Čeka prvi prekid … ")); packetSize = 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 uključivanja arduina, uključite i automobil. HC-05 modul trebao bi se spojiti na automobil, 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 drukčiji način pri nagibu ploče, najprije držite ploču u različitim smjerovima.

Kako radi:

Skica dobiva koordinate žiroskopa svakih 100 ms, vrši proračune i zatim putem Bluetootha prenosi naredbe automobila. Prvo postoji "upravljačka" metoda koja se poziva sa sirovim kutovima x, y i z. Ova metoda pretvara upravljanje između 0 i 180 stupnjeva i ubrzanje između -90 i 90. Ova metoda zahtijeva

void moveZwheelsCar (kut bajtova, int brzina) koji pretvara upravljanje i ubrzanje u ZenWheels specifikacije, a zatim prenosi naredbe putem Bluetootha.

Razlog zašto sam napravio transformaciju u dva koraka je ponovna upotreba. ako bih ovu skicu trebao prilagoditi daljinskom upravljaču nekim drugim uređajem, krenuo bih od osnovne metode "upravljanja" 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 spojite na HC-05 umjesto na "mikroautomobil".

Za dekodiranje naredbi morat ćete 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 će se bajt promijeniti, druga će se promijeniti. Nakon mnogih pokusa 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" modu, a python bluetooth knjižnica 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čeni: