Tabla de contenido:

Control remoto pirateable para ZenWheels Microcar: 7 pasos
Control remoto pirateable para ZenWheels Microcar: 7 pasos

Video: Control remoto pirateable para ZenWheels Microcar: 7 pasos

Video: Control remoto pirateable para ZenWheels Microcar: 7 pasos
Video: RMS TITANIC | Trumpeter 1/200 RC TITANIC | MN86KS G500 2024, Noviembre
Anonim
Image
Image
Montaje
Montaje

En este tutorial vamos a construir un control remoto personalizado para el microcoche ZenWheels. El microcoche ZenWheels es un coche de juguete de 5 cm que se puede controlar a través de una aplicación de Android o Iphone. Voy a mostrarte cómo aplicar ingeniería inversa a la aplicación de Android para conocer el protocolo de comunicación y cómo puedes construir un control remoto usando arduino y un giroscopio.

Paso 1: Componentes y herramientas

Partes:

1. El microcoche ZenWheels

2. Arduino pro mini 328p

3. Tablero de pruebas

4. Giroscopio MPU6050

5. fuente de alimentación <= 5 v (algo de batería que podemos conectar a la placa)

6. Cables de puente en forma de U (opcional). He usado estos cables de puente porque se ven mejor en la placa de pruebas. En su lugar, se pueden utilizar cables de puente normales

7. Módulo bluetooth HC-05 (con un botón para ingresar al modo AT)

Instrumentos:

1. Adaptador FTDI FT232RL de USB a serie para programar el Arduino pro mini

2. IDE de Arduino

3. Teléfono Android

4. Android Studio [opcional]

Paso 2: Ingeniería inversa de la aplicación de Android ZenWheels [opcional]

Se requieren algunos conocimientos de Java y Android para comprender esta parte.

El objetivo del proyecto es controlar el microcoche mediante un giroscopio. Para ello, necesitamos obtener más información sobre la comunicación bluetooth entre este juguete y la aplicación de Android.

En este paso, explicaré cómo aplicar ingeniería inversa al protocolo de comunicación entre el microcoche y la aplicación de Android. Si solo desea construir el control remoto, este paso no es necesario. Una forma de descubrir el protocolo es mirar el código fuente. Hmm, pero esto no es sencillo, las aplicaciones de Android se compilan y se puede instalar el apk a través de Google Play.

Así que hice una guía básica para hacer esto:

1. Descarga el APK. Un kit de paquete de Android (APK para abreviar) es el formato de archivo de paquete utilizado por el sistema operativo Android para la distribución e instalación de aplicaciones móviles.

Primero busque la aplicación en google play store, en nuestro caso busque "zenwheels" y obtendrá el enlace de la aplicación

Luego busque en Google "descargador de apk en línea" y use uno para descargar el apk. Por lo general, pedirán el enlace de la aplicación (el que obtuvimos anteriormente), luego presionaremos un botón de descarga y lo guardaremos en nuestra computadora.

2. Descompile el APK. Un descompilador en nuestra situación es una herramienta que toma el APK y produce el código fuente de Java.

La solución más simple es utilizar un descompilador en línea para hacer el trabajo. He buscado en Google "descomplilador en línea" y he elegido https://www.javadecompilers.com/. Solo necesita cargar el APK que obtuvo anteriormente y

presione el descompilar. Luego, simplemente descargue las fuentes.

3. Intente realizar ingeniería inversa mirando el código

