Arduino - Sensor de velocidad óptico ranurado IR

En este tutorial, vamos a aprender:

Sensor de velocidad óptico ranurado IR para Arduino

Acerca del sensor de velocidad óptico ranurado IR

El sensor de velocidad óptico ranurado IR es un pequeño módulo en forma de U. También se llama sensor de ranura, interruptor óptico o sensor IR en forma de U. Le dice a Arduino si hay algo dentro de su ranura o no. Con un disco codificador, también puede decir a qué velocidad gira un motor o una rueda.

Sensor de velocidad óptico ranurado IR
Tipo de sensor fotoeléctrico de ranura (LED IR + fototransistor NPN)
Ancho de la ranura 5.9 mm
Voltaje de funcionamiento 3.3V a 5V DC
Salida digital (TTL), LOW cuando está bloqueado, HIGH cuando está libre
Acondicionamiento de la señal disparador Schmitt integrado
Montaje orificios para tornillos M3 en ambos extremos
Pines 3 (VCC, GND, OUT)

Puedes usarlo para:

  • Medir la velocidad de un motor (rpm) con un disco codificador
  • Hacer un tacómetro
  • Contar objetos o pulsos
  • Medir la distancia contando las vueltas de una rueda
  • Obtener la velocidad de las ruedas de un robot
  • Detectar un límite o una posición

Pinout

Pinout del sensor de velocidad óptico ranurado IR

El sensor de velocidad óptico ranurado IR tiene tres pines:

  • Pin VCC: debe conectarse a VCC (5V o 3.3V)
  • Pin GND: debe conectarse a GND (0V)
  • Pin OUT: es un pin de salida digital. Está en LOW cuando la ranura está bloqueada y en HIGH cuando la ranura está libre. Este pin debe conectarse a un pin de entrada de Arduino.

El orden de los pines puede ser diferente entre lotes. Lee las etiquetas de tu módulo.

Cómo funciona

Cómo funciona el sensor de velocidad óptico ranurado IR

Un lado de la U tiene un LED infrarrojo. El otro lado tiene un fototransistor NPN. Se miran de frente a través de la ranura de 5.9 mm.

  • Cuando la ranura está vacía, la luz IR llega al fototransistor. El pin OUT está en HIGH.
  • Cuando un objeto opaco (un trozo de cartulina o un diente de un disco codificador) entra en la ranura, bloquea la luz. El pin OUT está en LOW.

El disparador Schmitt integrado hace que la salida sea un 0 o un 1 limpio y estable, sin fluctuaciones. Por eso no necesitamos filtrar rebotes en el código.

Algunos consejos:

  • Usa objetos opacos. Un objeto transparente puede no bloquear bien la luz IR.
  • Algunos módulos de otros fabricantes funcionan al revés. Si tu sensor indica "bloqueado" cuando la ranura está vacía, solo cambia LOW y HIGH en el primer código. El código de rpm cuenta un flanco por diente, así que funciona de las dos formas.

Medir la velocidad con un disco codificador

Un disco codificador es una placa redonda con ranuras (orificios) cerca del borde. El disco común para los motorreductores TT tiene 20 ranuras. Fija el disco en el eje del motor o en la rueda, de modo que sus dientes pasen por la ranura del sensor sin tocarla.

Cuando el disco gira, cada diente bloquea la luz por un momento. El pin OUT da un pulso por diente. Una vuelta completa da 20 pulsos. Arduino cuenta los pulsos en 1 segundo y luego calcula la velocidad:

  • Pulsos en 1 segundo × 60 = pulsos en 1 minuto
  • Pulsos en 1 minuto ÷ 20 = vueltas en 1 minuto (rpm)

Diagrama de Cableado

Conecta VCC del sensor a 5V de Arduino, GND a GND, y OUT al pin 2 de Arduino, como se muestra en la imagen de abajo.

Diagrama de cableado de Arduino con el sensor de velocidad óptico ranurado IR

This image is created using Fritzing. Click to enlarge image

Usamos el pin 2 porque es un pin de interrupción en Arduino Uno. El código de rpm lo necesita.

Cómo programar el sensor de velocidad óptico ranurado IR

  • No se necesita biblioteca: el código usa solo funciones integradas.
  • Define el pin: const int SENSOR_PIN = 2;
  • Configura el pin como entrada con pinMode(): pinMode(SENSOR_PIN, INPUT);
  • Lee el estado con digitalRead(): int state = digitalRead(SENSOR_PIN);
  • Comprueba el estado: if (state == LOW) significa que hay algo en la ranura. HIGH significa que la ranura está libre.
  • Para contar pulsos rápidos, usa una interrupción. Cada vez que el pin OUT pasa de HIGH a LOW (un diente bloquea la ranura), Arduino ejecuta una función pequeña: attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Mantén el contador como volatile, porque cambia dentro de la interrupción: volatile unsigned long pulseCount = 0;
  • Cada 1 segundo, convierte los pulsos en rpm: float rpm = pulses * 60.0 / SLOTS_PER_TURN;

