
Introducción
Este proyecto práctico de robótica combina lo mejor de la programación con Arduino, sensores y control de motores. Aprende a construir un robot móvil que avanza cuando tiene el camino libre y se detiene automáticamente ante obstáculos usando un sensor ultrasónico. Además, gracias a los encoders, puedes saber con precisión cuánto ha girado cada motor.
Puedes probar y simular este sistema completamente funcional en línea desde Tinkercad: 🔗 Proyecto en Tinkercad
Código Completo del Proyecto
#include <Encoder.h>
// === Encoder motor A ===
Encoder encoderA(2, 4);
long positionA = 0;
int rotationA = 0;
// === Encoder motor B ===
Encoder encoderB(3, 7);
long positionB = 0;
int rotationB = 0;
// === Pines del sensor ultrasónico ===
const int trigPin = 11;
const int echoPin = 12;
long duracion;
float distancia;
// === Estado de movimiento ===
bool motoresActivos = true;
void setup() {
Serial.begin(9600);
// Pines motor A
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
// Pines motor B
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
// Pines del sensor
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
// === Medir distancia
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duracion = pulseIn(echoPin, HIGH);
distancia = duracion * 0.0343 / 2; // en centímetros
// === Decidir si detener motores
motoresActivos = distancia >= 15;
// === Control de motores
if (motoresActivos) {
analogWrite(5, 30); // Motor A
analogWrite(6, 0);
analogWrite(9, 30); // Motor B
analogWrite(10, 0);
} else {
analogWrite(5, 0);
analogWrite(6, 0);
analogWrite(9, 0);
analogWrite(10, 0);
}
// === Lectura encoders
positionA = encoderA.read() / 10;
rotationA = abs(positionA) / 10;
positionB = encoderB.read() / 10;
rotationB = abs(positionB) / 10;
// === Mostrar por Serial
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.print(" cm | Estado: ");
Serial.print(motoresActivos ? "MOVIENDO" : "DETENIDO");
Serial.print(" || A Pos: ");
Serial.print(positionA);
Serial.print(" | Rot: ");
Serial.print(rotationA);
Serial.print(" || B Pos: ");
Serial.print(positionB);
Serial.print(" | Rot: ");
Serial.println(rotationB);
delay(300);
}
Explicación del Código por Secciones
Encoders
Se inicializan dos objetos Encoder
conectados a pines digitales. Esto permite rastrear con precisión la cantidad de pulsos generados por el giro de cada motor, convirtiéndose en una estimación del desplazamiento físico del robot.
Sensor ultrasónico
Usando pulseIn()
, el código mide el tiempo que tarda un pulso en rebotar desde un objeto. Con eso, se calcula la distancia al frente y se decide si los motores deben avanzar o detenerse.
Control de motores
Se usa analogWrite()
para enviar señales PWM al controlador L298N. Si no hay obstáculos cercanos (distancia mayor o igual a 15 cm), ambos motores avanzan; de lo contrario, se detienen.
Visualización serial
Todo se muestra por el monitor serial: distancia medida, estado de movimiento y datos de los encoders. Esto facilita la depuración, calibración y análisis del sistema en tiempo real.
¿Qué puedes hacer a partir de aquí?
- Agregar una maniobra de reversa o giro cuando detecte un obstáculo.
- Implementar control PID usando las lecturas de encoder para corregir rumbo.
- Conectar sensores de línea para que siga caminos negros.
- Integrar un módulo Bluetooth o WiFi para controlarlo desde una app.
Conclusión
Este proyecto es una excelente puerta de entrada a la robótica móvil con Arduino. Integra sensores, lógica condicional y retroalimentación de motores en un sistema simple pero poderoso. Ideal para estudiantes, makers y curiosos que desean ir más allá del típico “Hola Mundo”.
Explóralo, adáptalo, expándelo… y simúlalo gratis desde: 🔗 Tinkercad
No hay comentarios en este artículo.