Arduino Nano ESP32 - Sensor de velocidad óptico ranurado IR

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

Arduino Nano ESP32 y sensor de velocidad óptico ranurado IR

Hardware Requerido

1×Arduino Nano ESP32
1×Cable USB Tipo-A a Tipo-C (para PC USB-A)
1×Cable USB Tipo-C a Tipo-C (para PC USB-C)
1×IR Slotted Optical Speed Sensor
1×Cables Puente
1×(Opcional) Breadboard
1×(Opcional) Conector de Alimentación DC
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 ESP32

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

Mira el sensor de lado y verás la letra U. Dentro de las paredes izquierda y derecha de esa U, dos piezas diminutas se miran una a la otra: un LED infrarrojo en una pared y un fototransistor NPN en la otra. El espacio abierto entre ellas mide 5,9 mm de ancho. Algunos vendedores llaman a esta pieza interruptor óptico, sensor óptico de horquilla o simplemente sensor de ranura IR. Es lo mismo.

Cómo funciona

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

Piensa en él como una pequeña puerta de luz. El LED nunca se apaga, y el fototransistor vigila su luz todo el tiempo.

  • Nada en la ranura → el fototransistor recibe la luz → OUT lee ALTO.
  • Un objeto sólido en la ranura (una tira de cartulina, la yema de un dedo, un diente de un disco codificador) → la luz se corta → OUT lee BAJO.

En el módulo hay un disparador Schmitt. Convierte el nivel de luz en un 0 o un 1 limpio, sin rebotes entre ellos. Por eso, tu programa no necesita ningún código antirrebote.

Ten en cuenta:

  • El vidrio y el plástico transparente pueden dejar pasar la luz infrarroja, así que el sensor puede no verlos. Elige algo por lo que la luz no pueda pasar.
  • Algunos módulos de otras marcas usan lógica invertida: BAJO cuando la ranura está vacía. Si el primer programa de abajo indica "bloqueado" con la ranura vacía, cambia BAJO y ALTO en ese programa. El programa de velocidad funciona con ambos tipos, porque cuenta un flanco por diente.

Especificaciones

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

Dónde se usa:

  • Un tacómetro: pon un disco codificador en un motor y lee sus rpm.
  • Información sobre qué tan rápido gira la rueda de un robot.
  • Contar piezas, pulsos u objetos en una cinta.
  • Calcular la distancia contando cuántas veces gira una rueda.
  • Un final de carrera o interruptor de posición inicial sin contactos móviles.

Diagrama de pines

Diagrama de pines del sensor de velocidad óptico ranurado IR
  • Pin OUT: la señal digital. Conéctalo a una entrada digital del Arduino Nano ESP32 (D2 en esta guía).
  • Pin GND: conéctalo a GND (0 V).
  • Pin VCC: conéctalo al pin de 3,3 V del Arduino Nano ESP32. El módulo funciona con cualquier voltaje entre 3,3 V y 5 V.

Los lotes no son todos iguales, y los tres pines pueden venir en otro orden. Confía en las etiquetas de tu propia placa, no en el orden de una imagen.

Diagrama de Cableado

El Nano ESP32 funciona con lógica de 3,3 V, y sus pines de entrada no están hechos para 5 V. La señal OUT sube hasta el voltaje que hay en VCC, así que alimentamos el sensor desde el pin de 3,3 V y no desde 5 V. De esta forma, D2 nunca ve más de 3,3 V.

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

This image is created using Fritzing. Click to enlarge image

D2 también acepta una interrupción, que el programa de velocidad usa más adelante.

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

Hay dos formas de leer este sensor. Cuál conviene depende de lo rápido que pasen los objetos por la ranura.

Forma 1 - leer el pin en loop() (buena para objetos lentos):

  • Indica a la placa que D2 es una entrada.
pinMode(SENSOR_PIN, INPUT);
  • Haz una lectura. Un valor BAJO significa que la ranura está bloqueada.
int state = digitalRead(SENSOR_PIN);
  • Haz algo solo cuando la nueva lectura no sea igual a la anterior, y luego guárdala para la próxima vez.
