Construye un Robot Controlado por Gestos en Casa con Arduino y MPU-6050
Componentes y Suministros
- Arduino UNO × 1
- Arduino Nano R3 × 1
- Módulo Bluetooth HC-05 × 2
- Acelerómetro y Giroscopio Triple Eje MPU-6050 (SparkFun) × 1
- Motor DC 12V × 2
- Ruedas de goma × 1
- Driver Motor Dual H-Bridge L293D (Texas Instruments) × 1
- Batería 9V (genérica) × 2
Herramientas y Máquinas Necesarias
- Soldador (genérico)
- Hilo de soldar, sin plomo
- Cinta de espuma
- Multiusos, Destornillador
Aplicaciones y Servicios Online
- Arduino IDE
Sobre este Proyecto
Este proyecto trata sobre cómo hacer un coche controlado por gestos por ti mismo. Básicamente es una aplicación simple del MPU-6050 giroscopio/acelerómetro de 3 ejes. Puedes hacer muchas más cosas entendiendo cómo usarlo, cómo interconectarlo con Arduino y cómo transferir sus datos por módulos Bluetooth. En esta guía me centraré en la comunicación Bluetooth a Bluetooth entre dos módulos HC-05.
Sigue el vídeo para construir el cuerpo del robot y las conexiones.
Configuración de Módulos Bluetooth
Los módulos HC-05 vienen de fábrica como esclavos. Para enviar datos desde el módulo a otro dispositivo, necesitamos configurar uno como maestro y otro como esclavo para que se emparejen automáticamente al encender.
Configurar Primer Módulo como Esclavo (Unidad Coche)
- Conecta el módulo al Arduino según el diagrama de cableado.
- Sube el código "configure" (incluye SoftwareSerial para comunicación AT).
- Desconecta el módulo. Mantén pulsado el botón del módulo y conéctalo de nuevo. El LED parpadeará lento (cada 2 segundos) = modo AT.
- Abre Monitor Serie a 9600 baudios, NL & CR. Envía "AT" → debe responder "OK".
- Envía comandos AT en secuencia:
AT+ORGL- Configuración de fábricaAT+RMAAD- Liberar emparejamientos previosAT+UART?- Ver baudrate actualAT+UART=38400,0,0- Establecer baudrate 38400AT+ROLE?- Ver rol (0=esclavo, 1=maestro)AT+ROLE=0- Establecer como esclavoAT+ADDR?- Obtener dirección MAC del módulo (anótala)
Configurar Segundo Módulo como Maestro (Unidad Remota)
- Conecta el segundo módulo al Arduino y ponlo en modo AT (mantén botón al conectar).
- Envía comandos AT:
AT+ORGL,AT+RMAAD,AT+UART?,AT+UART=38400,0,0AT+ROLE=1- Establecer como maestroAT+CMODE=0- Conectar solo a un dispositivoAT+BIND="dirección_del_esclavo"- Vincular con el módulo esclavo
Librerías y Código Fuente
Instala librerías para MPU-6050 e I2C. Descarga librerías y código fuente desde: https://www.mediafire.com/file/l8mru5emulb8x93/gesture_control_robot.rar/file
Subir Programas
- Conecta unidad coche via USB. Selecciona puerto COM y placa correcta. Sube programa "Gesture_controled_Robot__car_unit_". Asegúrate que batería y Bluetooth NO estén conectados al coche al subir el programa.
- Haz lo mismo con la unidad remota. Sube programa "remote".
Código: Unidad Coche (Receptor)
// Programa por Shubham Shinganapure 3-10-2019
// Para Coche Robótico Controlado por Gestos
int lm1=8, lm2=9, rm1=10, rm2=11;
char d=0;
void setup() {
pinMode(lm1,OUTPUT); pinMode(lm2,OUTPUT);
pinMode(rm1,OUTPUT); pinMode(rm2,OUTPUT);
Serial.begin(38400);
sTOP();
}
void loop() {
if(Serial.available()>0) {
d=Serial.read();
if(d=='F') ForWard();
if(d=='B') BackWard();
if(d=='L') Left();
if(d=='R') Right();
if(d=='S') sTOP();
}
}
void ForWard() { digitalWrite(lm1,HIGH); digitalWrite(lm2,LOW); digitalWrite(rm1,HIGH); digitalWrite(rm2,LOW); }
void BackWard() { digitalWrite(lm1,LOW); digitalWrite(lm2,HIGH); digitalWrite(rm1,LOW); digitalWrite(rm2,HIGH); }
void Left() { digitalWrite(lm1,LOW); digitalWrite(lm2,HIGH); digitalWrite(rm1,HIGH); digitalWrite(rm2,LOW); }
void Right() { digitalWrite(lm1,HIGH); digitalWrite(lm2,LOW); digitalWrite(rm1,LOW); digitalWrite(rm2,HIGH); }
void sTOP() { digitalWrite(lm1,LOW); digitalWrite(lm2,LOW); digitalWrite(rm1,LOW); digitalWrite(rm2,LOW); }
Código: Unidad Remota (Transmisor con MPU-6050)
// Programa modificado 3/10/19 por Shubham Shinganapure
// Para Coche Robótico Controlado por Gestos (Remoto)
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL
bool dmpReady = false;
uint8_t mpuIntStatus, devStatus;
uint16_t packetSize, fifoCount;
uint8_t fifoBuffer[64];
VectorFloat gravity;
Quaternion q;
float ypr[3];
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };
volatile bool mpuInterrupt = false;
void dmpDataReady() { mpuInterrupt = true; }
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX | TX
int bt=8;
int x =1;
void setup() {
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin(); TWBR = 24;
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
Serial.begin(115200);
BTSerial.begin(38400);
Serial.println(F("Inicializando dispositivos I2C..."));
mpu.initialize();
Serial.println(F("Probando conexiones..."));
Serial.println(mpu.testConnection() ? F("MPU6050 conexión exitosa") : F("MPU6050 conexión fallida"));
Serial.println(F("Inicializando DMP..."));
devStatus = mpu.dmpInitialize();
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788);
if (devStatus == 0) {
Serial.println(F("Habilitando DMP..."));
mpu.setDMPEnabled(true);
Serial.println(F("Habilitando detección interrupción..."));
attachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
Serial.println(F("DMP listo! Esperando primera interrupción..."));
dmpReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
} else {
Serial.print(F("Fallo inicialización DMP (código "));
Serial.print(devStatus);
Serial.println(F(")"));
}
pinMode(bt,INPUT);
}
void loop() {
if(digitalRead(bt)==HIGH) { x++; delay(150); }
if((x%2)==0){
if (!dmpReady) return;
while (!mpuInterrupt && fifoCount < packetSize) {}
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();
fifoCount = mpu.getFIFOCount();
if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
mpu.resetFIFO();
Serial.println(F("Desbordamiento FIFO!"));
} else if (mpuIntStatus & 0x02) {
while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
mpu.getFIFOBytes(fifoBuffer, packetSize);
fifoCount -= packetSize;
#ifdef OUTPUT_READABLE_YAWPITCHROLL
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
Serial.print("ypr\t");
Serial.print(ypr[0] * 180/M_PI); Serial.print("\t");
Serial.print(ypr[1] * 180/M_PI); Serial.print("\t");
Serial.println(ypr[2] * 180/M_PI);
if((ypr[1] * 180/M_PI) <= -25) { BTSerial.write('F'); }
else if((ypr[1] * 180/M_PI) >= 25) { BTSerial.write('B'); }
else if((ypr[2] * 180/M_PI) <= -25) { BTSerial.write('L'); }
else if((ypr[2] * 180/M_PI) >= 20) { BTSerial.write('R'); }
else { BTSerial.write('S'); }
#endif
}
} else {
BTSerial.write('S');
}
}
Inserta el módulo Bluetooth esclavo en la unidad coche y el maestro en la unidad remota. ¡Enciende y listo para jugar!
Espero que esto te sea útil. Si te gusta, dale a like, compártelo, comenta tus dudas. Para más proyectos, ¡sígueme! Apoya mi trabajo y suscríbete a mi canal de YouTube. ¡Gracias!
Esquemáticos
Diagrama de conexiones disponible en el proyecto original (imagen PNG).
Proceso de manufactura
- Construcción de un robot con Arduino y Raspberry Pi: Guía paso a paso
- Construye tu propia máquina de escribir deberes casera (DIY Homework Writing Machine)
- Robot evasor de obstáculos con servo: Construcción con Arduino y HC-SR04
- Robot Seguidor de Línea Autónomo con Arduino UNO: Guía Paso a Paso
- Crea un Botón de Teclado Personalizado y "Apuñalable" con Arduino: Guía Paso a Paso
- Robot Asistente Doméstico Autónomo "O'nine" – Integración ROS, Alexa y Brazo Robótico
- Genera Tonos Musicales con Arduino: Guía Paso a Paso
- Puerta automática con Arduino y sensor ultrasónico HC-SR04
- Controla tu brazo robótico Arduino con app Android dedicada
- Construye un Coche Bluetooth Controlado con Arduino Nano: Guía DIY Completa
- Kit de Robot de Navegación Interior Inteligente para Proyectos Arduino