Cuprins:

Telecomandă hackable pentru ZenWheels Microcar: 7 pași
Telecomandă hackable pentru ZenWheels Microcar: 7 pași

Video: Telecomandă hackable pentru ZenWheels Microcar: 7 pași

Video: Telecomandă hackable pentru ZenWheels Microcar: 7 pași
Video: destroy a car in strongman style. #destroy #car #strongman #style 2024, Iunie
Anonim
Image
Image
Asamblare
Asamblare

În acest tutorial vom construi o telecomandă personalizată pentru microcarul ZenWheels. Micocarul ZenWheels este o mașină de jucărie de 5 cm care poate fi controlată printr-o aplicație Android sau Iphone. Vă voi arăta cum să faceți inginerie inversă a aplicației Android pentru a afla despre protocolul de comunicare și cum puteți construi o telecomandă folosind arduino și un giroscop.

Pasul 1: Componente și instrumente

Părți:

1. Microcarul ZenWheels

2. Arduino pro mini 328p

3. Pană de pâine

4. Giroscopul MPU6050

5. sursă de alimentare <= 5 v (o baterie pe care o putem atașa la panou)

6. Cabluri jumper în formă de U (opțional). Am folosit aceste cabluri jumper pentru că arată mai bine pe panou. Se pot folosi în schimb cabluri jumper obișnuite

7. Modul bluetooth HC-05 (cu buton pentru intrarea în modul AT)

Instrumente:

1. Adaptor USB la serial FTDI FT232RL pentru a programa Arduino pro mini

2. Arduino IDE

3. Telefon Android

4. Android Studio [Opțional]

Pasul 2: Inginerie inversă a aplicației Android ZenWheels [opțional]

Pentru a înțelege această parte sunt necesare anumite cunoștințe despre Java și Android.

Scopul proiectului este de a controla microcarul folosind un giroscop. Pentru aceasta, trebuie să aflăm mai multe despre comunicarea bluetooth între această jucărie și aplicația pentru Android.

În acest pas voi explica cum să ingineresc invers protocolul de comunicație între microcar și aplicația Android. Dacă doriți doar să construiți telecomanda, acest pas nu este necesar. O modalitate de a descoperi protocolul este să vă uitați la codul sursă. Hmm, dar acest lucru nu este simplu, aplicațiile Android sunt compilate și se poate instala apk-ul prin Google Play.

Așa că am făcut un ghid de bază pentru a face acest lucru:

1. Descărcați APK-ul. Un kit de pachete Android (APK pe scurt) este formatul de fișier de pachet utilizat de sistemul de operare Android pentru distribuirea și instalarea aplicațiilor mobile

Mai întâi căutați aplicația pe magazinul Google Play, în cazul nostru căutați „zenwheels” și veți obține linkul aplicației

Apoi căutați pe Google „descărcător de apk online” și folosiți unul pentru a descărca apk. De obicei, ei vor cere linkul aplicației (cel pe care l-am obținut anterior), apoi vom apăsa un buton de descărcare și îl vom salva în computerul nostru.

2. Descompilați APK-ul. Un decompilator în situația noastră este un instrument care preia APK-ul și produce cod sursă Java.

Cea mai simplă soluție este utilizarea unui decompilator online pentru a face treaba. Am căutat pe Google după „completare online” și am ales https://www.javadecompilers.com/. Trebuie doar să încărcați fișierul APK pe care l-ați obținut anterior și

apăsați pe decompilați. Apoi, trebuie doar să descărcați sursele.

3. Încercați să faceți inginerie inversă căutând prin cod

