Arduino Nano - Sensor de velocidad óptico ranurado IR
Este tutorial te enseña cómo usar Arduino Nano para leer el sensor de velocidad óptico ranurado IR, una pequeña pieza en forma de U que avisa a la placa cuando algo pasa por su ranura. En detalle, aprenderemos:
- Cómo conectar Arduino Nano al sensor de velocidad óptico ranurado IR en una protoboard
- Cómo programar Arduino Nano para contar cada objeto que pasa por la ranura
- Cómo programar Arduino Nano para calcular la velocidad de un motor en rpm, usando un disco codificador y el pin de interrupción D2
Te sugerimos:
- Usar un codificador rotatorio si estás construyendo una perilla que se gira con la mano, o si tu proyecto necesita saber hacia dónde gira algo.
- Usar un sensor infrarrojo de evitación de obstáculos si el objeto que quieres detectar está al aire libre y no pasará por una ranura pequeña.

Hardware Requerido
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Acerca del sensor de velocidad óptico ranurado IR
Esta pieza tiene muchos nombres: sensor de ranura, sensor óptico de horquilla, interruptor óptico o sensor IR en forma de U. Todos significan lo mismo. Es una barrera de luz. Una luz brilla de un lado de la ranura al otro, y el módulo informa si esa luz llega o no.
Cómo detecta un objeto

Mira los dos brazos de la "U". El primer brazo tiene un LED infrarrojo dentro. El segundo brazo tiene un fototransistor NPN dentro. Se miran de frente a través de una ranura de 5.9 mm.
Solo hay dos casos:
- La ranura está vacía. El fototransistor ve la luz infrarroja, así que el módulo pone OUT en ALTO.
- Algo opaco está en la ranura, como una tira de cartón o un diente de un disco codificador. La luz no puede pasar, así que el módulo pone OUT en BAJO.
El módulo también tiene un disparador Schmitt a bordo. Su trabajo es convertir el nivel de luz bruto en un 0 o un 1 limpio. Como los flancos ya son limpios, el sketch de tu Arduino Nano no necesita código antirrebote.
Dos cosas que debes recordar:
- El plástico transparente o el vidrio pueden dejar pasar la luz infrarroja. Prueba con algo a través de lo cual no puedas ver.
- Algunos módulos de otras marcas funcionan al revés (BAJO cuando está vacío). Si el tuyo es así, cambia LOW y HIGH en el primer sketch. El sketch de rpm cuenta un flanco por cada ranura, así que da la respuesta correcta con ambos tipos.
Especificaciones
| Sensor de velocidad óptico ranurado IR | |
|---|---|
| Tipo de sensor | Fotoeléctrico de tipo 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 señal | Disparador Schmitt integrado |
| Montaje | Agujeros para tornillos M3 en ambos extremos |
| Pines | 3 (VCC, GND, OUT) |
Encontrarás este sensor en proyectos como estos: un tacómetro para un motor pequeño, la medición de velocidad de rueda en un coche robot, un contador de piezas en una cinta, un fin de carrera que avisa a una pieza en movimiento que llegó a su límite, y un odómetro simple que cuenta cuántas veces ha girado una rueda.
Esquema de pines del sensor de velocidad óptico ranurado IR

Del módulo salen solo tres pines:
- Pin VCC: debe conectarse al pin 5V de Arduino Nano
- Pin GND: debe conectarse a GND (0V)
- Pin OUT: la línea de señal digital; debe ir a un pin de entrada de Arduino Nano (D2 en este tutorial)
※ Nota:
La disposición de los pines de un módulo puede ser diferente de un fabricante a otro, e incluso el orden puede cambiar entre dos lotes del mismo producto. Es esencial consultar siempre las etiquetas impresas en el módulo cuando lo uses. ¡Míralas con atención!
Convertir pulsos en velocidad
Por sí solo, el sensor solo ve "algo" o "nada". Para leer la velocidad, agregamos un disco codificador. Es una rueda delgada con agujeros en su borde. Se coloca en el eje del motor, y su borde gira a través de la ranura. Cada diente corta el haz una vez, así que el pin OUT da un pulso BAJO por cada diente.
El disco que viene con la mayoría de los motores reductores TT tiene 20 ranuras. Así que 20 pulsos significan una vuelta completa. Si Arduino Nano cuenta los pulsos durante un segundo, la cuenta es:
RPM = (pulsos en un segundo x 60) / 20
El "x 60" cambia segundos a minutos. El "/ 20" cambia pulsos a vueltas.
Diagrama de Cableado
Coloca el Arduino Nano en el centro de la protoboard, y luego pasa tres cables puente desde el sensor: VCC a 5V, GND a GND y OUT a D2, como muestra la imagen de abajo.

This image is created using Fritzing. Click to enlarge image
Ver La mejor forma de alimentar Arduino Nano y otros componentes.
El Nano es una placa de 5V, así que tomamos la alimentación de su pin 5V. La señal OUT se mueve entonces entre 0V y 5V, y eso coincide exactamente con los pines de entrada del Nano. No necesitas un convertidor de nivel ni ninguna resistencia extra.
Cómo programar para el sensor de velocidad óptico ranurado IR
No necesitas instalar una biblioteca. Los dos sketches usan solo funciones que ya son parte del núcleo de Arduino.
Parte 1: comprobar la ranura con digitalRead()
- El primer paso es indicar el pin de Arduino Nano que está conectado a OUT:
- Dentro de setup(), ese pin se configura como entrada. El módulo maneja la línea por sí mismo, así que basta un INPUT simple:
- Dentro de loop(), el pin se lee una y otra vez. Un valor BAJO nos dice que el haz está cortado:
- El sketch guarda el último valor en lastState. Imprime y cuenta solo cuando el valor nuevo no es igual al anterior, así que un objeto da una cuenta, aunque se quede en la ranura mucho tiempo.
Parte 2: capturar pulsos rápidos con una interrupción
Arduino Nano tiene solo dos pines que pueden activar una interrupción externa: D2 y D3. Por eso el sensor va a D2. Cualquier otro pin digital sirve para la Parte 1, pero no para la Parte 2.
- El contador de pulsos se declara con la palabra clave volatile. Esto le dice al compilador que el valor puede cambiar en cualquier momento, desde fuera del flujo normal de loop():
- La rutina de interrupción hace un trabajo pequeño. Suma 1 al contador y termina:
- En setup(), la rutina se enlaza a D2. La opción FALLING la activa en el momento en que OUT baja de ALTO a BAJO. Ese es el momento en que un diente entra en la ranura, así que cada diente se cuenta una vez:
- Una vez por segundo, el sketch copia el contador y lo pone de nuevo en cero. El chip ATmega328P del Nano maneja 8 bits a la vez, así que copiar un número de 4 bytes toma varios pasos. noInterrupts() e interrupts() aseguran que un pulso nuevo no pueda cambiar el número a la mitad de la copia:
- El último paso usa la fórmula de arriba:
Código de Arduino Nano para contar objetos en la ranura
El sketch de abajo lee D2 en loop(). Cada vez que un objeto nuevo corta el haz, suma uno a la cuenta y la imprime. Cuando la ranura vuelve a estar vacía, imprime un mensaje corto.
Pasos R\u00e1pidos
- Si es la primera vez que usas Arduino Nano, consulta cómo configurar el entorno para Arduino Nano en el IDE de Arduino.
- Conecta los componentes como se muestra en el diagrama.
- Conecta la placa Arduino Nano a tu computadora con un cable USB.
- Abre el IDE de Arduino en tu computadora.
- Elige la placa Arduino Nano y el puerto COM que está usando. Si la carga falla más tarde, prueba ATmega328P (Old Bootloader) en el menú Procesador.
- Pega el código de arriba en un sketch nuevo.
- Pulsa el botón Subir y espera el mensaje "Done uploading".
- Abre el Monitor Serie y elige 9600 baudios.
- Desliza un trozo de cartón, o un dedo, en la ranura y sácalo otra vez. Hazlo tres veces.
- Mira los mensajes en el Monitor Serie.
¿Ves "blocked" mientras la ranura está vacía? Entonces tu módulo tiene lógica invertida. Cambia las comprobaciones de LOW y HIGH en el código y vuelve a subirlo.
Código de Arduino Nano para medir la velocidad del motor (rpm)
Un motor con un disco de 20 ranuras puede hacer cientos de pulsos por segundo. La lectura continua puede perder algunos, por ejemplo mientras Serial.print() está ocupado enviando texto. Con una interrupción, el Nano pausa su trabajo actual por un tiempo muy corto, cuenta el pulso y sigue. Cada diente se cuenta.
El sketch imprime el número de pulsos y las rpm una vez por segundo. La constante SLOTS_PER_TURN es 20. Si tu disco tiene un número diferente de agujeros, cuéntalos y pon ese número en el código.
Pasos R\u00e1pidos
- No cambies el cableado del primer sketch. OUT debe seguir en D2. D3 es la única otra opción en el Nano; si la usas, pon SENSOR_PIN en 3.
- Monta el disco codificador en el eje del motor o en la rueda. Aliníalo para que los dientes pasen por el centro de la ranura y no rocen el plástico.
- Pega el código de rpm en el IDE de Arduino y súbelo al Nano.
- Abre el Monitor Serie a 9600 baudios.
- Gira el disco con la mano, o enciende el motor. El tutorial Arduino Nano - Motor de CC muestra cómo manejar un motor desde el Nano.
- Lee la velocidad en el Monitor Serie.
Aquí el motor gira a unas 300 rpm. Toma la línea con 98 pulsos: 98 x 60 = 5880 pulsos por minuto, y 5880 / 20 = 294 rpm. Las líneas con 0 al principio y al final se imprimieron antes de que el motor arrancara y después de que se detuviera.
Buenos hábitos para el código de interrupciones en el Nano:
- Marca como volatile cada variable que cambie la rutina de interrupción.
- Mantén la rutina muy pequeña. Nunca pongas delay() ni Serial.print() dentro de ella.
- Quédate con FALLING. CHANGE se activaría dos veces por diente y duplicaría tus rpm.
Conocimiento adicional
¿Qué sensor debes elegir?
Un sensor de ranura, un sensor IR de obstáculos y un codificador rotatorio pueden dar pulsos a Arduino Nano. Aun así, cada uno resuelve un problema diferente. Hazte estas preguntas:
- ¿El objeto pasa por una ranura pequeña y fija (el diente de un disco, una lengüeta en una pieza móvil)? Elige el sensor de velocidad óptico ranurado IR. Da una señal digital limpia por cada paso.
- ¿El objeto está en algún lugar frente al sensor, no dentro de una ranura (una pared, una mano, una caja sobre una mesa)? Elige el sensor IR de evitación de obstáculos. Ve la luz reflejada en espacio abierto.
- ¿Una persona gira una perilla y el código necesita el sentido (izquierda o derecha)? Elige el codificador rotatorio. Tiene dos salidas (CLK y DT) y un pulsador.
Es evidente que el sensor ranurado da la cuenta más confiable para piezas que giran rápido, ya que el objetivo siempre cruza la misma ranura de 5.9 mm en el mismo lugar. Su único límite es que no puede decir el sentido de giro.
Dos ruedas, dos sensores
Un coche robot pequeño suele tener dos ruedas motrices. El Nano tiene exactamente dos pines de interrupción, así que un sensor puede ir en D2 y un segundo sensor en D3. Cada sensor necesita entonces su propio contador y su propia rutina de interrupción. Ten esto en cuenta antes de planear el resto del robot: si D2 y D3 ya los usan otras piezas, mueve esas piezas a otros pines, porque ningún otro pin del Nano puede hacer este trabajo.
Solución de problemas
| Problema | Qué comprobar |
|---|---|
| La cuenta nunca cambia | Comprueba que OUT va a D2 y VCC va a 5V. Lee las etiquetas de los pines de tu módulo, porque el orden no es igual en todos los lotes. |
| "Blocked" cuando la ranura está vacía | Tu módulo usa lógica invertida. Cambia LOW y HIGH en el primer sketch. |
| Las rpm siempre son 0 | Los dientes del disco pueden no llegar a la ranura. Mueve el sensor para que los dientes pasen por el centro de la ranura. |
| Las rpm suben y bajan | Asegúrate de que el disco esté firme en el eje y no se mueva ni toque el sensor. |
| Las rpm son demasiado altas o bajas | SLOTS_PER_TURN no coincide con tu disco. Cuenta los agujeros y corrige la constante. |
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.