Que vamos a conseguir?
Un robot movil que avanza autonomamente, detecta obstaculos con ultrasonido, y gira para evitarlos. Construido sobre un chasis LEGO Technic.
Lo que aprenderas:
- Controlar motores DC con el driver L298N
- Usar PWM para controlar velocidad de motores
- Crear algoritmo de navegacion autonoma
- Integrar multiples subsistemas (sensores + actuadores)
- Manejar alimentacion separada para motores
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
El driver L298N - Puente H dual
Control de direccion con el Puente H
Cada motor tiene 2 pines de direccion (INx). Combinandolos, controlamos el sentido de giro:
Adelante
Atras
Freno
Freno
Diagrama de conexion completo
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
Ideas para el chasis LEGO Technic
LEGO Technic es ideal porque tiene agujeros para ejes y es facil de modificar:
Oruga o ruedas grandes
Coche todo terreno
Robot con personalidad
Con pala decorativa
El codigo explicado
El codigo mas largo hasta ahora, pero organizado en funciones claras.
// 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:
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.
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.
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.
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.
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".
Simulador interactivo
Wokwi permite simular motores DC y el L298N. Prueba antes de montar.
Wokwi Simulator
Abrir en WokwiNota 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.
Paso a paso
Monta tu robot en 12 pasos. Toma tu tiempo, verifica cada conexion.
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).
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.
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.
Conecta los motores al L298N
Motor izquierdo a terminales OUT1/OUT2. Motor derecho a OUT3/OUT4. Aprieta bien los tornillos de los terminales.
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.
Conecta GND comun
Un cable desde GND del L298N a GND de Arduino. CRITICO: Sin esto, nada funcionara.
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).
Monta el HC-SR04
Fijalo en la parte delantera, mirando hacia adelante. TRIG - Pin 10, ECHO - Pin 9, VCC - 5V, GND - GND.
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.
Prueba de motores
Pon las pilas. El robot deberia avanzar despues de 2 segundos. Pon la mano delante: deberia parar y girar.
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.
Construye un laberinto!
Usa cajas de carton o libros para crear paredes. Observa como tu robot navega autonomamente.
Solucion de problemas
Los errores mas comunes y como solucionarlos.
Problemas frecuentes
Experimentos
Mejora tu robot con estas ideas.
Ajusta velocidad
Cambia VELOCIDAD de 100 a 200 y observa la diferencia. Encuentra el equilibrio entre rapidez y control.
Giro aleatorio
Usa random(0,2) para elegir girar izquierda o derecha.
El robot sera menos predecible.
LEDs indicadores
LED verde = avanzando. LED rojo = obstaculo. Ayuda a depurar y queda muy visual.
Buzzer de alerta
Que suene un beep corto cada vez que detecte obstaculo.
Usa tone() con buzzer pasivo.
Modo seguir pared
Manten distancia constante de la pared derecha. Si te alejas, gira derecha. Si te acercas, gira izquierda.
Sensor lateral
Anade un segundo HC-SR04 mirando a un lado. Permite detectar obstaculos laterales y navegar mejor.