Taula de continguts:
- Pas 1: components i eines
- Pas 2: Invertir l’enginyeria de l’aplicació ZenWheels per a Android [opcional]
- Pas 3: components
- Pas 4: Muntatge
- Pas 5: vinculeu el Bluetooth HC-05 amb el Microcar
- Pas 6: Codi i ús
- Pas 7: alternatives
Vídeo: Control remot piratejat per ZenWheels Microcar: 7 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:12
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
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
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:
IRduino: control remot Arduino: imiteu un control remot perdut: 6 passos
IRduino: control remot Arduino: imiteu un control remot perdut: si alguna vegada heu perdut el comandament a distància del vostre reproductor de TV o DVD, sabeu el frustrant que és haver d’anar, trobar i utilitzar els botons del propi dispositiu. De vegades, aquests botons ni tan sols ofereixen la mateixa funcionalitat que el comandament a distància. Rebre
Kit de control remot ordinari transformat en control remot de joguina RC de quatre canals: 4 passos
Kit de control remot ordinari transformat en control remot de joguina de quatre canals: control remot de joguina RC:改造 方法 非常 简单。 只需 准备 一些 瓦楞纸 板 , 然后 按照 视频 教程 这个 这个 电子 项目 并 为 您 服务 玩具 玩具 车船 提供 远程 无线 控制。
Controleu-vos els aparells elèctrics amb el vostre control remot de televisió (control remot ir) amb pantalla de temperatura i humitat: 9 passos
Controleu-vos els aparells elèctrics amb el vostre control remot de televisió (control remot ir) amb pantalla de temperatura i humitat: hola, sóc Abhay i és el meu primer bloc sobre Instructables i avui us mostraré com controlar els vostres electrodomèstics amb el vostre control remot de TV construint aquest projecte senzill. gràcies al laboratori atl per obtenir suport i proporcionar el material
Liberació del cable remot Olympus Evolt E510 (versió 2 amb enfocament automàtic al control remot): 6 passos (amb imatges)
Liberació del cable remot Olympus Evolt E510 (versió 2 amb enfocament automàtic al control remot): ahir vaig construir un comandament senzill amb un botó per al meu Olympus E510. La majoria de càmeres tenen un botó de disparador (el que premeu per fer una foto) que té dos modes. Si es prem el botó suaument, la càmera enfocarà automàticament i mesurarà la llum
Control remot remot: 11 passos (amb imatges)
Control remot a distància: tinc un nadó acabat de néixer i no creu que hagi de dormir el temps que la meva dona i jo també ho desitgem. Una cosa que el manté feliç al bressol és el mòbil que li penja. Així que quan es desperti si necessitem uns 25 minuts més o menys de sl