ESP32 - Sensor de velocidad óptico ranurado IR

Este tutorial te enseña cómo usar el ESP32 para leer el estado de un sensor de velocidad óptico ranurado IR, contar los objetos que pasan por su ranura y convertir los pulsos de un disco codificador en la velocidad de un motor en rpm, que se imprime en el Monitor Serie.

ESP32 y sensor de velocidad óptico ranurado IR

Acerca del sensor de velocidad óptico ranurado IR

Este pequeño módulo tiene forma de U con una ranura estrecha en el medio. Se le llama de muchas formas: sensor óptico de horquilla (fotointerruptor), interruptor óptico, sensor IR en forma de U o simplemente sensor de ranura. Hace un solo trabajo. Le dice al ESP32 si hay algo dentro de la ranura o no. Como puede conmutar muy rápido, es una buena opción para medir la velocidad de giro de una rueda o un motor.

Sensor de velocidad óptico ranurado IR
El tipo de sensor fotoeléctrico de ranura (LED IR + fototransistor NPN)
El ancho de la ranura 5,9 mm
La salida digital (TTL), LOW cuando está bloqueado, HIGH cuando está libre
El acondicionamiento de la señal disparador Schmitt integrado
El montaje orificios para tornillos M3 en ambos extremos
El número de pines 3 (VCC, GND, OUT)
Voltaje de operación 3,3V a 5V CC

Los usos típicos son la medición de la velocidad de un motor (rpm) con un disco codificador, un tacómetro simple, el conteo de objetos o pulsos, la medición de distancia contando las vueltas de una rueda, la retroalimentación de velocidad de rueda para un coche robot, y la detección de límite o de posición.

Pinout del sensor de velocidad óptico ranurado IR

Pinout del sensor de velocidad óptico ranurado IR
  • Pin VCC: conecta este pin al pin 3,3V del ESP32
  • Pin GND: conecta este pin a GND (0V)
  • Pin OUT: conecta este pin a un pin de entrada del ESP32 (GPIO18 en este tutorial). Da LOW cuando la ranura está bloqueada y HIGH cuando está libre

El orden de los pines no siempre es el mismo de un lote a otro. Lee las etiquetas impresas en tu propio módulo antes de conectar los cables.

El pin OUT llega al mismo voltaje que le das a VCC. El ESP32 es una placa de 3,3V, así que alimenta el sensor desde el pin de 3,3V, no desde 5V. De esta forma, el pin OUT nunca envía más de 3,3V al pin GPIO.

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

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

Un brazo de la U tiene un LED infrarrojo. El otro brazo tiene un fototransistor NPN. Los dos se miran de frente a través de la ranura de 5,9 mm.

  • Nada en la ranura: la luz IR llega al fototransistor, y el pin OUT está en HIGH.
  • Un objeto opaco en la ranura, como un trozo de cartulina o un diente de un disco codificador: la luz se corta, y el pin OUT está en LOW.

Un disparador Schmitt en la placa convierte el nivel de luz bruto en un 0 o un 1 limpio, sin temblores entre los dos. Gracias a él, el código del ESP32 no necesita ningún antirrebote.

El plástico transparente puede dejar pasar la luz IR, así que no siempre se detecta como bloqueado. Usa objetos que no sean transparentes.

Algunos módulos de otros fabricantes funcionan al revés. Si tu sensor dice "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 cada ranura del disco, así que funciona con ambos tipos.

Diagrama de cableado

Cómo conectar el ESP32 y el sensor de velocidad óptico ranurado IR

Solo se necesitan tres cables. Conecta VCC a 3,3V, GND a GND y OUT a GPIO18. Puedes conectar los cables directamente a los pines, o usar una protoboard si lo prefieres.

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

This image is created using Fritzing. Click to enlarge image

Si no sabe c\u00f3mo alimentar ESP32 y otros componentes, encuentre instrucciones en el siguiente tutorial: C\u00f3mo alimentar ESP32.

Sensor de velocidad óptico ranurado IR ESP32
VCC 3.3V
GND GND
OUT GPIO18

Cómo preparar el disco codificador para medir la velocidad

