Arduino UNO R4 - Sensor de velocidad óptico ranurado IR

En esta guía, aprenderemos a usar el sensor de velocidad óptico ranurado IR con Arduino UNO R4. En detalle, aprenderemos:

Arduino UNO R4 y sensor de velocidad óptico ranurado IR

Acerca del sensor de velocidad óptico ranurado IR

Este pequeño módulo tiene forma de U. La gente también lo llama sensor óptico de horquilla. Un brazo tiene un LED infrarrojo. El otro brazo tiene un fototransistor NPN. Se miran de frente a través de un hueco de 5.9 mm. El sensor le dice al Arduino UNO R4 una cosa simple: ¿el hueco está vacío, o hay algo dentro?

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 CC
Salida digital (TTL), BAJO cuando está bloqueado, ALTO cuando está libre
Acondicionamiento de la señal disparador Schmitt integrado
Montaje orificios para tornillos M3 en ambos extremos
Pines 3 (VCC, GND, OUT)

Usos comunes:

  • Medir la velocidad de un motor (rpm) con un disco codificador, como un tacómetro.
  • Contar objetos o pulsos.
  • Medir la distancia contando las vueltas de una rueda.
  • Dar al robot información de la velocidad de la rueda.
  • Detectar un límite o una posición de inicio.

Pinout

Pinout del sensor de velocidad óptico ranurado IR

El módulo tiene tres pines:

  • Pin VCC: conéctalo a 5V del Arduino UNO R4 (el módulo acepta de 3.3V a 5V).
  • Pin GND: conéctalo a GND (0V).
  • Pin OUT: salida digital, conéctalo a un pin de entrada del Arduino UNO R4.

El orden de los pines puede cambiar de un lote a otro. Lee siempre las etiquetas impresas en tu módulo.

Cómo funciona

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

El LED IR ilumina la ranura todo el tiempo.

  • La ranura está vacía: la luz llega al fototransistor, así que el pin OUT está en ALTO.
  • La ranura está bloqueada por algo opaco (una tarjeta, un dedo, un diente de un disco codificador): la luz no puede pasar, así que el pin OUT está en BAJO.

El disparador Schmitt integrado convierte el nivel de luz bruto en un 0 o un 1 limpio. La señal no tiembla, así que no necesitas antirrebote por software.

Dos cosas pequeñas que debes saber:

  • El plástico transparente o el vidrio pueden dejar pasar la luz IR. Usa objetos opacos.
  • Algunos módulos de otros fabricantes funcionan al revés. Si tu placa dice "bloqueado" cuando la ranura está vacía, solo cambia BAJO y ALTO en el primer código. El código de rpm cuenta un flanco por ranura, así que funciona con los dos tipos.

Diagrama de Cableado

Solo se necesitan tres cables: VCC a 5V, GND a GND y OUT al pin 2 del Arduino UNO R4. El UNO R4 es una placa de 5V, así que la alimentación de 5V está bien aquí, y la señal OUT se mantiene en un nivel seguro.

Diagrama de cableado del Arduino UNO R4 con sensor de velocidad óptico ranurado IR

This image is created using Fritzing. Click to enlarge image

Ver La mejor forma de alimentar Arduino Uno R4 y otros componentes.

Usamos el pin 2 porque puede manejar una interrupción. El segundo código lo necesita.

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

Comprobar si la ranura está bloqueada (sondeo):

  • Configura como entrada el pin que se conecta al pin OUT:
pinMode(SENSOR_PIN, INPUT);
  • Lee el pin. BAJO significa bloqueado, ALTO significa libre:
int state = digitalRead(SENSOR_PIN);
  • Compara con la última lectura, para actuar solo cuando el estado cambia:
if (state != lastState) { // the slot just became blocked or clear }

Contar pulsos rápidos (interrupción):

  • Crea un contador. Márcalo como volatile porque la interrupción lo cambia:
volatile unsigned long pulseCount = 0;
  • Escribe una función pequeña que suma uno al contador:
void countPulse() { pulseCount++; }
  • Ejecuta esa función cada vez que la señal baja de ALTO a BAJO (un diente entra en la ranura):
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Una vez por segundo, copia y reinicia el contador con las interrupciones en pausa, y luego convierte los pulsos en rpm:
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); float rpm = pulses * 60.0 / SLOTS_PER_TURN;

