Descripción
🔍 Descripción del Módulo Sensor de Velocidad Infrarrojo Encoder Digital
✅ Características principales
El Módulo Sensor de Velocidad Infrarrojo (IR) con Encoder Digital es un dispositivo comúnmente utilizado para la detección de la velocidad de rotación o el conteo de rotaciones de objetos en movimiento, como motores o ruedas.
- Tipo de sensor: Óptico infrarrojo
- Salida: Digital (0 o 1 lógico)
- Principio de funcionamiento: Interrupción de un haz IR por parte de un disco codificado (encoder disk)
- Tensión operativa: 3.3V – 5V
- Tipo de salida: Señal digital (HIGH/LOW)
- Pin: VCC, GND, OUT
- Frecuencia soportada: Hasta ~1000 RPM (depende del disco encoder)
🧰 Aplicaciones típicas
- Medición de velocidad angular de motores
- Contar impulsos (tachómetros)
- Robótica y automatización
- Encoders ópticos para ruedas de robots
⚙️ Componentes necesarios para el proyecto con Arduino
- 1x Arduino UNO (o compatible)
- 1x Módulo Sensor de Velocidad IR
- 1x Disco Encoder (rótula codificada, perforada)
- Cables Dupont
- Motores DC (opcional)
- Protoboard (opcional)
🔌 Conexiones eléctricas
| Módulo IR Encoder | Arduino |
|---|---|
| VCC | 5V |
| GND | GND |
| FUERA | Pin digital (ej. 2) |
🖥️ Código de ejemplo para Arduino
1. Lectura de pulsos
volatile int conta_impulsi = 0;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), contaImpulso, RISING);
}
void loop() {
Serial.print("Impulsi contati: ");
Serial.println(conta_impulsi);
delay(1000);
}
void contaImpulso() {
conta_impulsi++;
}
✅ Este sketch usa la interrupción en el pin 2 (solo los pines 2 y 3 soportan interrupciones en Arduino UNO) para contar las interrupciones generadas por el disco codificador.
2. Cálculo de velocidad angular (RPM)
Supongamos que el disco tiene 20 ranuras (20 pulsos por giro completo):
volatile int impulsi = 0;
unsigned long tempo_precedente = 0;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), contaImpulso, RISING);
}
void loop() {
unsigned long tempo_attuale = millis();
if (tempo_attuale - tempo_precedente >= 1000) {
noInterrupts(); // disabilita gli interrupt per lettura sicura
int rpm = (impulsi * 60) / 20; // 20 fori -> 20 impulsi per rotazione
impulsi = 0;
interrupts(); // riattiva gli interrupt
Serial.print("RPM: ");
Serial.println(rpm);
tempo_precedente = tempo_attuale;
}
}
void contaImpulso() {
impulsi++;
}
📏 Guía de calibración y prueba
- Instalación física: Monta el sensor cerca del disco perforado en el motor. Asegúrate de que el haz infrarrojo atraviese los orificios del disco codificador.
- Alineación: El haz IR debe impactar exactamente en el intervalo entre los orificios. Una mala alineación reduce la fiabilidad de la lectura.
- Verificar funcionamiento: Usa el primer sketch para asegurarte de que los pulsos se estén leyendo correctamente.
- Medir RPM: Usa el segundo sketch para estimar la velocidad de rotación del disco.
💡 Consejos prácticos
- Usa discos codificador impresibles en 3D o adquiribles, con un número conocido de ranuras.
- Para mejorar la estabilidad, filtra eléctricamente la alimentación del módulo (por ejemplo, con un condensador de 100nF entre VCC y GND).
- El módulo también puede utilizarse para detectar objetos que pasan en una línea de producción (contar piezas).
📚 Recursos adicionales
- Encoder Wheel Generator (PDF) – crea discos codificador impresibles
- Arduino attachInterrupt() referencia
¡Perfecto! Ampliemos ahora la guía para incluir:
- ✅ Control de un motor DC con codificador IR
- ✅ Implementación de un control PID de velocidad
- ✅ Código completo y explicación
- ✅ Esquema funcional del sistema
🔁 Objetivo del proyecto
Realizar un control de velocidad en bucle cerrado para un motor DC, utilizando:
- Un módulo encoder IR digital para medir la velocidad
- Un algoritmo PID para mantener constante la velocidad deseada
- Un motor DC controlado por un módulo driver (ej. L298N, L9110, L293D)
🔩 Componentes adicionales necesarios
- 1x Motor DC
- 1x Disco Encoder con agujeros
- 1x Driver motor (ej. L298N o L9110S)
- 1x Alimentador externo (motor)
- 1x Potenciómetro (opcional, para ajustar la velocidad)
- Arduino UNO o compatible
🔌 Esquema eléctrico (con L298N)
| Componente | Conexión Arduino |
|---|---|
| Módulo IR Encoder | VCC → 5V, GND → GND, OUT → D2 |
| L298N IN1 | D8 |
| L298N IN2 | D9 |
| L298N ENA (PWM) | D10 (PWM) |
| Alimentación Motores | 12V externa |
🧠 Estructura del código: PID + Encoder + PWM
El PID regula la señal PWM para mantener constante la velocidad medida por el sensor encoder.
⚙️ 1. Declaraciones y biblioteca PID
Instala la biblioteca PID_v1 desde Arduino IDE (a través de Library Manager).
#include <PID_v1.h>
// PID Variables
double setpointRPM = 100; // Valore desiderato (impostabile)
double inputRPM = 0; // Valore letto dal sensore
double outputPWM = 0; // Output PID -> PWM
// PID tunings: Kp, Ki, Kd
PID myPID(&inputRPM, &outputPWM, &setpointRPM, 2.0, 5.0, 1.0, DIRECT);
📏 2. Impulsos del sensor
volatile int impulsi = 0;
void contaImpulso() {
impulsi++;
}
🔁 3. Setup
void setup() {
Serial.begin(9600);
// Encoder
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), contaImpulso, RISING);
// Motore
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
// Direzione motore fissa
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
// PID
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0, 255); // PWM range
}
🔄 4. Loop: cálculo RPM y control PID
unsigned long tPrecedente = 0;
int foriDisco = 20;
void loop() {
unsigned long tempo = millis();
// Calcola RPM ogni 100 ms
if (tempo - tPrecedente >= 100) {
noInterrupts();
int lettura = impulsi;
impulsi = 0;
interrupts();
inputRPM = (lettura * 600.0) / foriDisco; // 600 = 60 sec/min * 100ms
myPID.Compute(); // Calcola outputPWM
analogWrite(10, (int)outputPWM); // Controlla motore
// Debug seriale
Serial.print("Setpoint: "); Serial.print(setpointRPM);
Serial.print(" RPM -> Misurato: "); Serial.print(inputRPM);
Serial.print(" PWM: "); Serial.println(outputPWM);
tPrecedente = tempo;
}
}
🎛️ (Opcional) Control de velocidad mediante potenciómetro
setpointRPM = map(analogRead(A0), 0, 1023, 0, 300);
Conecta un potenciómetro entre 5V – A0 – GND para ajustar dinámicamente la velocidad deseada.
🧪 Ajuste del PID
Los valores iniciales de Kp, Ki, Kd deben adaptarse a tu motor y carga:
PID myPID(&inputRPM, &outputPWM, &setpointRPM, 2.0, 5.0, 1.0, DIRECT);
- Kp (Proporcional): aumenta para una respuesta más rápida
- Ki (Integral): corrige el error a largo plazo
- Kd (Derivativo): atenúa las oscilaciones
Comienza solo con Kp, luego agrega Ki, finalmente Kd.
✅ Resultado esperado
- El motor mantiene una velocidad constante aunque la tensión cambie o la carga varíe
- Puedes establecer la velocidad deseada modificando
setpointRPM - El sistema se autoregula con el algoritmo PID
🧩 Extensiones posibles
- 📈 Registra datos en tarjeta SD o monitor serial
- 🧭 Control PID en 2 motores para robot diferencial
- 🕹️ Control remoto de la velocidad por Bluetooth o Wi-Fi
- 📊 Interfaz gráfica en Processing o Python
Tutorial: Cómo usar Módulo Sensor de Velocidad Infrarrojo Encoder Digital
El módulo sensor de velocidad infrarrojo encoder digital es ideal para makers que desean medir la velocidad rotativa de un motor o de cualquier otro dispositivo giratorio. Es particularmente útil en proyectos como contadores de revoluciones, robots y drones.
Qué necesitas
- Arduino
- Motores de corriente continua
- Conexión USB para alimentación
Pasos
- Conectar los conectores del módulo al pin D2 del Arduino (verifica en el datasheet para la configuración exacta).
- Conecta el motor a la rueda o al eje en el que deseas medir la velocidad.
- Acercar el sensor infrarrojo al borde de la rueda de manera que capte las señales de paso.
- Escribir un sketch Arduino para leer los datos del sensor y calcular la velocidad rotativa (ver código a continuación).
- Compilar y ejecutar el sketch en tu Arduino.
- Verificar que la salida del sensor cumpla con las expectativas, ajustando la posición o la alimentación si es necesario.
- Conectar un display LCD (opcional) para visualizar los datos de velocidad en tiempo real.
- Implementar la lógica del proyecto para utilizar estos datos según sea necesario.
Código de ejemplo
const int encoderPin = 2;
void setup() {
pinMode(encoderPin, INPUT);
}
void loop() {
if (digitalRead(encoderPin) == HIGH) {
Serial.println("Impulso");
}
}
Miniproyecto
Realizar un contador de revoluciones para motores RC. Conectar el sensor al eje del motor y medir la velocidad durante la ejecución.
Errores comunes
- El sensor no detecta las señales: verifica que esté correctamente posicionado respecto al borde de la rueda.
- Lectura incorrecta de datos: asegúrate de haber configurado el pin correcto y de haber elegido la lógica adecuada para leer las señales.
- Velocidad no conforme a las expectativas: verifica la alimentación del motor y la posición del sensor.
Accesorios recomendados
- Display LCD
- Motores de corriente continua
- Rueda de prueba para motor RC
- Conexiones variadas
Preguntas frecuentes
¿El módulo puede usarse con otros microcontroladores?
Sí, el módulo es compatible con cualquier microcontrolador que soporte la entrada digital.
¿Qué tipos de motor puedo conectar al sensor?
Puedes utilizar cualquier tipo de motor paso a paso o de corriente continua, pero asegúrate de que sea compatible con tu circuito eléctrico.
¿Cómo puedo mejorar la precisión de la medición?
Coloca el sensor más cerca de la rueda y asegúrate de que no haya interferencias de luz ambiental.











Valoraciones
No hay valoraciones aún.