Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construa um Robô Controlado por Gestos em Casa com Arduino e MPU-6050

Componentes e Materiais

Ferramentas Necessárias

Aplicativos e Serviços Online

Sobre o Projeto

Como fazer um carro controlado por gestos. Aplicação simples do MPU-6050 (giroscópio/acelerômetro 3 eixos). Entendendo como usá-lo, interfaciar com Arduino e transferir dados via módulos Bluetooth. Foco na comunicação Bluetooth-entre dois HC-05.

Siga o vídeo para construir o corpo do robô e conexões.

Configuração dos Módulos Bluetooth

O HC-05 vem como escravo de fábrica (recebe dados de celular sem configuração extra, senha padrão 1234/0000). Para enviar dados a outro HC-05 ou celular, precisamos configurar.

Neste projeto, enviamos dados do MPU-6050 coletados no controle remoto para o outro módulo no robô.

Configure o primeiro módulo como escravo (recebe sinais do controle, montado no carro). Configure o segundo como mestre (transmissor, envia dados ao escravo).

Configurar Módulo Escravo

  1. Conecte ao Arduino conforme diagrama.
  2. Carregue código "configure" (bridge serial para comandos AT).
  3. Desconecte, segure botão KEY no módulo e reconecte. LED pisca lento (a cada 2s) = modo AT.
  4. Abra Serial Monitor (9600 baud, Both NL & CR). Digite AT → deve responder OK.
  5. Comandos em sequência:
    • AT+ORGL – restaura fábrica
    • AT+RMAAD – limpa pareamentos anteriores
    • AT+UART? – verifica baud rate
    • AT+UART=38400,0,0 – define 38400
    • AT+ROLE? – verifica papel (0=escravo, 1=mestre)
    • AT+ROLE=0 – define como escravo
    • AT+ADDR? – obtém endereço do módulo ANOTE ESTE ENDEREÇO

Configurar Módulo Mestre

  1. Conecte segundo módulo ao Arduino, entre em modo AT (mesmo procedimento).
  2. Comandos:
    • AT+ORGL
    • AT+RMAAD
    • AT+UART=38400,0,0
    • AT+ROLE=1 – define como mestre
    • AT+CMODE=0 – conecta apenas a um dispositivo
    • AT+BIND="endereço_do_escravo" – vincula ao escravo

Bibliotecas e Código Fonte

Instale bibliotecas para MPU-6050 e comunicação I2C. Baixe de: MediaFire. Se já tem, pule.

Unidade do Carro (Car Unit)

Conecte ao PC via USB, selecione porta/board corretos, carregue programa Gesture_controled_Robot__car_unit_. Não conecte bateria nem Bluetooth durante upload.

// Programa por Shubham Shinganapure em 3-10-2019
// Para Carro 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); }

Unidade Remota (Remote Unit)

Carregue programa remote na unidade remota (Arduino Nano + MPU-6050 + HC-05 mestre).

// Programa modificado em 3/10/19 por Shubham Shinganapure
// Para Carro 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
// ... variáveis DMP, FIFO, Quaternion, YPR ...
#include 
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("Testando conexões..."));
  Serial.println(mpu.testConnection() ? F("MPU6050 conexão ok") : F("MPU6050 falhou"));
  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 detecção de interrupção..."));
    attachInterrupt(0, dmpDataReady, RISING);
    mpuIntStatus = mpu.getIntStatus();
    Serial.println(F("DMP pronto! Aguardando primeira interrupção..."));
    dmpReady = true;
    packetSize = mpu.dmpGetFIFOPacketSize();
  } else {
    Serial.print(F("Falha init 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("FIFO overflow!"));
    } 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');
  }
}
void dmpDataReady() { mpuInterrupt = true; }

Insira o módulo Bluetooth escravo na unidade do carro e o mestre na unidade remota. Ligue e divirta-se!

Útil? Curta, compartilhe, comente dúvidas. Siga-me para mais projetos! Apoie meu trabalho e inscreva-se no YouTube.

Obrigado!

Esquemático

Diagrama de conexões disponível no projeto original.

Processo de manufatura

  1. Construindo um Robô com Arduino e Raspberry Pi: Guia Passo a Passo
  2. Construa Sua Própria Máquina de Escrever Deveres de Casa (Plotter de Caneta) em Casa
  3. Robô Desviador de Obstáculos com Servo: Construa com Arduino e HC-SR04
  4. Criar Robô Seguidor de Linha Autônomo com Arduino UNO
  5. Crie um Botão de Teclado "Socável" Personalizado com Arduino: Guia Passo a Passo
  6. Robô Assistente Doméstico Autônomo: Lista Completa de Peças e Guia de Configuração
  7. Criar Tons Musicais com Arduino: Um Guia Passo a Passo
  8. Porta Automática com Arduino e Sensor Ultrassônico HC-SR04
  9. Controle Braço Robótico Arduino via App Android Dedicado
  10. Kit de Robô de Navegação Interna Inteligente para Projetos Arduino