if (state != lastState) { // the gap just changed: blocked or clear lastState = state; }

Forma 2 - deja que una interrupción cuente (necesaria para un disco que gira):

  • Crea el contador con la palabra volatile, porque la función de interrupción lo cambia en segundo plano.
volatile unsigned long pulseCount = 0;
  • Escribe la función de interrupción. En el chip ESP32, añade IRAM_ATTR antes de su nombre. Esto pone la función en la RAM interna rápida del chip, así que puede ejecutarse al instante, cada vez.
void IRAM_ATTR countPulse() { pulseCount++; }
  • Enlaza la función con D2. FALLING significa que la función se ejecuta cuando OUT baja de ALTO a BAJO, lo que ocurre una vez cada vez que un diente entra en la ranura.
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Cada segundo, toma la cuenta, ponla a cero y conviértela en rpm.
unsigned long pulses = pulseCount; pulseCount = 0; float rpm = pulses * 60.0 / SLOTS_PER_TURN;

¿Cómo funciona la cuenta? Digamos que el disco tiene 20 ranuras. Entonces 20 pulsos son una vuelta completa. Multiplica los pulsos de un segundo por 60 y tendrás los pulsos por minuto. Divide eso entre 20 y tendrás las vueltas por minuto, que son las rpm.

Código del Arduino Nano ESP32 - Contar objetos que pasan por la ranura

El programa de abajo lee D2 una y otra vez. Aparece una línea nueva en el Monitor Serie solo cuando la ranura cambia de libre a bloqueada, o al revés. Cada vez que se bloquea, el contador sube en uno.

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

  • ¿Eres nuevo con el Nano ESP32? Primero consulta cómo configurar el Arduino Nano ESP32 en el IDE de Arduino.
  • Conecta los componentes según el diagrama. Comprueba bien que VCC va a 3,3 V.
  • Conecta el Arduino Nano ESP32 a tu ordenador con el cable Type-C.
  • Inicia el IDE de Arduino en tu ordenador.
  • Selecciona la placa Arduino Nano ESP32 (por ejemplo, Arduino Nano ESP32) y su puerto COM.
  • Pega el código en un nuevo sketch.
  • Pulsa el botón Subir y espera a que termine.
  • Abre el Monitor Serie y elige 9600 baudios.
  • Mete una tira de cartulina en la ranura, mantenla un momento y sácala. Repite dos veces más.
  • Lee los mensajes:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' 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 ESP32 on COM15
2

La cartulina produce una línea "blocked" al entrar y una línea "clear" al salir. Mientras la mantienes quieta, la pantalla no muestra nada nuevo.

Código del Arduino Nano ESP32 - Leer la velocidad del motor (rpm)

Un disco rápido puede hacer pasar muchos dientes por la ranura entre dos pasadas de loop(), así que el sondeo perdería algunos. Este programa usa una interrupción. La función countPulse() está marcada con IRAM_ATTR para que el ESP32 la guarde en memoria rápida y pueda saltar a ella de inmediato. Una vez por segundo, el programa muestra cuántos pulsos recibió y la velocidad en rpm.

Busca SLOTS_PER_TURN cerca del principio. Vale 20, el número de ranuras del disco codificador que suele venir con los motorreductores TT. Cuenta las ranuras de tu propio disco y pon aquí ese número si no es 20.

/* * Este código de Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = D2; // Arduino Nano ESP32 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 IRAM_ATTR 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(); unsigned long pulses = pulseCount; // read and reset the counter pulseCount = 0; 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"); } }

Montar el disco codificador

  • Empuja el disco sobre el eje del motor (o únelo a la rueda).
  • Alinea el sensor para que el borde del disco, con sus dientes, pase dentro de la ranura.
  • Gira el disco despacio con la mano para asegurarte de que nunca roza las paredes de la U.
  • Para hacerlo girar, usa la mano o haz funcionar el motor. El motor tiene su propio cableado, explicado en el tutorial Arduino Nano ESP32 - Motor de CC.

Pasos R\u00e1pidos

  • No cambies el cableado del sensor.
  • Pega el código de rpm en el IDE de Arduino.
  • Pulsa Subir.
  • Abre el Monitor Serie a 9600 baudios.
  • Haz girar el disco y luego déjalo parar.
  • Mira los números. En esta prueba el motor gira a unas 300 rpm:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' 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 ESP32 on COM15
2

Prueba la cuenta con la línea de 101: 101 × 60 ÷ 20 = 303 rpm. La primera y la última línea muestran 0 porque el disco no se mueve.

Para la rueda de un robot, también puedes calcular cuánto ha rodado: número de vueltas × π × diámetro de la rueda.

※ Nota:

  • Pon muy poco código dentro de countPulse(). Nunca imprimas desde ella.
  • Toda variable que cambie la función de interrupción necesita la palabra clave volatile.
  • Mantén IRAM_ATTR delante de la función de interrupción, para que se quede en memoria rápida.
  • Para detectar un objeto delante del sensor (no dentro de una ranura), consulta el tutorial del sensor de obstáculos. Para una perilla que también indica la dirección, consulta el tutorial del 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

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!