Robô com Evitamento de Obstáculos Controlado por Bluetooth: Construa um Veículo Inteligente Operado Remotamente
Componentes e Materiais Necessários
| Componente | Quantidade |
|---|---|
| Arduino Nano R3 | 1 |
| Driver de Motor Dual H-Bridge SparkFun L298 | 1 |
| Sensor Ultrassônico HC-SR04 (Genérico) | 1 |
| Módulo Bluetooth HC-05 | 1 |
| RGB Difuso Anodo Comum | 1 |
| Conversor de Nível Lógico Bidirecional SparkFun | 1 |
| Resistor 330 ohm | 1 |
| Protoboard (genérica) | 1 |
| Fonte para Protoboard SparkFun 5V/3.3V | 1 |
| Motor DC 12V | 2 |
| Jumpers Macho/Fêmea | 1 |
Aplicativos e Serviços Online
- Arduino IDE
- Arduino BlueControl (disponível na Play Store)
Sobre o Projeto
O projeto usa um telefone celular para se comunicar com um robô via bluetooth. Sempre quis construir um robô e controlá-lo via telefone celular. Após um longo intervalo de mais de 12 anos, retomei a tarefa de construir um robô e operá-lo. Este também é meu primeiro projeto no Arduino Project Hub. Eletrônica e robótica são um dos meus hobbies favoritos e, portanto, assumi a tarefa de construir o robô durante este período de lockdown devido à Covid-19.
O robô detecta sinais bluetooth transmitidos do telefone celular. Ele usa o módulo bluetooth HC-05 para detectar os sinais de comando do telefone celular e controla o robô. Usei o aplicativo ArduinoBlueControl para controlar o robô.
O coração do robô é o Arduino Nano. Ele recebe os sinais do módulo HC-05 via comunicação serial e controla os motores via módulo driver de motor L298N para movimento nas direções frente, ré, esquerda e direita.
Deve-se ter cuidado ao conectar os pinos TX e RX do módulo HC-05 com o Arduino Nano. Um conversor de nível lógico é usado para isso.
O robô usa o módulo sensor ultrassônico HC-SR04 para detectar obstáculos em seu caminho. Ao detectar qualquer obstáculo durante seu movimento para frente, o robô para. Um LED RGB é usado para mostrar o status do robô.
O robô é montado em uma base de 2 rodas consistindo de dois motores de engrenagem. A circuitaria é montada sobre uma protoboard com fonte de alimentação (3.3v e 5v). O Arduino Nano não pode acionar os motores diretamente devido à necessidade de corrente muito maior para os motores. Portanto, o módulo driver de motor L298N é usado para acionar os motores. Os sinais PWM do Arduino Nano são usados para controlar a velocidade dos motores via pinos ENA e ENB do driver de motor L298N.
Aqui está um vídeo curto do robô em operação:
Espero que tenham gostado do meu robô com evitamento de obstáculos controlado por bluetooth. Este robô pode ser modificado e estendido para usos em automação residencial, veículos de evitamento de obstáculos para chão de fábrica etc. e muitos outros usos.
Código
Código Arduino do Robô Controlado por Bluetooth
/* Robô com Evitamento de Obstáculos Controlado por Bluetooth
Preparado por: Alok Talukdar
Data: 09.05.2020 */
#include <SoftwareSerial.h> // Para usar qualquer pino no Arduino para comunicação serial.
// Define os pinos digitais para o módulo de controle de motor L298.
#define IN1 5 // para motor direito
#define IN2 4 // para motor direito
#define IN3 3 // para motor esquerdo
#define IN4 2 // para motor esquerdo
#define ENA 9 // Enable A para controle PWM do motor direito
#define ENB 10 // Enable B para controle PWM do motor esquerdo
// Define os pinos digitais para controle do LED RGB
#define redLED 8
#define greenLED A0
#define blueLED 11
// Configura o módulo sensor ultrassônico HC-SR04
const int trigPin = 6; // pino TRIG conectado ao pino D6 do Arduino Nano
const int echoPin = 7; // pino ECHO conectado ao pino D7 do Arduino Nano
int i, j, k = 0;
float duration, distance; // variáveis para medição de distância
// Configura o módulo Bluetooth HC05
SoftwareSerial mySerial(12, 13); // (12 --> RX , 13 --> TX)
String data; // variáveis para controle Bluetooth
int btVal;
void setup() {
// Coloque seu código de configuração aqui, para rodar uma vez:
pinMode(trigPin, OUTPUT); // Configura pino D6 para transmitir pulsos ultrassônicos
pinMode(echoPin, INPUT); // Configura pino D7 para receber pulsos ultrassônicos
mySerial.begin(9600); // Configura a serial software na taxa de 9600 baud
pinMode(IN1, OUTPUT); // Configura IN1 - IN4 como OUTPUT para controlar motores
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(blueLED, OUTPUT);
pinMode(greenLED, OUTPUT);
digitalWrite(IN1, LOW); // Configura o status de IN1 - IN4 como LOW
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
analogWrite(redLED, 255); // Desliga LEDs. LED RGB é do tipo anodo comum.
digitalWrite(blueLED, HIGH);
digitalWrite(greenLED, HIGH);
}
void loop() {
// Coloque seu código principal aqui, para rodar repetidamente:
while (mySerial.available()) {
data = mySerial.readStringUntil('\n');
}
btVal = (data.toInt());
switch (btVal) {
case 1:
forward();
digitalWrite(greenLED, LOW);
analogWrite(redLED, 255);
digitalWrite(blueLED, HIGH);
dist();
break;
case 2:
reverse();
digitalWrite(greenLED, HIGH);
analogWrite(redLED, 255);
digitalWrite(blueLED, LOW);
break;
case 3:
left();
break;
case 4:
right();
break;
case 5:
stoprobot();
digitalWrite(greenLED, HIGH);
analogWrite(redLED, 0);
digitalWrite(blueLED, HIGH);
break;
default:
digitalWrite(greenLED, HIGH);
analogWrite(redLED, 255);
digitalWrite(blueLED, HIGH);
break;
}
if (mySerial.available() < 0) {
// Serial.println("Sem Dados Bluetooth");
}
}
// Declarações das funções de controle de motor
void forward() {
for(i=0; i<=100; i++) {
analogWrite(ENA, i);
analogWrite(ENB, i);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
}
void reverse() {
for(j=0; j<=100; j++) {
analogWrite(ENA, j);
analogWrite(ENB, j);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
}
void left() {
analogWrite(ENA, 127);
analogWrite(ENB, 0);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
}
void right() {
analogWrite(ENA, 0);
analogWrite(ENB, 127);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void stoprobot() {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void dist() {
digitalWrite(trigPin, LOW); // para enviar um pulso via pino TRIG do HC-SR04
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); // lê a duração do pulso
distance = (duration * 0.0343) / 2; // mede a distância em cm. Velocidade do som é 340 m/s ou 0.0343 cm/us
if(distance < 20) // se distância < 20 cm, PARA robô
{
stoprobot();
digitalWrite(greenLED, HIGH);
analogWrite(redLED, 0);
digitalWrite(blueLED, HIGH);
}
delay(1000);
}
Esquemáticos
Diagrama do circuito do robô.
Processo de manufatura
- Robô Móvel Evita-Obstáculos Baseado em Visão no Raspberry Pi
- Construa um Robô Raspberry Pi Controlado por Bluetooth com Feedback de Áudio
- Construa um Robô de Streaming de Vídeo Controlado por Internet com Arduino e Raspberry Pi
- Robô Controlado por Gestos Alimentado por Raspberry Pi
- Construa um Robô Controlado por WiFi com Raspberry Pi e Smartphone Android
- Construa um Robô Controlado por Fala com Windows 10 IoT Core no Raspberry Pi 2
- Construa Robô Raspberry Pi Controlado por Wi-Fi com Python – Guia Passo a Passo
- ROObockey: Robô de Hockey de Rua com Assistência de Precisão e Controle Remoto
- Sistema de Desvio de Obstáculos com IA usando Arduino e Sensores Ultrassônicos
- Construa um Robô Controlado por Voz com Arduino Nano