Taula de continguts:

Control remot piratejat per ZenWheels Microcar: 7 passos
Control remot piratejat per ZenWheels Microcar: 7 passos

Vídeo: Control remot piratejat per ZenWheels Microcar: 7 passos

Vídeo: Control remot piratejat per ZenWheels Microcar: 7 passos
Vídeo: Build Your Own Bluetooth Remote Control Car - Holiday Workshop for Kids 2024, Desembre
Anonim
Image
Image
muntatge
muntatge

En aquest tutorial crearem un comandament a distància personalitzat per al microcar ZenWheels. El microcar ZenWheels és un cotxe de joguina de 5 cm que es pot controlar mitjançant una aplicació Android o Iphone. Vaig a mostrar-vos com fer enginyeria inversa de l’aplicació Android per conèixer el protocol de comunicació i com podeu construir un control remot mitjançant arduino i un giroscopi.

Pas 1: components i eines

Parts:

1. El microcar ZenWheels

2. Arduino pro mini 328p

3. Taula de pa

4. Giroscopi MPU6050

5. font d'alimentació <= 5 v (una mica de bateria que podem connectar a la placa)

6. Cables de pont en forma d’U (opcional). He utilitzat aquests cables jumper perquè es veuen millor a la taula de treball. En el seu lloc es poden utilitzar cables de pont regular

7. Mòdul bluetooth HC-05 (amb un botó per accedir al mode AT)

Eines:

1. Adaptador FTDI USB a sèrie FT232RL per programar l'Arduino pro mini

2. ID Arduino

3. Telèfon Android

4. Android Studio [Opcional]

Pas 2: Invertir l’enginyeria de l’aplicació ZenWheels per a Android [opcional]

Es necessita un cert coneixement de Java i Android per entendre aquesta part.

L’objectiu del projecte és controlar el microcar mitjançant un giroscopi. Per a això, necessitem obtenir més informació sobre la comunicació bluetooth entre aquesta joguina i l'aplicació per a Android.

En aquest pas explicaré com fer un enginy invers del protocol de comunicació entre el microcar i l'aplicació per a Android. Si només voleu construir el comandament a distància, aquest pas no és necessari. Una manera de descobrir el protocol és mirar el codi font. Hmm, però això no és senzill, es compilen aplicacions per a Android i es pot instal·lar l'apk a través de Google Play.

Per tant, he fet una guia bàsica per fer-ho:

1. Descarregueu l'APK. Un paquet Android Kit (APK en breu) és el format de fitxer de paquet utilitzat pel sistema operatiu Android per distribuir i instal·lar aplicacions mòbils

Primer busqueu l'aplicació a Google Play Store, en el nostre cas cerqueu "zenwheels" i obtindreu l'enllaç de l'aplicació

A continuació, cerqueu a Google "descarregador d'apk en línia" i utilitzeu-ne un per descarregar l'apk. Normalment demanaran l’enllaç de l’aplicació (el que hem obtingut anteriorment), després premem un botó de descàrrega i el desem al nostre ordinador.

2. Descompileu l'APK. Un descompilador en la nostra situació és una eina que pren l'APK i produeix codi font Java.

La solució més senzilla és utilitzar un descompilador en línia per fer la feina. He cercat a Google "descomplidor en línia" i he triat https://www.javadecompilers.com/. Només cal que pengeu l’APK que heu obtingut anteriorment i

premeu la descompilació. A continuació, només heu de descarregar les fonts.

3. Intenteu fer enginyeria inversa mirant el codi

