Cómo hacer un robot controlado por gestos en casa

 

Cómo hacer un robot de control por gestos en casa

Cómo hacer un robot controlado por gestos en casa

Controla los juguetes como un superhéroe. Un video de bricolaje sobre cómo hacer un automóvil con control de gestos.

  • Bluetooth
  • remoto
  • robótica

Componentes y suministros

Ph a000066 iso (1) ztbmubhmho
Arduino UNO
× 1
ard nano
arduino nano r3
× 1
61pby065esl sx679 tnr8syww5d
Módulo Bluetooth HC-05
× 2
11028 01
Acelerómetro y giroscopio de tres ejes SparkFun – MPU-6050
× 1
52y4441 40
Motor CC, 12 V
× 2
ruedas de goma
× 1
Imagen de instrumentos de Texas l293dne
Controladores de motor de puente en H doble L293D de Texas Instruments
× 1
decenas70
Batería de 9V (genérica)
× 2

Herramientas y máquinas necesarias.

09507 01
Soldador (genérico)
4966285
Alambre de soldadura, sin plomo
5165950
Cinta, Espuma
26w6260 40
Multiherramienta, Destornillador

Aplicaciones y servicios en línea

idea web
IDE de Arduino

Acerca de este proyecto

 

Se trata de cómo hacer un coche de control de gestos usted mismo. Básicamente, esta es una aplicación simple del giroscopio MPU-6050 de 3 ejes, acelerómetro. Puedes hacer muchas más cosas. al comprender cómo usarlo, cómo conectarlo con Arduino y cómo transferir sus datos a los módulos Bluetooth. En este artículo, me centraré en la comunicación Bluetooth a Bluetooth, entre dos módulos Bluetooth HC-05.

Siga el video para construir un cuerpo de robot y conexiones para este proyecto.

 

El diagrama de conexión para el robot y la unidad de transmisión se proporciona a continuación, puede consultarlo.

 

PCB de control directo utilizado en este proyecto de PCBway: https://www.pcbway.com/project/shareproject/How_to_Make_Arduino_Based_Edge_Avoiding_Robot.html

 

 

 

Ahora hablemos de la configuración del módulo Bluetooth. Básicamente, el módulo Bluetooth HC-05 viene con una configuración de fábrica de módulo esclavo. Esto significa que podemos enviar datos al módulo simplemente conectándolo. No se necesitan otras configuraciones para enviar datos desde dispositivos móviles al módulo HC-05. simplemente ingrese su contraseña predeterminada (1234/0000) para conectarlo. pero qué pasa si queremos enviar datos usando este módulo a otro mismo módulo o dispositivo móvil.

codificado

Robot controlado por gestos (unidad remota)arduino
//program modified on 3/10/19 by // by Shubham Shinganapure. 
//
//for Gesture controled Robotic Car (remote  )

#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // not necessary if using MotionApps include file

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for SparkFun breakout and InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL

// MPU control/status vars
bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

VectorFloat gravity;  
Quaternion q;      
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };

volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
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; // 400kHz I2C clock (200kHz if CPU is 8MHz)
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif

    // initialize serial communication
    // (115200 chosen because it is required for Teapot Demo output, but it's
    // really up to you depending on your project)
    Serial.begin(115200);
    BTSerial.begin(38400);
   // while (!Serial); // wait for Leonardo enumeration, others continue immediately

Serial.println(F("Initializing I2C devices..."));
    mpu.initialize();

    // verify connection
    Serial.println(F("Testing device connections..."));
    Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

    // wait for ready
   
    // load and configure the DMP
    Serial.println(F("Initializing DMP..."));
    devStatus = mpu.dmpInitialize();

 // supply your own gyro offsets here, scaled for min sensitivity
    mpu.setXGyroOffset(220);
    mpu.setYGyroOffset(76);
    mpu.setZGyroOffset(-85);
    mpu.setZAccelOffset(1788);

    // make sure it worked (returns 0 if so)
    if (devStatus == 0) {
        // turn on the DMP, now that it's ready
        Serial.println(F("Enabling DMP..."));
        mpu.setDMPEnabled(true);

        // enable Arduino interrupt detection
        Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
        attachInterrupt(0, dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();

        // set our DMP Ready flag so the main loop() function knows it's okay to use it
        Serial.println(F("DMP ready! Waiting for first interrupt..."));
        dmpReady = true;

        // get expected DMP packet size for later comparison
        packetSize = mpu.dmpGetFIFOPacketSize();
    } else {
        // ERROR!
        // 1 = initial memory load failed
        // 2 = DMP configuration updates failed
        // (if it's going to break, usually the code will be 1)
        Serial.print(F("DMP Initialization failed (code "));
        Serial.print(devStatus);
        Serial.println(F(")"));
    }

    // configure LED for output
   
  pinMode(bt,INPUT);
  
}



// ================================================================
// ===                    MAIN PROGRAM LOOP                     ===
// ================================================================

void loop() {
 if(digitalRead(bt)==HIGH)
 {
  x++;
  delay(150);
  }
  if((x%2)==0){
    // if programming failed, don't try to do anything
    if (!dmpReady) return;

    // wait for MPU interrupt or extra packet(s) available
    while (!mpuInterrupt && fifoCount < packetSize) {
        // other program behavior stuff here
        // .
        // .
        // .
        // if you are really paranoid you can frequently test in between other
        // stuff to see if mpuInterrupt is true, and if so, "break;" from the
        // while() loop to immediately process the MPU data
        // .
        // .
        // .
    }

    // reset interrupt flag and get INT_STATUS byte
    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();

    // get current FIFO count
    fifoCount = mpu.getFIFOCount();

    // check for overflow (this should never happen unless our code is too inefficient)
    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
        // reset so we can continue cleanly
        mpu.resetFIFO();
        Serial.println(F("FIFO overflow!"));

    // otherwise, check for DMP data ready interrupt (this should happen frequently)
    } else if (mpuIntStatus & 0x02) {
        // wait for correct available data length, should be a VERY short wait
        while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

        // read a packet from FIFO
        mpu.getFIFOBytes(fifoBuffer, packetSize);
        
        // track FIFO count here in case there is > 1 packet available
        // (this lets us immediately read more without waiting for an interrupt)
        fifoCount -= packetSize;

 #ifdef OUTPUT_READABLE_YAWPITCHROLL
            // display Euler angles in degrees
            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');
              }
}

diagramas

Robot de control de gestos (unidad remota)ckt
Descargar
control remoto por gestos rzicwmbkcw