* Nivel 3 - Movimiento *

P5: ROBOT EXPLORADOR

El proyecto culminante: un robot autonomo que navega evitando obstaculos. Integra todo lo aprendido: sensores, motores, logica de decision y control PWM.

90
Minutos
10
Componentes
175
Lineas de codigo
01

Que vamos a conseguir?

Un robot movil que avanza autonomamente, detecta obstaculos con ultrasonido, y gira para evitarlos. Construido sobre un chasis LEGO Technic.

Explorando...

Lo que aprenderas:

  • 1 Controlar motores DC con el driver L298N
  • 2 Usar PWM para controlar velocidad de motores
  • 3 Crear algoritmo de navegacion autonoma
  • 4 Integrar multiples subsistemas (sensores + actuadores)
  • 5 Manejar alimentacion separada para motores
02

Hardware necesario

Este proyecto requiere componentes adicionales al kit basico: motores DC, driver L298N y pilas.

Importante: Alimentacion separada

Los motores consumen mucha corriente (hasta 1A cada uno). Arduino NO puede alimentarlos directamente. Necesitas:

  • Portapilas 4xAA (6V) o bateria 9V para los motores (conectar al L298N)
  • Arduino alimentado por USB o su propia bateria
  • GND comun: conectar GND de pilas con GND de Arduino
Arduino UNO
El cerebro
L298N
Driver de motores
2x Motor DC
Motores TT 3-6V
2x Rueda
Para motor TT
HC-SR04
Sensor ultrasonido
4x Pilas AA
+ Portapilas

El driver L298N - Puente H dual

L298N MOTOR A MOTOR B +12V GND +5V ENA IN1 IN2 IN3 IN4 ENB Motor Izquierdo Motor Derecho 6-12V Pilas ENA/ENB: Velocidad (PWM) IN1-IN4: Direccion

Control de direccion con el Puente H

Cada motor tiene 2 pines de direccion (INx). Combinandolos, controlamos el sentido de giro:

Adelante
IN1=HIGH, IN2=LOW
Atras
IN1=LOW, IN2=HIGH
Freno
IN1=LOW, IN2=LOW
Freno
IN1=HIGH, IN2=HIGH

Diagrama de conexion completo

ARDUINO UNO ~5 4 3 ~6 7 8 9 10 GND L298N ENA IN1 IN2 ENB IN3 IN4 GND Motor A Motor B +V GND 5V IZQUIERDO DERECHO HC-SR04 4x AA (6V) ~5, ~6: PWM velocidad 3,4,7,8: Direccion motores 9,10: HC-SR04 (ECHO, TRIG)

Por que necesitamos el L298N?

Arduino solo puede dar 40mA por pin. Un motor DC puede consumir 200-800mA. El L298N actua como "amplificador": recibe senales pequenas de Arduino y controla la corriente grande que va a los motores desde las pilas.

GND comun: la regla de oro

Cuando usas dos fuentes de alimentacion (USB para Arduino, pilas para motores), SIEMPRE conecta los GND entre si. Sin esto, las senales no tienen referencia comun y nada funcionara. Es el error #1 en proyectos de robotica.

Algoritmo de navegacion

Medir distancia
Distancia > 20cm ?
SI: Avanzar
NO: Parar + Girar
Repetir (loop)

Ideas para el chasis LEGO Technic

LEGO Technic es ideal porque tiene agujeros para ejes y es facil de modificar:

Tanque

Oruga o ruedas grandes

Buggy

Coche todo terreno

Wall-E

Robot con personalidad

Excavadora

Con pala decorativa

03

El codigo explicado

El codigo mas largo hasta ahora, pero organizado en funciones claras.

p5_robot.ino
// P5: Robot Explorador - EigenRobotics

// --- Pines Motor Izquierdo ---
const int ENA = 5;   // PWM velocidad
const int IN1 = 4;   // Direccion
const int IN2 = 3;   // Direccion