Pentru a deschide proiectul aveți nevoie de un editor de text sau mai bine de un IDE (mediu de dezvoltare integrat). IDE implicit pentru proiecte Android este Android Studio (https://developer.android.com/studio). După ce ați instalat Android Studio, deschideți folderul proiectului.

Deoarece mașina noastră este controlată de bluetooth, am început căutarea în codul decompilat cu cuvântul cheie „bluetooth”, din aparițiile pe care le-am găsit „BluetoothSerialService” era în controlul comunicării. Dacă această clasă gestionează comunicarea, atunci trebuie să aibă o metodă de comandă de trimitere. Se pare că există o metodă de scriere care trimite date prin canalul bluetooth:

public void write (octet out)

Acesta este un început bun, am căutat.write (metoda utilizată și există o clasă „ZenWheelsMicrocar” care extinde „BluetoothSerialService”. Această clasă conține cea mai mare parte a logicii comunicării noastre prin Bluetooth. Cealaltă parte a logica se află în controlere: BaseController și StandardController.

În BaseController avem inițializarea serviciului, precum și definiții ale canalelor de direcție și accelerație, canalele sunt de fapt prefixe de comandă pentru a specifica că va urma un anumit tip de comandă:

protejat ZenWheelsMicrocar microcar = new ZenWheelsMicrocar (this, this.btHandler);

protecție ChannelOutput ieșiri = {nou TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), nou TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

În StandardController direcția este manipulată în:

public void handleSteering (TouchEvent touchEvent) {

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

Analizând metoda, steeringOutput.channel are valoarea 129 (canalul utilizat pentru direcție) și steeringOutput.resolveValue () poate avea o valoare cuprinsă între -90 și 90. Valoarea canalului (129) este trimisă direct, iar valoarea direcției este modificată prin aplicarea operațiunilor în biți:

private final int value_convert_out (valoare int) {

negativ boolean = fals; if (valoare <0) {negativ = f6D; } int valoare2 = valoare & 63; if (negativ) {return value2 | 64; } returnare valoare2; }

Există o metodă similară în StandardController numită

mâner de gol public Throttle (TouchEvent touchEvent)

Pasul 3: Componente

Părți:

1. Arduino pro mini 328p 2 $

2. Pană de pâine

3. Giroscopul MPU6050 1,2 $

4. HC-05 master-slave modul cu 6 pini 3 $

5. 4 x baterii AA cu 4 baterii

6. Cabluri jumper în formă de U (opțional). Am folosit aceste cabluri jumper pentru că arată mai bine pe panou, iar ledurile sunt mai vizibile în acest fel. Dacă nu aveți aceste cabluri, le puteți înlocui cu fire dupont.

Prețurile de mai sus sunt preluate de pe eBay.

Instrumente:

1. Adaptor USB la serial FTDI FT232RL pentru a programa arduino pro mini

2. Arduino IDE

3. Android Studio (opțional dacă doriți să faceți inginerie inversă)

Pasul 4: Asamblare

Asamblare
Asamblare

Asamblarea este foarte simplă pentru că o facem pe o tablă de măsură:)

- mai întâi plasăm componentele noastre pe panoul de control: microcontrolerul, modulul bluetooth și giroscopul

- conectați pinii HC-05 bluetooth RX și TX la pinii arduino 10 și 11. Giroscopul SDA și SCL trebuie conectat la pinii arduino A4 și A5

- conectați pinii de alimentare la bluetooth, giroscop și arduino. pinii ar trebui conectați la + și - pe partea laterală a panoului

- Conectați ultima o sursă de alimentare (între 3,3V și 5V) la placa, am folosit o baterie mică LiPo cu o singură celulă, dar oricare va funcționa atâta timp cât este în gama de putere

Vă rugăm să verificați imaginile de mai sus pentru mai multe detalii

Pasul 5: Asociați Bluetooth HC-05 la Microcar

Asociați Bluetooth HC-05 la Microcar
Asociați Bluetooth HC-05 la Microcar
Asociați Bluetooth HC-05 la Microcar
Asociați Bluetooth HC-05 la Microcar
Asociați Bluetooth HC-05 la Microcar
Asociați Bluetooth HC-05 la Microcar

Pentru aceasta veți avea nevoie de un telefon Android, modulul bluetooth HC-05 și adaptorul serial FTDI cu fire. De asemenea, vom folosi Arduino IDE pentru a comunica cu modulul bluetooth.

Mai întâi trebuie să aflăm adresa microcar bluetooth:

- activați Bluetooth pe telefon

- porniți mașina și accesați secțiunea Bluetooth a setărilor dvs. din Android

- căutați dispozitive noi și ar trebui să apară un dispozitiv numit „Microcar”

- asociați cu acest dispozitiv

- Apoi, pentru a extrage MAC-ul Bluetooth, am folosit această aplicație de pe terminalul Google Serial Bluetooth Terminal

După instalarea acestei aplicații, accesați meniu -> dispozitive și acolo veți avea o listă cu toate dispozitivele Bluetooth asociate. Ne interesează doar codul de sub mina „Microcar” este 00: 06: 66: 49: A0: 4B

Conectați apoi adaptorul FTDI la modulul bluetooth. Mai întâi pinii VCC și GROUND și apoi FTDI RX la Bluetooth TX și FTDI TX la Bluetooth RX. De asemenea, ar trebui să existe un pin pe modulul bluetooth care să fie conectat la VCC. Procedând astfel, modulul bluetooth intră într-un „mod programabil”. Modulul meu are un buton care conectează VCC la acel pin special. Când conectați FTDI la USB, ar trebui să fie cu pinul conectat / butonul apăsat pentru a intra în acest mod programabil special. Bluetooth confirmă intrarea în acest mod de funcționare, intermitent lent la fiecare 2 secunde.

În Arduino IDE selectați portul serial, apoi deschideți monitorul serial (Atât NL, cât și CR cu 9600 baud rate). Tastați AT și modulul trebuie să confirme cu „OK”.

Tastați „AT + ROLE = 1” pentru a pune modulul în modul master. Pentru a asocia cu modulul bluetooh, scrieți: „AT + BIND = 0006, 66, 49A04B”, observați modul în care „00: 06: 66: 49: A0: 4B” este transformat în „0006, 66, 49A04B”. Ei bine, ar trebui să faceți aceeași transformare pentru MAC-ul dvs. bluetooh.

Acum porniți mașina Zenwheels, apoi deconectați FTDI și conectați-l din nou fără să apăsați butonul / pinul special conectat. După un timp, ar trebui să se conecteze la mașină și veți observa că mașina produce o conexiune specifică cu succes.

Depanare:

- Am constatat că din toate modulele Bluetooth pe care le aveam, doar cel cu buton funcționa ca master!

- asigurați-vă că mașina este încărcată complet

- asigurați-vă că mașina nu este conectată la telefon

- dacă Bluetooth intră în modul AT (clipește încet), dar nu răspunde la comandă, asigurați-vă că aveți AMBE NL și CR și experimentați și cu alte rate BAUD

- verificați de două ori dacă RX este conectat la TX și invers

- încercați acest tutorial

Pasul 6: Cod și utilizare

Mai întâi trebuie să descărcați și să instalați două biblioteci:

1. Biblioteca MPU6050 pentru giroscop

2. Sursa bibliotecii I2CDev

Apoi descărcați și instalați biblioteca de aici sau copiați-o de mai jos:

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

initializare bool = falsa; // setați true dacă inițierea DMP a reușit

uint8_t mpuIntStatus; // deține octetul actual de stare de întrerupere de la MPU uint8_t devStatus; // returnează starea după fiecare operație a dispozitivului (0 = succes,! 0 = eroare) uint16_t pachet Dimensiune; // dimensiunea așteptată a pachetului DMP (implicit este de 42 de octeți) uint16_t fifoCount; // numărul tuturor octeților aflați în prezent în FIFO uint8_t fifoBuffer [64]; // buffer de stocare FIFO Quaternion q; // [w, x, y, z] cuaternion container VectorFloat gravity; // [x, y, z] vector de gravitație float ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll container and gravity vector volatile bool mpuInterrupt = false; // indică dacă pinul de întrerupere MPU a crescut

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

configurare nulă ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println („Programul a început”); initialization = initializeGyroscope (); }

bucla nulă () {

if (! initializare) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); întoarcere; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, pachet Dimensiune); fifoCount - = pachet Dimensiune; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitate, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); steer (ypr [0] * 180 / M_PI, ypr [1] * 180 / M_PI, ypr [2] * 180 / M_PI); }}