¿Por qué usar una interrupción? Cuando el motor gira rápido, los pulsos son muy cortos. Si solo revisamos el pin en loop(), podemos perder algunos. La interrupción captura todos los pulsos. Usamos FALLING para que cada diente se cuente una sola vez.

Código de Arduino - Detectar un objeto en la ranura

El código de abajo hace estas cosas:

  • Lee el pin OUT una y otra vez
  • Imprime un mensaje solo cuando cambia el estado
  • Cuenta cuántas veces se bloquea la ranura
/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino pin connected to the OUT pin of the speed sensor int lastState; // the previous state of the sensor int objectCount = 0; // how many times the slot was blocked void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); lastState = digitalRead(SENSOR_PIN); } void loop() { int state = digitalRead(SENSOR_PIN); if (state != lastState) { // the state has changed if (state == LOW) { // LOW = something is in the slot objectCount++; Serial.print("The slot is blocked - count: "); Serial.println(objectCount); } else { // HIGH = the slot is clear Serial.println("The slot is clear"); } lastState = state; } }

Pasos R\u00e1pidos

  • Haz el cableado como se muestra en el diagrama de arriba.
  • Conecta Arduino al PC mediante el cable USB.
  • Abre Arduino IDE. Ve al menú Tools, y selecciona la placa y el puerto correctos.
  • Copia el código de arriba y pégalo en Arduino IDE.
  • Haz clic en el botón Subir de Arduino IDE para cargar el código en Arduino.
  • Abre el Monitor Serie (velocidad 9600 baudios).
  • Pasa un trozo de cartulina o tu dedo por la ranura varias veces.
  • Mira el resultado en el Monitor Serie.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The slot is blocked - count: 1 The slot is clear The slot is blocked - count: 2 The slot is clear The slot is blocked - count: 3 The slot is clear
Ln 11, Col 1
Arduino Uno on COM15
2

Código de Arduino - Medir la velocidad del motor (rpm)

El código de abajo hace estas cosas:

  • Cuenta un pulso cada vez que un diente del disco bloquea la ranura (interrupción en el flanco FALLING)
  • Cada 1 segundo, calcula la velocidad en rpm
  • Imprime el número de pulsos y la velocidad
/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino pin connected to the OUT pin of the speed sensor const int SLOTS_PER_TURN = 20; // number of slots (holes) in the encoder disc volatile unsigned long pulseCount = 0; // changed inside the interrupt unsigned long lastTime = 0; // runs every time a tooth of the disc blocks the slot void countPulse() { pulseCount++; } void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING); } void loop() { if (millis() - lastTime >= 1000) { // every 1 second lastTime = millis(); noInterrupts(); // read and reset the counter safely unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); float rpm = pulses * 60.0 / SLOTS_PER_TURN; // pulses per second -> turns per minute Serial.print("Pulses: "); Serial.print(pulses); Serial.print(" | Speed: "); Serial.print(rpm); Serial.println(" RPM"); } }

El código usa SLOTS_PER_TURN = 20. Si tu disco codificador tiene un número diferente de ranuras, cambia este número.

Pasos R\u00e1pidos

  • Fija el disco codificador en el eje del motor o en la rueda, de modo que sus dientes pasen por la ranura.
  • Mantén el mismo cableado que en el primer código.
  • Copia el código de arriba, pégalo en Arduino IDE y cárgalo.
  • Gira el disco con la mano, o enciende el motor. Para controlar el motor, consulta Arduino - Motor de corriente continua.
  • Mira el resultado en el Monitor Serie. El ejemplo de abajo es un motor que gira a unas 300 rpm.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Pulses: 0 | Speed: 0.00 RPM Pulses: 98 | Speed: 294.00 RPM Pulses: 101 | Speed: 303.00 RPM Pulses: 100 | Speed: 300.00 RPM Pulses: 99 | Speed: 297.00 RPM Pulses: 0 | Speed: 0.00 RPM
Ln 11, Col 1
Arduino Uno on COM15
2

Por ejemplo, 100 pulsos en 1 segundo dan 100 × 60 ÷ 20 = 300 rpm.

¿Quieres saber la distancia que recorre una rueda? Multiplica el número de vueltas por la circunferencia de la rueda (π × diámetro de la rueda).

Si quieres detectar un objeto a distancia (no dentro de una ranura), consulta Arduino - Sensor de evitación de obstáculos infrarrojo. Si quieres leer una perilla y su dirección, consulta Arduino - Codificador rotatorio.

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

Referencias de funciones

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!