Per obrir el projecte necessiteu un editor de text o millor un IDE (entorn de desenvolupament integrat). L'IDE predeterminat per a Projectes d'Android és Android Studio (https://developer.android.com/studio). Després d’instal·lar Android Studio, obriu la carpeta del projecte.

Com que el nostre cotxe està controlat per bluetooth, vaig començar la meva cerca al codi descompilat amb la paraula clau "bluetooth", a partir de les ocurrències que he trobat que "BluetoothSerialService" estava al capdavant de la comunicació. Si aquesta classe gestiona la comunicació, ha de tenir un mètode d’ordre d’enviament. Resulta que hi ha un mètode d’escriptura que envia dades a través del canal bluetooth:

public void write (byte out)

Aquest és un bon començament, he cercat el.write (mètode que s’utilitza i hi ha una classe "ZenWheelsMicrocar" que amplia el nostre "BluetoothSerialService". Aquesta classe conté la major part de la lògica de la nostra comunicació per Bluetooth. L'altra part de la lògica es troba als controladors: BaseController i StandardController.

Al BaseController tenim la inicialització del servei, i també definicions dels canals de direcció i d’accelerador, els canals són de fet prefixos d’ordres per especificar que seguirà algun tipus d’ordre:

ZenWheelsMicrocar microcar protegit = nou ZenWheelsMicrocar (this, this.btHandler);

protecció ChannelOutput sortides = {nova TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), nova TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

Al controlador estàndard la direcció es maneja amb:

public void handleSteering (TouchEvent touchEvent) {

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

Analitzant el mètode, steeringOutput.channel té el valor 129 (canal utilitzat per a la direcció) i steeringOutput.resolveValue () pot tenir un valor entre -90 i 90. El valor del canal (129) s’envia directament i es modifica el valor de la direcció aplicant operacions a bits:

int final privat value_convert_out (valor int) {

negatiu booleà = fals; if (valor <0) {negatiu = f6D; } int valor2 = valor & 63; si (negatiu) {valor de retorn2 | 64; } valor de retorn2; }

Hi ha un mètode similar al StandardController anomenat

public void handleThrottle (TouchEvent touchEvent)

Pas 3: components

Parts:

1. Arduino pro mini 328p 2 $

2. Taula de pa

3. Giroscopi MPU6050 1,2 $

4. Mòdul esclau mestre-esclau HC-05 3 $

5. Paquet de 4 piles AA amb 4 piles

6. Cables de pont en forma d’U (opcional). He utilitzat aquests cables jumper perquè es veuen millor a la placa de configuració i els leds són més visibles d’aquesta manera. Si no teniu aquests cables, podeu substituir-los per cables dupont.

Els preus anteriors són extrets d'eBay.

Eines:

1. Adaptador USB a sèrie FTDI FT232RL per programar l'arduino pro mini

2. ID Arduino

3. Android Studio (opcional si voleu fer enginyeria inversa)

Pas 4: Muntatge

muntatge
muntatge

El muntatge és molt senzill perquè ho estem fent en una taula de treball:)

- primer col·loquem els nostres components a la taula de control: el microcontrolador, el mòdul bluetooth i el giroscopi

- Connecteu els pins HX-05 bluetooth RX i TX als arduino 10 i 11 pins. El giroscopi SDA i SCL s’haurien de connectar als pins arduino A4 i A5

- connecteu els pins d'alimentació al bluetooth, giroscopi i arduino. els pins han d’estar connectats al + i al lateral del tauler

- Connecteu per última vegada una font d'alimentació (entre 3,3 V i 5 V) a la placa, he utilitzat una petita bateria LiPo d'una cèl·lula, però qualsevol ho farà sempre que estigui dins del rang de potència

Consulteu les imatges anteriors per obtenir més informació

Pas 5: vinculeu el Bluetooth HC-05 amb el Microcar

Vinculeu el Bluetooth HC-05 amb el Microcar
Vinculeu el Bluetooth HC-05 amb el Microcar
Emparelleu el Bluetooth HC-05 amb el Microcar
Emparelleu el Bluetooth HC-05 amb el Microcar
Vinculeu el Bluetooth HC-05 amb el Microcar
Vinculeu el Bluetooth HC-05 amb el Microcar

Per a això, necessiteu un telèfon Android, el mòdul bluetooth HC-05 i l’adaptador FTDI de sèrie amb cables. També utilitzarem l'IDE Arduino per comunicar-nos amb el mòdul bluetooth.

Primer, hem d’esbrinar l’adreça bluetooth microcar:

- Activeu el bluetooth al telèfon

- Enceneu el cotxe i aneu a la secció Bluetooth de la vostra configuració a Android

- cerqueu dispositius nous i apareixerà algun dispositiu anomenat "Microcar"

- emparellar-lo amb aquest dispositiu

- A continuació, per extreure el MAC bluetooth, he utilitzat aquesta aplicació del terminal Bluetooth de sèrie de Google Play

Després d’instal·lar aquesta aplicació, aneu al menú -> dispositius i allà tindreu una llista amb tots els desenvolupaments emparellats per bluetooth. Només ens interessa que el codi que hi ha a sota de la mina "Microcar" sigui 00: 06: 66: 49: A0: 4B

A continuació, connecteu l'adaptador FTDI al mòdul bluetooth. Primer pins VCC i GROUND i després FTDI RX a TX Bluetooth i FTDI TX a Bluetooth RX. També hi hauria d’haver un pin al mòdul bluetooth que s’hauria de connectar al VCC. En fer-ho, el mòdul bluetooth entra en un "mode programable". El meu mòdul té un botó que connecta el VCC a aquest pin especial. Quan connecteu l'FTDI a l'USB, hauríeu de tenir el pin connectat / el botó premut per entrar en aquest mode programable especial. El bluetooth confirma l’entrada en aquest mode de funcionament parpellejant lentament cada 2 segons.

A l’IDE Arduino, seleccioneu el port sèrie i, a continuació, obriu el monitor sèrie (tant NL com CR amb una velocitat de 9600 baud). Escriviu AT i el mòdul hauria de confirmar-se amb "D'acord".

Escriviu "AT + ROLE = 1" per posar el mòdul en mode mestre. Per emparellar-lo amb el mòdul bluetooh, escriviu: "AT + BIND = 0006, 66, 49A04B", observeu com el nostre "00: 06: 66: 49: A0: 4B" es transforma en "0006, 66, 49A04B". Bé, hauríeu de fer la mateixa transformació per al vostre bluetooh MAC.

Ara engegueu el cotxe Zenwheels i desconnecteu el FTDI i torneu-lo a endollar sense que el botó premut / el pin especial connectat. Al cap d’un temps, s’hauria de connectar al cotxe i notareu que el cotxe produeix una connexió específica amb èxit.

Resolució de problemes:

- Vaig trobar que de tots els mòduls Bluetooth que tenia, només el que tenia un botó funcionava com a mestre.

- assegureu-vos que el cotxe estigui carregat completament

- assegureu-vos que el cotxe no estigui connectat al telèfon

- si el Bluetooth entra en mode AT (parpelleja lentament) però no respon a l'ordre, assegureu-vos que teniu TANT ELS NL com el CR, i també experimenteu amb altres taxes BAUD

- comproveu que el RX està connectat a TX i viceversa

- proveu aquest tutorial

Pas 6: Codi i ús

Primer heu de descarregar i instal·lar dues llibreries:

1. Biblioteca MPU6050 per al giroscopi

2. Font de la biblioteca I2CDev

A continuació, descarregueu i instal·leu la meva biblioteca des d’aquí o copieu-la des de baix:

/ ** * Biblioteques: * 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; byte const commandSpeed = 130;

inicialització bool = falsa; // defineix true si l'inici de DMP ha estat correcte

uint8_t mpuIntStatus; // manté el byte d'estat de la interrupció real de la MPU uint8_t devStatus; // torna l'estat després de cada operació del dispositiu (0 = èxit,! 0 = error) uint16_t paquetSize; // mida prevista del paquet DMP (per defecte és de 42 bytes) uint16_t fifoCount; // recompte de tots els bytes actualment a FIFO uint8_t fifoBuffer [64]; // Buffer d'emmagatzematge FIFO Quaternion q; // [w, x, y, z] contenidor de quaternió Gravetat VectorFloat; // [x, y, z] vector de gravetat flotant ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll container i gravity vector volatile bool mpuInterrupt = false; // indica si el pin d'interrupció de la MPU ha augmentat

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

configuració nul·la ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("S'ha iniciat el programa"); inicialització = initializeGyroscope (); }

bucle buit () {

if (! inicialització) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); tornar; } if (mpuIntStatus & 0x02) {while (fifoCount <packageetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount - = mida del paquet; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravetat, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); dirigeix (ypr [0] * 180 / M_PI, ypr [1] * 180 / M_PI, ypr [2] * 180 / M_PI); }}

