Sistema de Detección y Control de Motores con Encoders y Sensor Ultrasónico
Información, Proyectos, Noticias y más

Sistema de Detección y Control de Motores con Encoders y Sensor Ultrasónico

Arduino con motores y encoders

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.