Para abrir el proyecto necesita un editor de texto o mejor un IDE (entorno de desarrollo integrado). El IDE predeterminado para proyectos de Android es Android Studio (https://developer.android.com/studio). Una vez que hayas instalado Android Studio, abre la carpeta del proyecto.

Debido a que nuestro automóvil está controlado por bluetooth, comencé mi búsqueda en el código descompilado con la palabra clave "bluetooth", a partir de las ocurrencias, encontré que "BluetoothSerialService" estaba a cargo de la comunicación. Si esta clase maneja la comunicación, entonces debe tener un método de comando de envío. Resulta que hay un método de escritura que envía datos a través del canal bluetooth:

escritura vacía pública (byte fuera)

Este es un buen comienzo, he buscado el método.write (que se está utilizando y hay una clase "ZenWheelsMicrocar" que extiende nuestro "BluetoothSerialService". Esta clase contiene la mayor parte de la lógica de nuestra comunicación a través de Bluetooth. La otra parte de la lógica está en los controladores: BaseController y StandardController.

En el BaseController tenemos la inicialización del servicio, y también las definiciones de los canales de dirección y aceleración, los canales son de hecho prefijos de comando para especificar que seguirá algún tipo de comando:

Microcar ZenWheelsMicrocar protegido = nuevo ZenWheelsMicrocar (this, this.btHandler);

Salidas de ChannelOutput protegidas = {nueva TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), nueva TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

En StandardController, la dirección se maneja en:

public void handleSteering (TouchEvent touchEvent) {

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

Analizando el método, el directionOutput.channel tiene el valor 129 (canal utilizado para la dirección) y la directionOutput.resolveValue () puede tener un valor entre -90 y 90. El valor del canal (129) se envía directamente y el valor de la dirección se modifica aplicando operaciones bit a bit:

privado final int value_convert_out (int valor) {

booleano negativo = falso; si (valor <0) {negativo = f6D; } int valor2 = valor & 63; if (negativo) {valor devuelto2 | 64; } return value2; }

Hay un método similar en StandardController llamado

manija de vacío público Acelerador (TouchEvent touchEvent)

Paso 3: componentes

Partes:

1. Arduino pro mini 328p 2 $

2. Tablero de pruebas

3. Giroscopio MPU6050 1,2 $

4. Módulo 3 de 6 pines maestro-esclavo HC-05 $

5. Paquete de 4 pilas AA con 4 pilas

6. Cables de puente en forma de U (opcional). He usado estos cables de puente porque se ven mejor en la placa de pruebas y los leds son más visibles de esta manera. Si no tiene estos cables, puede reemplazarlos con cables dupont.

Los precios anteriores se han obtenido de eBay.

Instrumentos:

1. Adaptador FTDI FT232RL de USB a serie para programar el arduino pro mini

2. IDE de Arduino

3. Android Studio (opcional si desea realizar ingeniería inversa usted mismo)

Paso 4: Montaje

Montaje
Montaje

El montaje es muy sencillo porque lo estamos haciendo en una protoboard:)

- primero colocamos nuestros componentes en la placa de pruebas: el microcontrolador, el módulo bluetooth y el giroscopio

- conecte los pines HC-05 bluetooth RX y TX a arduino 10 y 11 pines. El giroscopio SDA y SCL deben estar conectados a los pines arduino A4 y A5

- conecte los pines de alimentación al bluetooth, giroscopio y arduino. los pines deben estar conectados a + y - en el costado de la placa de pruebas

- Por último, conecte una fuente de alimentación (entre 3.3V a 5V) a la placa de prueba, he usado una pequeña batería de una celda de LiPo, pero cualquiera servirá siempre que esté en el rango de potencia

Por favor, consulte las imágenes de arriba para obtener más detalles.

Paso 5: empareja el HC-05 Bluetooth con el Microcar

Empareje el HC-05 Bluetooth con el Microcar
Empareje el HC-05 Bluetooth con el Microcar
Empareje el HC-05 Bluetooth con el Microcar
Empareje el HC-05 Bluetooth con el Microcar
Empareje el HC-05 Bluetooth con el Microcar
Empareje el HC-05 Bluetooth con el Microcar

Para ello necesitará un teléfono Android, el módulo bluetooth HC-05 y el adaptador FTDI serie con cables. También usaremos el IDE de Arduino para comunicarnos con el módulo bluetooth.

Primero tenemos que averiguar la dirección de bluetooth del microcoche:

- habilita bluetooth en tu teléfono

- encienda el automóvil y vaya a la sección de bluetooth de su configuración en Android

- busque nuevos dispositivos y debería aparecer algún dispositivo llamado "Microcar"

- emparejar con este dispositivo

- luego para extraer el bluetooth MAC, he usado esta aplicación de Google Play Serial Bluetooth Terminal

Después de instalar esta aplicación, vaya al menú -> dispositivos y allí tendrá una lista con todos los dispositivos emparejados por bluetooth. Solo nos interesa el código debajo de la mina "Microcar" que es 00: 06: 66: 49: A0: 4B

A continuación, conecte el adaptador FTDI al módulo bluetooth. Primero los pines VCC y GROUND y luego FTDI RX a bluetooth TX y FTDI TX a bluetooth RX. También debe haber un pin en el módulo bluetooth que debe estar conectado al VCC. Al hacer esto, el módulo bluetooth entra en un "modo programable". Mi módulo tiene un botón que conecta el VCC a ese pin especial. Cuando conecte el FTDI al USB, debe estar con el pin conectado / botón presionado para ingresar en este modo programable especial. El bluetooth confirma la entrada en este modo de funcionamiento parpadeando lentamente cada 2 segundos.

En el IDE de Arduino, seleccione el puerto serie, luego abra el monitor serie (tanto NL como CR con 9600 baudios). Escriba AT y el módulo debe confirmar con "OK".

Escriba "AT + ROLE = 1" para poner el módulo en modo maestro. Para emparejar con su módulo bluetooh, escriba: "AT + BIND = 0006, 66, 49A04B". Observe cómo nuestro "00: 06: 66: 49: A0: 4B" se transforma en "0006, 66, 49A04B". Bueno, deberías hacer la misma transformación para tu MAC bluetooh.

Ahora encienda el automóvil Zenwheels, luego desenchufe el FTDI y vuelva a enchufarlo sin el botón presionado / pin especial conectado. Después de un tiempo, debería conectarse al automóvil y notará que el automóvil hace una conexión específica con un sonido exitoso.

Solución de problemas:

- ¡Descubrí que de todos los módulos Bluetooth que tenía, solo el que tenía un botón funcionaba como maestro!

- asegúrese de que el automóvil esté completamente cargado

- asegúrese de que el automóvil no esté conectado al teléfono

- si el Bluetooth entra en el modo AT (parpadea lentamente) pero no responde al comando, asegúrese de tener AMBOS NL y CR, y también experimente con otras velocidades de BAUD.

- verifique que el RX esté conectado a TX y viceversa

- prueba este tutorial

Paso 6: Código y uso

Primero necesitas descargar e instalar dos bibliotecas:

1. Biblioteca MPU6050 para el giroscopio

2. Fuente de la biblioteca I2CDev

Luego descargue e instale mi biblioteca desde aquí o cópiela desde abajo:

/ ** * Bibliotecas: * https://github.com/jrowberg/i2cdevlib * https://github.com/jrowberg/i2cdevlib * / #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h "#incluir" SoftwareSerial.h"

const int MAX_ANGLE = 45;

const byte commandStering = 129; const byte commandSpeed = 130;

inicialización bool = falso; // establecer verdadero si DMP init fue exitoso

uint8_t mpuIntStatus; // contiene el byte de estado de interrupción actual de MPU uint8_t devStatus; // devuelve el estado después de cada operación del dispositivo (0 = éxito,! 0 = error) uint16_t packetSize; // tamaño esperado del paquete DMP (el valor predeterminado es 42 bytes) uint16_t FIFoCount; // recuento de todos los bytes actualmente en FIFO uint8_t fifoBuffer [64]; // Búfer de almacenamiento FIFO Quaternion q; // [w, x, y, z] contenedor de cuaterniones VectorFloat gravity; // [x, y, z] vector de gravedad float ypr [3]; // [guiñada, cabeceo, balanceo] guiñada / cabeceo / balanceo contenedor y vector de gravedad volátil bool mpuInterrupt = false; // indica si el pin de interrupción de MPU se ha elevado

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

configuración vacía ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Programa iniciado"); inicialización = initializeGyroscope (); }

bucle vacío () {

if (! inicialización) {retorno; } mpuInterrupt = falso; mpuIntStatus = mpu.getIntStatus (); FifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, FifoCount)) {mpu.resetFIFO (); regreso; } if (mpuIntStatus & 0x02) {while (FifoCount <tamaño del paquete) {FifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (FifoBuffer, packetSize); FifoCount - = tamaño del paquete; mpu.dmpGetQuaternion (& q, FIFoBuffer); mpu.dmpGetGravity (& gravedad, & q); mpu.dmpGetYawPitchRoll (ypr, & q y gravedad); novillo (ypr [0] * 180 / M_PI, ypr [1] * 180 / M_PI, ypr [2] * 180 / M_PI); }}

/*

* Recibe un ángulo de 0 a 180 donde 0 es el máximo a la izquierda y 180 es el máximo a la derecha * Recibe la velocidad de -90 a 90 donde -90 es el máximo hacia atrás y 90 es el máximo hacia adelante * / void moveZwheelsCar (ángulo de bytes, velocidad int) {if (millis () - lastMoveTime = 90) {resultAngle = map (ángulo, 91, 180, 1, 60); } else if (ángulo 0) {resultSpeed = map (velocidad, 0, 90, 0, 60); } else if (velocidad <0) {resultSpeed = map (velocidad, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (ángulo); Serial.print (";"); Serial.print ("actualSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (comandoStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((byte) resultSpeed); lastMoveTime = millis (); }

dirección vacía (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, -ÁNGULO_MAX, ÁNGULO_MAX); int ángulo = mapa (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int speed = map (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, ángulo, velocidad); moveZwheelsCar (ángulo, velocidad); }

vacío printDebug (int x, int y, int z, int ángulo, int velocidad)

{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 ("ángulo ="); Serial.print (ángulo); Serial.print (";"); Serial.print ("velocidad ="); Serial.print (velocidad); Serial.println (";"); lastPrintTime = millis (); }

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Conexión MPU6050 exitosa"): F ("Error de conexión MPU6050")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("Error al inicializar DMP (código")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Habilitar detección de interrupciones (interrupción externa Arduino 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP listo! Esperando la primera interrupción … ")); packetSize = mpu.dmpGetFIFOPacketSize (); devuelve verdadero;}

void dmpDataReady ()

{mpuInterrupt = verdadero; }

booleano hasFifoOverflown (int mpuIntStatus, int FIFoCount)

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

Cargue el código usando el adaptador FTDI al arduino y luego conecte las baterías.

Usando el control remoto:

Después de encender el arduino, también encienda el automóvil. El módulo HC-05 debe conectarse al automóvil, cuando eso suceda, el automóvil emitirá un sonido. Si no funciona, consulte el paso anterior y la sección de solución de problemas.

Si inclina la placa de pruebas hacia adelante, el automóvil debe moverse hacia adelante, hacia la derecha y el automóvil debe moverse hacia la derecha. También realiza movimientos más graduales como inclinarse un poco hacia delante y un poco hacia la izquierda, en este caso el coche iría lentamente hacia la izquierda.

Si el automóvil va de una manera diferente al inclinar la placa de pruebas, primero sostenga la placa de pruebas en diferentes direcciones.

Cómo funciona:

El boceto obtiene las coordenadas del giroscopio cada 100 ms, realiza cálculos y luego transmite por bluetooth los comandos del automóvil. Primero hay un método de "dirección" que se llama con los ángulos x, y y z brutos. Este método transforma la dirección entre 0 y 180 grados y la aceleración entre -90 y 90. Este método llama

void moveZwheelsCar (ángulo de bytes, velocidad int) que convierte la dirección y la aceleración a las especificaciones de ZenWheels y luego transmite los comandos usando bluetooth.

La razón por la que hice la transformación en dos pasos es la reutilización. si tuviera que adaptar este boceto para controlar a distancia algún otro dispositivo, comenzaría con el método básico "dirigir" que ya asigna la velocidad y la dirección a algunos valores útiles.

Paso 7: Alternativas

Una alternativa a la "ingeniería inversa". He hablado sobre cómo realizar ingeniería inversa en el proyecto comenzando con la aplicación de Android. Pero hay una alternativa a esto: puede configurar un esclavo bluetooth FTDI + en serie (HC-05 normal sin especificar la configuración maestra). Luego, desde la aplicación ZenWheels, conéctese al HC-05 en lugar del "microcoche".

Para decodificar los comandos, deberá mantener el volante en alguna posición y luego, utilizando un script de Python, analice la comunicación en serie. Estoy sugiriendo un script de Python porque hay caracteres no imprimibles y Arduino IDE no es adecuado para eso. Observará que si mantiene la rueda en una posición, la aplicación transmitirá regularmente los mismos dos bytes. Si varía la posición de la rueda, el primer byte permanecerá igual y el segundo cambiará. Después de muchas pruebas, puede crear el algoritmo de dirección, luego aplicar ingeniería inversa al acelerador, etc.

Una alternativa al control remoto basado en arduino sería un control remoto RaspberryPi. La raspberry pi tiene un módulo bluetooth integrado que es fácil de configurar en el modo "maestro" y la biblioteca de bluetooth de Python funciona a la perfección. También son posibles algunos proyectos más interesantes como controlar el automóvil usando Alexa echo:)

Espero que hayas disfrutado del proyecto y deja tus comentarios a continuación.

Recomendado: