Ir al contenido
← Volver a Formación Arduino Avanzado

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.

Dificultad: Avanzado · Tiempo: 120 min · Cerebro: Arduino Uno

🧰 Lista de materiales

Arduino Uno R3 (ATmega328P)
Arduino Uno R3 (ATmega328P)
Cerebro del robot
sin foto
Sensor ultrasónico HC-SR04
Mide distancia a obstáculos
Microservo SG90 9 g
Microservo SG90 9 g
Barre el sensor a los lados
sin foto
Rueda motriz Conga con encoder
Tracción con odometría (×2)
Batería Li-ion Conga 14,8 V
Batería Li-ion Conga 14,8 V
Alimentación de tracción
Convertidor buck LM2596
Convertidor buck LM2596
Reduce a 5 V para la lógica

🎯 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.

⚠ AtenciónLa batería Li-ion 4S es potente: respeta polaridad, no la cortocircuites y ajusta la salida del buck a 5 V antes de conectar el Arduino (mídela con un multímetro).

🔌 Conexiones (resumen)

BloqueConexión
Batería 14,8 V→ entrada buck y → driver de motores
Salida buck 5 V→ Arduino y servo
HC-SR04 Trig/EchoD11 / D12
ServoD9
Driver motor izq.D5 (PWM), D4 (dir)
Driver motor der.D6 (PWM), D7 (dir)
NotaLas ruedas Conga necesitan un driver puente-H (tipo L298N) entre el Arduino y los motores. El encoder es opcional para esta versión reactiva.

💻 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

  1. Ajusta el buck a 5 V con un multímetro antes de conectar nada.
  2. Monta motores y driver puente-H; conéctalos a la batería.
  3. Fija el HC-SR04 sobre el servo (barrido) al frente del chasis.
  4. Cablea señales de motor, sensor y servo al Arduino.
  5. Alimenta el Arduino desde el buck (GND común) y sube el sketch.
  6. Prueba primero con las ruedas en el aire antes de soltarlo al suelo.

🧩 Resolución de problemas

SíntomaCausaSolución
Gira siempre al mismo ladoLógica izq/derRevisa las medidas y el signo
Motores no respondenDriver mal cableadoVerifica PWM y DIR del puente-H
Se reinicia al arrancar motoresLógica comparte fuente con motoresUsa 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).
← Volver a Formación Arduino