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.

Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables ESP32 Starter Kit (ESP32 included) | |
| 1 | × | DIYables ESP32 S3 Starter Kit (ESP32 S3 included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
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

- 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

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.

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