ESP32 - Sensor de Velocidade Óptico IR com Fenda

Este tutorial ensina você a usar o ESP32 para ler o estado de um sensor de velocidade óptico IR com fenda, contar os objetos que passam pela fenda e transformar os pulsos de um disco encoder em velocidade do motor em RPM, que é exibida no Serial Monitor.

ESP32 e sensor de velocidade óptico IR com fenda

Sobre o Sensor de Velocidade Óptico IR com Fenda

Este pequeno módulo tem formato de U, com uma fenda estreita no meio. As pessoas o chamam por vários nomes: fotointerruptor, interruptor óptico, sensor IR em forma de U ou simplesmente sensor de fenda. Ele faz um trabalho só. Ele informa ao ESP32 se há algo dentro da fenda ou não. Como pode chavear muito rápido, é uma boa escolha para medir a velocidade com que uma roda ou um motor gira.

Sensor de Velocidade Óptico IR com Fenda
O tipo do sensor fotoelétrico do tipo fenda (LED IR + fototransistor NPN)
A largura da fenda 5,9 mm
A saída digital (TTL), LOW quando bloqueado, HIGH quando livre
O condicionamento do sinal Schmitt trigger embutido
A fixação furos para parafuso M3 nas duas pontas
O número de pinos 3 (VCC, GND, OUT)
Tensão de operação 3.3V a 5V DC

Usos típicos são a medição da velocidade de motor (RPM) com um disco encoder, um tacômetro simples, a contagem de objetos ou pulsos, a medição de distância contando as voltas da roda, o retorno da velocidade da roda em um carrinho robô e a detecção de limite ou de posição.

Pinagem do Sensor de Velocidade Óptico IR com Fenda

Pinagem do Sensor de Velocidade Óptico IR com Fenda
  • Pino VCC: conecte este pino ao pino 3.3V do ESP32
  • Pino GND: conecte este pino ao GND (0V)
  • Pino OUT: conecte este pino a um pino de entrada do ESP32 (GPIO18 neste tutorial). Ele fornece LOW quando a fenda está bloqueada e HIGH quando está livre

A ordem dos pinos nem sempre é a mesma de um lote para outro. Leia os rótulos impressos no seu próprio módulo antes de conectar os fios.

O pino OUT chega até a tensão que você dá ao VCC. O ESP32 é uma placa de 3.3V, então alimente o sensor pelo pino 3.3V, não pelo 5V. Assim, o pino OUT nunca envia mais que 3.3V para o pino GPIO.

Como o Sensor de Velocidade Óptico IR com Fenda Funciona

Como o sensor de velocidade óptico IR com fenda funciona

Um braço do U tem um LED infravermelho. O outro braço tem um fototransistor NPN. Os dois ficam de frente um para o outro, separados pela fenda de 5,9 mm.

  • Nada na fenda: a luz IR chega ao fototransistor, e o pino OUT fica HIGH.
  • Um objeto opaco na fenda, como um pedaço de cartão ou um dente de um disco encoder: a luz é cortada, e o pino OUT fica LOW.

Um Schmitt trigger na placa transforma o nível bruto de luz em um 0 ou 1 limpo, sem oscilar entre os dois. Graças a ele, o código do ESP32 não precisa de nenhum debounce.

Plástico transparente pode deixar a luz IR passar, então nem sempre ele é visto como bloqueado. Use objetos que você não consiga ver através deles.

Alguns módulos de outros fabricantes funcionam ao contrário. Se o seu sensor diz "bloqueado" quando a fenda está vazia, basta trocar LOW e HIGH no primeiro código. O código de RPM conta uma borda para cada fenda do disco, então funciona com os dois tipos.

Diagrama de Ligação

Como conectar o ESP32 e o sensor de velocidade óptico IR com fenda

Só são necessários três fios. Conecte VCC ao 3.3V, GND ao GND e OUT ao GPIO18. Você pode encaixar os fios direto nos pinos ou usar uma protoboard, se preferir.

Diagrama de Ligação do ESP32 com Sensor de Velocidade Óptico IR com Fenda

This image is created using Fritzing. Click to enlarge image

Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.

Sensor de Velocidade Óptico IR com Fenda ESP32
VCC 3.3V
GND GND
OUT GPIO18

Como montar o disco encoder para medir a velocidade

