Construa um Robô Controlado por Gestos em Casa com Arduino e MPU-6050
Componentes e Materiais
- 1x Arduino UNO
- 1x Arduino Nano R3
- 2x Módulo Bluetooth HC-05
- 1x MPU-6050 (Acelerômetro/Giroscópio 3 eixos)
- 2x Motor DC 12V
- 1x Rodas de borracha
- 1x Driver de motor Dual H-Bridge L293D
- 2x Bateria 9V
Ferramentas Necessárias
- Ferro de solda
- Solda sem chumbo
- Fita espuma
- Multiferramenta/Chave de fenda
Aplicativos e Serviços Online
- Arduino IDE
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
- Conecte ao Arduino conforme diagrama.
- Carregue código "configure" (bridge serial para comandos AT).
- Desconecte, segure botão KEY no módulo e reconecte. LED pisca lento (a cada 2s) = modo AT.
- Abra Serial Monitor (9600 baud, Both NL & CR). Digite
AT→ deve responderOK. - Comandos em sequência:
AT+ORGL– restaura fábricaAT+RMAAD– limpa pareamentos anterioresAT+UART?– verifica baud rateAT+UART=38400,0,0– define 38400AT+ROLE?– verifica papel (0=escravo, 1=mestre)AT+ROLE=0– define como escravoAT+ADDR?– obtém endereço do módulo ANOTE ESTE ENDEREÇO
Configurar Módulo Mestre
- Conecte segundo módulo ao Arduino, entre em modo AT (mesmo procedimento).
- Comandos:
AT+ORGLAT+RMAADAT+UART=38400,0,0AT+ROLE=1– define como mestreAT+CMODE=0– conecta apenas a um dispositivoAT+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
- Construindo um Robô com Arduino e Raspberry Pi: Guia Passo a Passo
- Construa Sua Própria Máquina de Escrever Deveres de Casa (Plotter de Caneta) em Casa
- Robô Desviador de Obstáculos com Servo: Construa com Arduino e HC-SR04
- Criar Robô Seguidor de Linha Autônomo com Arduino UNO
- Crie um Botão de Teclado "Socável" Personalizado com Arduino: Guia Passo a Passo
- Robô Assistente Doméstico Autônomo: Lista Completa de Peças e Guia de Configuração
- Criar Tons Musicais com Arduino: Um Guia Passo a Passo
- Porta Automática com Arduino e Sensor Ultrassônico HC-SR04
- Controle Braço Robótico Arduino via App Android Dedicado
- Kit de Robô de Navegação Interna Inteligente para Projetos Arduino