Robot Evita-Obstáculos Controlado por Bluetooth: Vehículo Inteligente de Control Remoto
Componentes y materiales
| Arduino Nano R3 | × | 1 |
| Controlador motor dual H-Bridge L298 (SparkFun) | × | 1 |
| Sensor ultrasónico HC-SR04 | × | 1 |
| Módulo Bluetooth HC-05 | × | 1 |
| LED RGB difuso ánodo común | × | 1 |
| Conversor de nivel lógico bidireccional (SparkFun) | × | 1 |
| Resistencia 330 Ω | × | 1 |
| Protoboard | × | 1 |
| Fuente protoboard 5V/3.3V (SparkFun) | × | 1 |
| Motor DC 12 V | × | 2 |
| Cables jumper macho/hembra | × | 1 |
Aplicaciones y servicios online
- Arduino IDE
- Arduino BlueControl (disponible en Play Store)
Sobre el proyecto
El proyecto usa un móvil para comunicarse con un robot por Bluetooth. Tras más de 12 años, retomé la construcción de un robot durante el confinamiento por Covid-19. La electrónica y robótica son mis aficiones favoritas.
El robot recibe comandos Bluetooth desde el móvil mediante el módulo HC-05 y los ejecuta. Usé la app ArduinoBlueControl para el control.
El cerebro es el Arduino Nano. Recibe señales del HC-05 por comunicación serie y controla los motores vía módulo L298N para moverse adelante, atrás, izquierda y derecha.
Importante: Conecta correctamente los pines TX/RX del HC-05 al Arduino Nano. Se usa un conversor de nivel lógico para la interfaz.
El sensor HC-SR04 detecta obstáculos en el camino. Al detectar uno durante el avance, el robot se detiene. Un LED RGB indica el estado del robot.
El robot usa una base de 2 ruedas con motores con reductor. La electrónica va en protoboard con fuente de 3.3V y 5V. El Arduino no puede mover los motores directamente por su alta demanda de corriente, así que el L298N gestiona la potencia. Las señales PWM del Arduino controlan la velocidad via pines ENA/ENB del L298N.
Vídeo del robot en funcionamiento:
(Vídeo no incluido en el texto original)
Este robot puede ampliarse para domótica, vehículos de evasión de obstáculos en fábricas, y más.
Código
Código Arduino Robot Controlado por Bluetooth C/C++
/* Bluetooth Controlled Obstacle Avoidance Robot
Preparado por: Alok Talukdar
Fecha: 09.05.2020 */
#include <SoftwareSerial.h>
// Pines L298
#define IN1 5 // motor derecho
#define IN2 4 // motor derecho
#define IN3 3 // motor izquierdo
#define IN4 2 // motor izquierdo
#define ENA 9 // PWM motor derecho
#define ENB 10 // PWM motor izquierdo
// Pines LED RGB
#define redLED 8
#define greenLED A0
#define blueLED 11
// HC-SR04
const int trigPin = 6;
const int echoPin = 7;
int i, j, k = 0;
float duration, distance;
// HC-05 Bluetooth
SoftwareSerial mySerial(12, 13); // 12=RX, 13=TX
String data;
int btVal;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
mySerial.begin(9600);
pinMode(IN1, OUTPUT); 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); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
analogWrite(redLED, 255); // LED común ánodo: 255=apagado
digitalWrite(blueLED, HIGH);
digitalWrite(greenLED, HIGH);
}
void loop() {
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("No Bluetooth Data"); */ }
}
// Funciones de control 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); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343) / 2; // cm, velocidad sonido 340 m/s
if (distance < 20) { // <20 cm = PARAR
stoprobot();
digitalWrite(greenLED, HIGH); analogWrite(redLED, 0); digitalWrite(blueLED, HIGH);
}
delay(1000);
}
Esquemáticos
Diagrama de circuito del robot.
Proceso de manufactura
- Robot móvil que evita obstáculos basado en visión en Raspberry Pi
- Construya un robot Raspberry Pi controlado por Bluetooth con retroalimentación de audio
- Construya un robot con streaming de vídeo controlado por Internet con Arduino y Raspberry Pi
- Robot Controlado por Gestos con Raspberry Pi
- Construye un Robot Controlado por WiFi con Raspberry Pi y Smartphone Android
- Construye un Robot Controlado por Voz con Windows 10 IoT Core en Raspberry Pi 2
- Construye un Robot Raspberry Pi Controlado por Wi‑Fi con Python – Guía Paso a Paso
- ROObockey: Robot de Hockey Callejero con Asistencia de Precisión y Control Remoto
- Sistema de Evitación de Obstáculos con IA y Arduino: Aprendizaje por Refuerzo Q-Learning
- Construye un robot controlado por voz con Arduino Nano
- Brazo Robótico Controlado por Ethernet: Control Remoto Simplificado