Cuprins:
- Pasul 1: Componente și instrumente
- Pasul 2: Inginerie inversă a aplicației Android ZenWheels [opțional]
- Pasul 3: Componente
- Pasul 4: Asamblare
- Pasul 5: Asociați Bluetooth HC-05 la Microcar
- Pasul 6: Cod și utilizare
- Pasul 7: alternative
Video: Telecomandă hackable pentru ZenWheels Microcar: 7 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:43
Î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
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
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:
Telecomanda TV devine o telecomandă RF -- NRF24L01 + Tutorial: 5 pași (cu imagini)
Telecomanda TV devine o telecomandă RF || Tutorial NRF24L01 +: În acest proiect vă voi arăta cum am folosit popularul IC nRF24L01 + RF pentru a regla luminozitatea unei benzi LED fără fir prin trei butoane inutile ale unei telecomenzi TV. Să începem
IRduino: telecomandă Arduino - Imitați o telecomandă pierdută: 6 pași
IRduino: Telecomandă Arduino - Imitați o telecomandă pierdută: Dacă ați pierdut vreodată telecomanda pentru televizor sau DVD player, știți cât de frustrant este să mergeți, să găsiți și să folosiți butoanele de pe dispozitivul însuși. Uneori, aceste butoane nici măcar nu oferă aceeași funcționalitate ca telecomanda. Primiți
Set de telecomandă obișnuit transformat în telecomandă cu jucărie RC cu patru canale: 4 pași
Kit de telecomandă obișnuit transformat în telecomandă RC cu patru canale pentru jucărie:改造 方法 非常 简单。 只需 准备 一些 瓦楞纸 板 , 然后 按照 视频 教程 这个 电子 项目 并 为 您 服务。 玩具 车船 提供 远程 无线 控制。
Convertiți telecomanda IR la telecomandă RF: 9 pași (cu imagini)
Convertiți telecomanda IR la telecomandă RF: În Instructable de astăzi, vă voi arăta cum puteți utiliza un modul RF generic fără microcontroler, ceea ce ne va conduce în cele din urmă la construirea unui proiect în care puteți converti o telecomandă IR a oricărui dispozitiv la un RF La distanta. Principalul avantaj al conversiei unui
Telecomandă pentru copii mici pentru video player pentru PC: 6 pași
Telecomandă video pentru copii mici pentru player video PC: Construiesc o telecomandă care se conectează la un computer cu USB. Telecomanda mare permite copilului meu să aleagă și să redea videoclipuri pe un computer vechi. Acesta este un proiect relativ simplu. Componenta de bază este fie o tastatură USB, fie o tastatură USB fără fir. Apoi