¿Por qué esta fórmula? Con un disco de 20 ranuras, una vuelta completa produce 20 pulsos. Los pulsos en 1 segundo × 60 dan los pulsos por minuto. Divide entre 20 y obtienes las vueltas por minuto (rpm).

Código Arduino UNO R4 - Detectar un objeto en la ranura

Este sketch revisa el pin OUT una y otra vez. Imprime una línea solo cuando el estado cambia, y suma uno a un contador cada vez que la ranura se bloquea.

/* * Este código de Arduino UNO R4 fue desarrollado por es.newbiely.com * Este código de Arduino UNO R4 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino UNO R4 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

Sigue estas instrucciones paso a paso:

  • Si es la primera vez que usas el Arduino Uno R4 WiFi/Minima, consulta el tutorial sobre configurar el entorno para Arduino Uno R4 WiFi/Minima en el IDE de Arduino.
  • Conecta los componentes según el diagrama proporcionado.
  • Conecta la placa Arduino Uno R4 a tu computadora con un cable USB.
  • Lanza el IDE de Arduino en tu computadora.
  • Selecciona la placa Arduino Uno R4 adecuada (p. ej., Arduino Uno R4 WiFi) y el puerto COM.
  • Copia el código anterior y pégalo en el IDE de Arduino.
  • Haz clic en el botón Subir para enviar el código al Arduino UNO R4.
  • Abre el Monitor Serie y ajústalo a 9600 baudios.
  • Desliza un trozo de tarjeta (o tu dedo) en la ranura y luego sácalo. Hazlo unas cuantas veces.
  • Mira el resultado en el Monitor Serie.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 R4 WiFi on COM15
2

Cada paso produce dos líneas: una cuando la tarjeta entra y otra cuando sale. No se imprime ninguna línea mientras nada cambia.

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

El sondeo en loop() está bien para objetos lentos. Un disco que gira es mucho más rápido, y loop() podría perder algunos dientes. Por eso este sketch cuenta los pulsos con una interrupción en el flanco FALLING, lo que da exactamente un conteo por diente. Cada segundo imprime el número de pulsos y la velocidad en rpm.

La constante SLOTS_PER_TURN vale 20. Es el disco codificador común que viene con los motorreductores TT. Si tu disco tiene otro número de ranuras, cambia este valor.

/* * Este código de Arduino UNO R4 fue desarrollado por es.newbiely.com * Este código de Arduino UNO R4 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino UNO R4 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"); } }

Prepara el disco codificador

  • Fija el disco codificador al eje del motor o a la rueda.
  • Coloca el sensor de modo que los dientes del disco pasen por la ranura.
  • Asegúrate de que el disco no toque los brazos del sensor.
  • Puedes girar el disco con la mano, o alimentar el motor. El motor necesita su propio cableado. Para esa parte, consulta el tutorial Arduino UNO R4 - Motor de CC.

Pasos R\u00e1pidos

  • Mantén el mismo cableado de antes.
  • Copia el código de rpm de arriba y pégalo en el IDE de Arduino.
  • Haz clic en el botón Subir.
  • Abre el Monitor Serie a 9600 baudios.
  • Gira el disco y luego déjalo parar.
  • Mira la velocidad en el Monitor Serie. Aquí el motor funciona a unas 300 rpm:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 R4 WiFi on COM15
2

Comprueba una línea: 100 pulsos × 60 ÷ 20 = 300 rpm.

¿Quieres saber cuánto se ha movido una rueda? Multiplica el número de vueltas por la circunferencia de la rueda (π × diámetro de la rueda).

※ Nota:

  • Mantén corta la función de la interrupción. No llames a Serial.print() dentro de ella.
  • Cualquier variable que cambie la interrupción debe ser volatile.
  • ¿Necesitas detectar un objeto a distancia en lugar de dentro de una ranura? Prueba el sensor de evitación de obstáculos. ¿Necesitas una perilla que también dé el sentido de giro? Prueba el encoder 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!