// --- Pines Motor Derecho ---
const int ENB = 6;   // PWM velocidad
const int IN3 = 8;   // Direccion
const int IN4 = 7;   // Direccion

// --- Pines Sensor ---
const int TRIG = 10;
const int ECHO = 9;

// --- Configuracion ---
const int VELOCIDAD = 150;      // 0-255
const int DISTANCIA_MIN = 20;   // cm
const int TIEMPO_GIRO = 400;    // ms

void setup() {
  // Configurar pines de motores
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  // Configurar pines de sensor
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);

  Serial.begin(9600);
  Serial.println("Robot Explorador listo!");

  delay(2000);  // Esperar antes de arrancar
}

void loop() {
  int distancia = medirDistancia();

  Serial.print("Distancia: ");
  Serial.print(distancia);
  Serial.println(" cm");

  if (distancia > DISTANCIA_MIN || distancia == 0) {
    avanzar();
  } else {
    parar();
    delay(200);
    girarDerecha();
    delay(TIEMPO_GIRO);
    parar();
    delay(100);
  }

  delay(50);
}

// ========== FUNCIONES DE MOVIMIENTO ==========

void avanzar() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, VELOCIDAD);

  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, VELOCIDAD);
}

void retroceder() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, VELOCIDAD);

  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENB, VELOCIDAD);
}

void girarDerecha() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, VELOCIDAD);

  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENB, VELOCIDAD);
}

void girarIzquierda() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, VELOCIDAD);

  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, VELOCIDAD);
}

void parar() {
  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
}

// ========== FUNCION DE SENSOR ==========

int medirDistancia() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  long duracion = pulseIn(ECHO, HIGH, 30000);

  if (duracion == 0) return 0;

  return duracion / 58;
}

Explicacion de las partes clave:

1

ENA, ENB - Enable pins

Los pines Enable controlan la velocidad con PWM (0-255). Si ENA=0, el motor A no gira aunque IN1/IN2 esten activos. Usamos pines con ~ (PWM): 5 y 6.

2

IN1, IN2, IN3, IN4 - Direction pins

Controlan la direccion de cada motor. IN1=HIGH + IN2=LOW = adelante. IN1=LOW + IN2=HIGH = atras. No necesitan ser PWM, solo digitales.

3

distancia == 0

Cuando el sensor no recibe eco (objeto muy lejos o error), pulseIn devuelve 0. Lo tratamos como "camino libre" porque no hay obstaculo cercano.

4

girarDerecha()

Para girar sobre si mismo: un motor adelante, otro atras. Motor izquierdo adelante + motor derecho atras = giro a la derecha. Es como un tanque: las orugas van en direcciones opuestas.

5

delay(TIEMPO_GIRO)

Controlamos cuanto gira con el tiempo, no con grados. 400ms suele ser ~90 grados, pero depende de la velocidad y el suelo. Ajustalo experimentalmente.

Conceptos clave:

Control diferencial

Robots con 2 ruedas independientes giran variando la velocidad/direccion de cada motor. Adelante+Adelante=recto, Adelante+Atras=giro.

PWM para velocidad

analogWrite(ENA, 100) = ~40% velocidad. analogWrite(ENA, 255) = 100% velocidad. Empieza bajo y sube gradualmente.

Organizacion del codigo

Funciones como avanzar(), parar() hacen el loop() legible. Cada funcion hace UNA cosa bien.

Delay de seguridad

Los delay() entre acciones evitan cambios bruscos que pueden daƱar motores o hacer que el robot "salte".

04

Simulador interactivo

Wokwi permite simular motores DC y el L298N. Prueba antes de montar.

Wokwi Simulator

Abrir en Wokwi

Nota sobre simulacion de motores

Wokwi tiene componentes para motores DC y L298N, pero el comportamiento real depende mucho del hardware fisico. Usa el simulador para verificar la logica, pero ajusta VELOCIDAD y TIEMPO_GIRO con el robot real.

05

Paso a paso

