24. Robot evita-obstáculos
Un robot que avanza, detecta obstáculos con ultrasonidos montados sobre un servo, y decide hacia dónde girar. Tu primer robot autónomo.
🧰 Lista de materiales
🎯 Qué vas a aprender
A integrar percepción, decisión y acción en un sistema autónomo. El robot mide, evalúa caminos con un servo que barre el sensor, y elige el más libre. Aprenderás a alimentar lógica y potencia desde una misma batería con un convertidor buck.
📚 Teoría: arquitectura sentir-pensar-actuar
Un robot reactivo sigue el bucle sentir → pensar → actuar. Aquí: el HC-SR04 mide al frente; si hay obstáculo, el servo gira el sensor a izquierda y derecha para medir ambos lados; el robot gira hacia el lado más despejado y sigue.
La batería de 14,8 V mueve los motores; un buck LM2596 la baja a 5 V estables para el Arduino. Así una sola fuente alimenta todo, con la lógica protegida de los picos del motor.
🔌 Conexiones (resumen)
| Bloque | Conexión |
|---|---|
| Batería 14,8 V | → entrada buck y → driver de motores |
| Salida buck 5 V | → Arduino y servo |
| HC-SR04 Trig/Echo | D11 / D12 |
| Servo | D9 |
| Driver motor izq. | D5 (PWM), D4 (dir) |
| Driver motor der. | D6 (PWM), D7 (dir) |
💻 Código completo
// Robot evita-obstáculos con barrido de servo
#include
const int TRIG = 11, ECHO = 12;
const int M_IZQ_PWM = 5, M_IZQ_DIR = 4;
const int M_DER_PWM = 6, M_DER_DIR = 7;
Servo radar;
const int DIST_SEGURA = 25; // cm
long medir() {
digitalWrite(TRIG, LOW); delayMicroseconds(2);
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long t = pulseIn(ECHO, HIGH, 30000);
return t == 0 ? 999 : t * 0.0343 / 2;
}
void motores(int izq, int der) {
digitalWrite(M_IZQ_DIR, izq >= 0); analogWrite(M_IZQ_PWM, abs(izq));
digitalWrite(M_DER_DIR, der >= 0); analogWrite(M_DER_PWM, abs(der));
}
void avanzar() { motores(180, 180); }
void parar() { motores(0, 0); }
void girarIzq(){ motores(-150, 150); }
void girarDer(){ motores(150, -150); }
long mirar(int angulo) {
radar.write(angulo);
delay(300);
return medir();
}
void setup() {
pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT);
pinMode(M_IZQ_PWM, OUTPUT); pinMode(M_IZQ_DIR, OUTPUT);
pinMode(M_DER_PWM, OUTPUT); pinMode(M_DER_DIR, OUTPUT);
radar.attach(9);
radar.write(90);
delay(500);
}
void loop() {
long frente = mirar(90);
if (frente > DIST_SEGURA) {
avanzar();
} else {
parar();
long izq = mirar(150); // mira a la izquierda
long der = mirar(30); // mira a la derecha
radar.write(90);
if (izq > der) girarIzq(); else girarDer();
delay(400); // duración del giro
parar();
}
} 🛠️ Montaje paso a paso
- Ajusta el buck a 5 V con un multímetro antes de conectar nada.
- Monta motores y driver puente-H; conéctalos a la batería.
- Fija el HC-SR04 sobre el servo (barrido) al frente del chasis.
- Cablea señales de motor, sensor y servo al Arduino.
- Alimenta el Arduino desde el buck (GND común) y sube el sketch.
- Prueba primero con las ruedas en el aire antes de soltarlo al suelo.
🧩 Resolución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| Gira siempre al mismo lado | Lógica izq/der | Revisa las medidas y el signo |
| Motores no responden | Driver mal cableado | Verifica PWM y DIR del puente-H |
| Se reinicia al arrancar motores | Lógica comparte fuente con motores | Usa el buck dedicado a la lógica |
🚀 Para ir más lejos
- Usa los encoders de las ruedas para girar ángulos exactos.
- Añade seguimiento de línea o control por IR (proyecto 20).