/*

* Primește unghiul de la 0 la 180 unde 0 este maxim stânga și 180 este maxim dreapta * Primește viteza de la -90 la 90 unde -90 este maxim înapoi și 90 este maxim înainte * / deplasare nulă ZwheelsCar (unghi de octeți, viteză int) {if (millis () - lastMoveTime = 90) {resultAngle = hartă (unghi, 91, 180, 1, 60); } else if (unghiul 0) {resultSpeed = hartă (viteză, 0, 90, 0, 60); } else if (viteză <0) {resultSpeed = hartă (viteză, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (unghi); Serial.print (";"); Serial.print ("actualSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((octet) resultSpeed); lastMoveTime = millis (); }

void sterge (int x, int y, int z)

{x = constrain (x, -1 * MAX_ANGLE, MAX_ANGLE); y = constrângere (y, -1 * MAX_ANGLE, MAX_ANGLE); z = constrângere (z, -MAX_ANGLE, MAX_ANGLE); int angle = hartă (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int speed = hartă (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, unghi, viteză); moveZwheelsCar (unghi, viteză); }

void printDebug (int x, int y, int z, unghi int, viteză int)

{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 initializeGroscop ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("conexiunea MPU6050 reușită"): F ("conexiunea MPU6050 a eșuat")); 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 ("Activare detectare întrerupere (întrerupere externă Arduino 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP gata! Se așteaptă prima întrerupere … ")); = mpu.dmpGetFIFOPacketSize (); return true;}

void dmpDataReady ()

{mpuInterrupt = adevărat; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Încărcați codul folosind adaptorul FTDI pe arduino, apoi conectați bateriile.

Utilizarea telecomenzii:

După pornirea arduino-ului, porniți și mașina. Modulul HC-05 ar trebui să se conecteze la mașină, atunci când acest lucru se întâmplă, mașina va emite un sunet. Dacă nu funcționează, vă rugăm să verificați pasul anterior și secțiunea de depanare.

Dacă înclinați panoul de control înainte, mașina ar trebui să meargă înainte, spre dreapta, iar mașina ar trebui să se deplaseze spre dreapta. De asemenea, efectuează mișcări mai treptate, cum ar fi înclinarea puțin înainte și puțin stânga, în acest caz, mașina ar merge încet spre stânga.

Dacă mașina merge într-un mod diferit atunci când înclinați panoul, țineți-l mai întâi în direcții diferite.

Cum functioneaza:

Schița obține coordonatele giroscopului la fiecare 100 ms, face calcule și apoi transmite prin bluetooth comenzile mașinii. Mai întâi există o metodă „direcționată” care este apelată cu unghiurile x, y și z brute. Această metodă transformă direcția între 0 și 180 de grade și accelerația între -90 și 90. Această metodă apelează

void moveZwheelsCar (unghi de octeți, viteză int) care convertește direcția și accelerația la specificațiile ZenWheels și apoi transmite comenzile utilizând bluetooth.

Motivul pentru care am făcut transformarea în doi pași este reutilizarea. dacă aș avea nevoie să adaptez această schiță la telecomandă pentru un alt dispozitiv, aș începe de la metoda de bază „direcționare” care deja mapează viteza și direcția la unele valori utile.

Pasul 7: alternative

O alternativă la „ingineria inversă”. Am vorbit despre cum să inginerim invers proiectul începând cu aplicația Android. Dar există o alternativă la aceasta, puteți configura un slave FTDI + bluetooth serial (HC-05 obișnuit fără a specifica setările master). Apoi, din aplicația ZenWheels conectați-vă la HC-05 în loc de „microcar”.

Pentru a decoda comenzile, va trebui să țineți volanul într-o anumită poziție, apoi, utilizând un script python, analizați comunicarea în serie. Vă sugerez un script python, deoarece există caractere care nu se pot printa, iar Arduino IDE nu este potrivit pentru asta. Veți observa că, dacă țineți roata într-o poziție, aplicația va transmite în mod regulat aceiași doi octeți. Dacă modificați poziția roții, octetul pumnului va rămâne același, al doilea se va schimba. După multe încercări, puteți veni cu algoritmul de direcție, apoi accelerația de inginerie inversă etc.

O alternativă la telecomanda bazată pe arduino ar fi o telecomandă RaspberryPi. Raspberry pi are un modul bluetooth încorporat, care este nedureros de configurat în modul „master”, iar biblioteca bluetooth python funcționează ca un farmec. De asemenea, sunt posibile câteva proiecte mai interesante, cum ar fi controlul mașinii folosind Alexa echo:)

Sper că v-a plăcut proiectul și vă rog să lăsați comentarii mai jos!

Recomandat: