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:

Te sugerimos:

Sensor de velocidad óptico ranurado IR con Arduino Nano

Hardware Requerido

1×Official Arduino Nano
1×Alternatively, DIYables Nano V3.0 Development Board
1×Cable USB A a Mini-B
1×IR Slotted Optical Speed Sensor
1×Cables Puente
1×(Opcional) Breadboard
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para Arduino Nano
1×(Recomendado) Placa de Expansión Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentación para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

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

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

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

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.

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

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:
const int SENSOR_PIN = 2;
  • 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:
pinMode(SENSOR_PIN, INPUT);
  • Dentro de loop(), el pin se lee una y otra vez. Un valor BAJO nos dice que el haz está cortado:
int state = digitalRead(SENSOR_PIN);
  • 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():
volatile unsigned long pulseCount = 0;
  • La rutina de interrupción hace un trabajo pequeño. Suma 1 al contador y termina:
void countPulse() { pulseCount++; }
  • 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:
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • 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:
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts();
  • El último paso usa la fórmula de arriba:
float rpm = pulses * 60.0 / SLOTS_PER_TURN;

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.

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

  • 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.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

¿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.

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

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.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

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.

Referencias de Funciones

Tutoriales Relacionados

※ 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!