Para medir a velocidade, o sensor precisa de algo que corte a luz várias vezes enquanto gira. Esse é o trabalho do disco encoder. Fixe o disco no eixo do motor ou na roda e depois fixe o sensor pelos furos M3, de modo que os dentes do disco passem pela fenda. O disco não pode encostar no sensor em nenhum ponto da volta.

Você pode girar o disco com a mão para um primeiro teste. Para girá-lo com um motor, veja o tutorial de motor DC com ESP32, pois o motor precisa da sua própria ligação.

Como Programar para o Sensor de Velocidade Óptico IR com Fenda

Nenhuma biblioteca é necessária. Os dois exemplos abaixo usam apenas funções que vêm com o core do ESP32.

  • Defina o pino como entrada: pinMode(SENSOR_PIN, INPUT);
  • Leia o estado da fenda (LOW significa bloqueada): int state = digitalRead(SENSOR_PIN);
  • Faça algo somente quando o estado mudar: if (state != lastState) { ... }
  • Chame uma função curta toda vez que um dente bloquear a fenda: attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Marque essa função com IRAM_ATTR para que o ESP32 possa executá-la rápido: void IRAM_ATTR countPulse() { pulseCount++; }
  • Transforme os pulsos de um segundo em voltas por minuto: float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Por que usar uma interrupção para medir a velocidade? Quando o motor gira rápido, os pulsos chegam muito próximos uns dos outros, e uma verificação simples dentro do loop() pode perder alguns deles. A interrupção pega todos. A borda FALLING é escolhida para que cada dente seja contado só uma vez. Para saber mais, leia o tutorial de interrupção GPIO do ESP32.

Código ESP32 - Detectar e Contar Objetos na Fenda

Este código verifica o pino OUT de novo e de novo. Ele exibe uma mensagem somente quando o estado muda. Cada vez que a fenda fica bloqueada, o contador sobe uma unidade.

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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; } }

Passos Rápidos

Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para ESP32 no Arduino IDE.

  • Conecte o sensor ao ESP32 como mostrado no diagrama de ligação.
  • Conecte o cabo USB ao ESP32 e ao seu PC.
  • Abra o Arduino IDE e selecione a placa ESP32 Dev Module e a porta COM correta.
  • Copie o código acima e cole no Arduino IDE.
  • Clique no botão Upload do Arduino IDE para compilar e fazer upload do código para o ESP32.
  • Clique no ícone do Serial Monitor e depois digite ou selecione 9600 como baud rate.
  • Coloque um pedaço de cartão ou o seu dedo na fenda e depois retire. Faça isso algumas vezes.
  • Veja as mensagens no Serial Monitor.
∞
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 a Velocidade do Motor (RPM)

Agora o sensor funciona como um tacômetro. Cada dente do disco que bloqueia a fenda dispara a interrupção, que soma um a um contador. Uma vez por segundo, o código lê o contador, zera e calcula a velocidade.

A conta é simples. Um disco encoder comum, como o vendido com motores de redução TT, tem 20 fendas, então uma volta completa dá 20 pulsos. Os pulsos em um segundo, vezes 60, dão os pulsos em um minuto. Divida isso por 20 e você terá as voltas por minuto (RPM). Se o seu disco tem um número diferente de fendas, mude o valor de SLOTS_PER_TURN no código.

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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"); } }

Passos Rápidos

  • Fixe o disco encoder e o sensor como mostrado na imagem do disco encoder acima. A ligação ao ESP32 continua a mesma.
  • Copie o código acima, cole no Arduino IDE e clique no botão Upload.
  • Abra o Serial Monitor com 9600 baud.
  • Gire o disco com a mão ou ligue o motor.
  • Veja a velocidade no Serial Monitor. O exemplo abaixo é de um motor girando a cerca de 300 RPM, com o motor parado no início e no fim.
∞
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

Você também quer saber a distância que uma roda percorreu? Multiplique o número de voltas pela circunferência da roda (π × diâmetro da roda).

Se você quer detectar um objeto a alguns centímetros de distância, em vez de dentro de uma fenda, veja o tutorial do sensor infravermelho de evitar obstáculos com ESP32. Se você precisa de um botão giratório que também informe o sentido da rotação, veja o tutorial de encoder rotativo com ESP32.

Vídeo

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!