Monta tu robot en 12 pasos. Toma tu tiempo, verifica cada conexion.

1

Construye el chasis LEGO

Crea una base rectangular con LEGO Technic. Debe tener espacio para: motores (laterales), Arduino (arriba), L298N (centro), pilas (abajo o atras).

Tip: Usa vigas Technic largas para la base. Los agujeros permiten pasar cables y fijar componentes con bridas.
2

Monta los motores

Fija los motores TT a los lados del chasis. Deben quedar paralelos y a la misma altura. Las ruedas van hacia afuera.

3

Anade una rueda loca

En la parte delantera o trasera, anade una rueda pequena (ball caster) o una pieza que se deslice. Esto da estabilidad al robot.

4

Conecta los motores al L298N

Motor izquierdo a terminales OUT1/OUT2. Motor derecho a OUT3/OUT4. Aprieta bien los tornillos de los terminales.

Atencion: Si luego el robot gira en circulos, un motor esta invertido. Intercambia los cables de ESE motor en el L298N.
5

Conecta la alimentacion al L298N

Portapilas (+) al terminal +12V del L298N. Portapilas (-) al terminal GND del L298N. Si el jumper de 5V esta puesto, el L298N genera 5V para Arduino.

6

Conecta GND comun

Un cable desde GND del L298N a GND de Arduino. CRITICO: Sin esto, nada funcionara.

7

Conecta los pines de control

ENA - Pin 5, IN1 - Pin 4, IN2 - Pin 3 (motor izquierdo). ENB - Pin 6, IN3 - Pin 8, IN4 - Pin 7 (motor derecho).

8

Monta el HC-SR04

Fijalo en la parte delantera, mirando hacia adelante. TRIG - Pin 10, ECHO - Pin 9, VCC - 5V, GND - GND.

9

Sube el codigo (sin pilas)

Conecta Arduino por USB. Sube el codigo. NO pongas pilas todavia. Verifica en el Monitor Serial que el sensor funciona.

10

Prueba de motores

Pon las pilas. El robot deberia avanzar despues de 2 segundos. Pon la mano delante: deberia parar y girar.

11

Ajusta parametros

Si es muy rapido, baja VELOCIDAD. Si gira poco, sube TIEMPO_GIRO. Si no detecta obstaculos, revisa el sensor o sube DISTANCIA_MIN.

12

Construye un laberinto!

Usa cajas de carton o libros para crear paredes. Observa como tu robot navega autonomamente.

06

Solucion de problemas

Los errores mas comunes y como solucionarlos.

Problemas frecuentes

Robot no se mueve
Verifica pilas, GND comun, y que ENA/ENB > 0
Gira en circulos
Un motor invertido. Intercambia cables en L298N
No detecta obstaculos
Revisa TRIG/ECHO. Prueba sensor solo en P3
Velocidades diferentes
Usa velocidades distintas: ENA=150, ENB=145
Motores hacen ruido pero no giran
Pilas agotadas o velocidad muy baja. Sube PWM
Arduino se reinicia
Motores consumen demasiado. Usa pilas nuevas
07

Experimentos

Mejora tu robot con estas ideas.

Facil

Ajusta velocidad

Cambia VELOCIDAD de 100 a 200 y observa la diferencia. Encuentra el equilibrio entre rapidez y control.

Facil

Giro aleatorio

Usa random(0,2) para elegir girar izquierda o derecha. El robot sera menos predecible.

Medio

LEDs indicadores

LED verde = avanzando. LED rojo = obstaculo. Ayuda a depurar y queda muy visual.

Medio

Buzzer de alerta

Que suene un beep corto cada vez que detecte obstaculo. Usa tone() con buzzer pasivo.

Desafio

Modo seguir pared

Manten distancia constante de la pared derecha. Si te alejas, gira derecha. Si te acercas, gira izquierda.

Desafio

Sensor lateral

Anade un segundo HC-SR04 mirando a un lado. Permite detectar obstaculos laterales y navegar mejor.