/*

* Rep angle de 0 a 180 on 0 és màxim esquerre i 180 és màxim dret * Rep velocitat de -90 a 90 on -90 és màxim cap enrere i 90 és màxim cap endavant * / void moveZwheelsCar (angle de bytes, velocitat int) {if (millis () - lastMoveTime = 90) {resultAngle = mapa (angle, 91, 180, 1, 60); } else if (angle 0) {resultSpeed = mapa (velocitat, 0, 90, 0, 60); } else if (velocitat <0) {resultSpeed = mapa (velocitat, 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 (); }

buit de direcció (int x, int y, int z)

{x = restringir (x, -1 * MAX_ANGLE, MAX_ANGLE); y = restringir (y, -1 * MAX_ANGLE, MAX_ANGLE); z = restringir (z, -MAX_ANGLE, MAX_ANGLE); int angle = mapa (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int speed = map (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, angle, velocitat); moveZwheelsCar (angle, velocitat); }

void printDebug (int x, int y, int z, angle int, velocitat 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 initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("connexió MPU6050 correcta"): F ("connexió MPU6050 fallida")); 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 ("Activant detecció d'interrupcions (interrupció externa Arduino 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP llest! Esperant la primera interrupció … ")); = mpu.dmpGetFIFOPacketSize (); return true;}

void dmpDataReady ()

{mpuInterrupt = true; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Pengeu el codi amb l’adaptador FTDI a l’arduino i, a continuació, connecteu les bateries.

Ús del comandament a distància:

Després d’encendre l’arduino, també engegueu el cotxe. El mòdul HC-05 hauria de connectar-se al cotxe, quan això passi, el cotxe emetrà un so. Si no funciona, consulteu el pas anterior i la secció de resolució de problemes.

Si inclineu el tauler de control cap endavant, el cotxe hauria d’avançar cap a la dreta i el cotxe hauria de moure’s cap a la dreta. També realitza moviments més graduals com inclinar-se una mica cap endavant i una mica cap a l'esquerra, en aquest cas el cotxe aniria lentament cap a l'esquerra.

Si el cotxe va d'una altra manera quan s'inclina el tauler, manteniu-lo primer en diferents direccions.

Com funciona:

L'esbós obté les coordenades del giroscopi cada 100 ms, fa càlculs i després transmet per Bluetooth les ordres del cotxe. En primer lloc, hi ha un mètode "steer" que es diu amb els angles x, y i z en brut. Aquest mètode transforma la direcció entre 0 i 180 graus i l'acceleració entre -90 i 90. Aquest mètode crida

void moveZwheelsCar (angle de bytes, velocitat int) que converteix la direcció i l'acceleració a les especificacions de ZenWheels i, a continuació, transmet les ordres mitjançant bluetooth.

El motiu pel qual he fet la transformació en dos passos és la reutilització. si hagués d'adaptar aquest esbós al control remot d'algun altre dispositiu, començaria pel mètode base "steer" que ja assigna la velocitat i la direcció a alguns valors útils.

Pas 7: alternatives

Una alternativa a la "enginyeria inversa". He parlat de com fer enginyeria inversa del projecte començant per l'aplicació Android. Però hi ha una alternativa a això: podeu configurar un esclau Bluetooth FTDI + de sèrie (HC-05 normal sense especificar la configuració mestra). A continuació, des de l'aplicació ZenWheels connecteu-vos a l'HC-05 en lloc del "microcar".

Per descodificar les ordres, haureu de mantenir el volant en alguna posició i, a continuació, utilitzeu un script Python per analitzar la comunicació en sèrie. Us proposo un script Python perquè hi ha caràcters no imprimibles i Arduino IDE no és adequat per a això. Observareu que si manteniu la roda en una posició, l'aplicació transmetrà regularment els mateixos dos bytes. Si canvieu la posició de la roda, el primer byte seguirà igual, el segon canviarà. Després de molts assajos, podeu arribar a l'algoritme de direcció i, a continuació, accelerar l'enginyeria inversa, etc.

Una alternativa al comandament basat en arduino seria un comandament RaspberryPi. El raspberry pi té un mòdul bluetooth incrustat que no es pot configurar al mode "mestre" i la biblioteca bluetooth de pitó funciona com un encant. També són possibles alguns projectes més interessants com controlar el cotxe amb Alexa echo:)

Espero que us hagi agradat el projecte i, si us plau, deixeu comentaris a continuació.

Recomanat: