Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Construye un Robot Controlado por Gestos en Casa con Arduino y MPU-6050

Componentes y Suministros

Herramientas y Máquinas Necesarias

Aplicaciones y Servicios Online

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)

  1. Conecta el módulo al Arduino según el diagrama de cableado.
  2. Sube el código "configure" (incluye SoftwareSerial para comunicación AT).
  3. 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.
  4. Abre Monitor Serie a 9600 baudios, NL & CR. Envía "AT" → debe responder "OK".
  5. Envía comandos AT en secuencia:
    • AT+ORGL - Configuración de fábrica
    • AT+RMAAD - Liberar emparejamientos previos
    • AT+UART? - Ver baudrate actual
    • AT+UART=38400,0,0 - Establecer baudrate 38400
    • AT+ROLE? - Ver rol (0=esclavo, 1=maestro)
    • AT+ROLE=0 - Establecer como esclavo
    • AT+ADDR? - Obtener dirección MAC del módulo (anótala)

Configurar Segundo Módulo como Maestro (Unidad Remota)

  1. Conecta el segundo módulo al Arduino y ponlo en modo AT (mantén botón al conectar).
  2. Envía comandos AT:
    • AT+ORGL, AT+RMAAD, AT+UART?, AT+UART=38400,0,0
    • AT+ROLE=1 - Establecer como maestro
    • AT+CMODE=0 - Conectar solo a un dispositivo
    • AT+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

  1. 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.
  2. 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

  1. Construcción de un robot con Arduino y Raspberry Pi: Guía paso a paso
  2. Construye tu propia máquina de escribir deberes casera (DIY Homework Writing Machine)
  3. Robot evasor de obstáculos con servo: Construcción con Arduino y HC-SR04
  4. Robot Seguidor de Línea Autónomo con Arduino UNO: Guía Paso a Paso
  5. Crea un Botón de Teclado Personalizado y "Apuñalable" con Arduino: Guía Paso a Paso
  6. Robot Asistente Doméstico Autónomo "O'nine" – Integración ROS, Alexa y Brazo Robótico
  7. Genera Tonos Musicales con Arduino: Guía Paso a Paso
  8. Puerta automática con Arduino y sensor ultrasónico HC-SR04
  9. Controla tu brazo robótico Arduino con app Android dedicada
  10. Construye un Coche Bluetooth Controlado con Arduino Nano: Guía DIY Completa
  11. Kit de Robot de Navegación Interior Inteligente para Proyectos Arduino