Para medir la velocidad, el sensor necesita algo que corte la luz una y otra vez mientras gira. Ese es el trabajo del disco codificador. Fija el disco en el eje del motor o en la rueda, y luego fija el sensor con sus orificios M3 para que los dientes del disco pasen por la ranura. El disco no debe tocar el sensor en ningún punto del giro.

Puedes girar el disco a mano para una primera prueba. Para girarlo con un motor, consulta el tutorial de motor de CC con ESP32, porque el motor necesita su propio cableado.

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

No se necesita ninguna biblioteca. Los dos ejemplos de abajo usan solo funciones que vienen con el núcleo del ESP32.

  • Configura el pin como entrada: pinMode(SENSOR_PIN, INPUT);
  • Lee el estado de la ranura (LOW significa bloqueada): int state = digitalRead(SENSOR_PIN);
  • Haz algo solo cuando el estado cambia: if (state != lastState) { ... }
  • Llama a una función corta cada vez que un diente bloquea la ranura: attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Marca esa función con IRAM_ATTR para que el ESP32 pueda ejecutarla rápido: void IRAM_ATTR countPulse() { pulseCount++; }
  • Convierte los pulsos de un segundo en vueltas por minuto: float rpm = pulses * 60.0 / SLOTS_PER_TURN;

¿Por qué usar una interrupción para la velocidad? Cuando el motor gira rápido, los pulsos llegan muy juntos, y una simple comprobación dentro de loop() puede perder algunos. La interrupción atrapa todos. Se elige el flanco FALLING para que cada diente se cuente una sola vez. Para saber más, lee el tutorial de interrupciones GPIO con ESP32.

Código ESP32 - Detectar y contar objetos en la ranura

Este código revisa el pin OUT una y otra vez. Imprime un mensaje solo cuando el estado cambia. Cada vez que la ranura se bloquea, el contador sube en uno.

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

Si es la primera vez que usas el ESP32, consulta cómo configurar el entorno para ESP32 en Arduino IDE.

  • Conecta el sensor al ESP32 como se muestra en el diagrama de cableado.
  • Conecta el cable USB al ESP32 y a tu PC.
  • Abre Arduino IDE, luego selecciona la placa ESP32 Dev Module y el puerto COM correcto.
  • Copia el código anterior y pégalo en Arduino IDE.
  • Haz clic en el botón Upload de Arduino IDE para compilar y subir el código al ESP32.
  • Haz clic en el icono Serial Monitor, luego escribe o selecciona 9600 como velocidad en baudios.
  • Mueve un trozo de cartulina o tu dedo dentro de la ranura y luego sácalo. Hazlo varias veces.
  • Mira los mensajes en el Monitor Serie.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' 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
ESP32 Dev Module on COM15
2

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

Ahora el sensor funciona como un tacómetro. Cada diente del disco que bloquea la ranura activa la interrupción, que suma uno a un contador. Una vez por segundo, el código lee el contador, lo pone a cero y calcula la velocidad.

La cuenta es simple. Un disco codificador común, como el que se vende con los motorreductores TT, tiene 20 ranuras, así que una vuelta completa da 20 pulsos. Los pulsos de un segundo, multiplicados por 60, dan los pulsos de un minuto. Divídelos entre 20 y obtienes las vueltas por minuto (rpm). Si tu disco tiene un número distinto de ranuras, cambia el valor de SLOTS_PER_TURN en el código.

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

Pasos rápidos

  • Fija el disco codificador y el sensor como se muestra en la imagen del disco codificador anterior. El cableado al ESP32 sigue igual.
  • Copia el código anterior, pégalo en Arduino IDE y haz clic en el botón Upload.
  • Abre el Monitor Serie a 9600 baudios.
  • Gira el disco a mano, o enciende el motor.
  • Mira la velocidad en el Monitor Serie. El ejemplo de abajo es un motor que gira a unas 300 rpm, con el motor parado al principio y al final.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' 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
ESP32 Dev Module on COM15
2

¿Quieres saber también hasta dónde ha llegado 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 unos centímetros de distancia en lugar de dentro de una ranura, consulta el tutorial del sensor infrarrojo de evitación de obstáculos con ESP32. Si necesitas una perilla que también dé el sentido de giro, consulta el tutorial de encoder rotativo con ESP32.

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.

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