Arduino Nano ESP32 - Sensor Óptico de Velocidade com Ranhura IR
Neste guia, vamos aprender como usar o sensor óptico de velocidade com ranhura IR com o Arduino Nano ESP32. Em detalhes, vamos aprender:
- Por que o sensor de ranhura dá um sinal LOW quando um objeto está na abertura dele.
- Como ligar o sensor ao pino 3.3V e ao pino D2 do Arduino Nano ESP32.
- Como escrever um programa para o Arduino Nano ESP32 que conta cada objeto que passa pela abertura.
- Como escrever um programa para o Arduino Nano ESP32 que lê a velocidade de giro de um disco em RPM, usando uma função de interrupção mantida na memória rápida.

Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Sensor Óptico de Velocidade com Ranhura IR
Olhe o sensor de lado e você vê a letra U. Dentro das paredes esquerda e direita desse U, duas pequenas peças ficam uma de frente para a outra: um LED infravermelho em uma parede e um fototransistor NPN na outra. O espaço aberto entre elas tem 5.9 mm de largura. Alguns vendedores chamam essa peça de opto interruptor, fotointerruptor ou simplesmente sensor de ranhura IR. É a mesma coisa.
Como Funciona

Pense nele como um pequeno portão de luz. O LED nunca desliga, e o fototransistor fica o tempo todo vigiando a luz dele.
- Nada na abertura → o fototransistor recebe a luz → OUT lê HIGH.
- Um objeto sólido na abertura (uma tira de cartolina, a ponta de um dedo, um dente de um disco encoder) → a luz é cortada → OUT lê LOW.
Um Schmitt trigger fica no módulo. Ele transforma o nível de luz em um 0 ou 1 bem definido, sem oscilar entre os dois. Por causa disso, o seu sketch não precisa de nenhum código de debounce.
Lembre-se:
- Vidro e plástico transparente podem deixar a luz infravermelha passar, então o sensor pode não enxergá-los. Escolha algo que a luz não consiga atravessar.
- Alguns módulos de outras marcas usam lógica invertida: LOW quando a abertura está vazia. Se o primeiro sketch abaixo informar "bloqueado" sem nada na abertura, troque LOW e HIGH nesse sketch. O sketch de velocidade funciona com os dois tipos, pois conta uma borda por dente.
Especificações
| Sensor Óptico de Velocidade com Ranhura IR | |
|---|---|
| Tipo de sensor | fotoelétrico de ranhura (LED IR + fototransistor NPN) |
| Largura da ranhura | 5.9 mm |
| Tensão de operação | 3.3V a 5V DC |
| Saída | digital (TTL), LOW quando bloqueado, HIGH quando livre |
| Condicionamento do sinal | Schmitt trigger embutido |
| Fixação | furos para parafuso M3 nas duas pontas |
| Pinos | 3 (VCC, GND, OUT) |
Onde as pessoas usam:
- Um tacômetro: coloque um disco encoder em um motor e leia o RPM dele.
- Feedback de quão rápido uma roda de robô gira.
- Contar peças, pulsos ou coisas em uma esteira.
- Descobrir a distância contando quantas vezes uma roda gira.
- Um fim de curso ou chave de posição inicial sem contatos móveis.
Pinagem

- Pino OUT: o sinal digital. Conecte a uma entrada digital do Arduino Nano ESP32 (D2 neste guia).
- Pino GND: conecte ao GND (0V).
- Pino VCC: conecte ao pino 3.3V do Arduino Nano ESP32. O módulo funciona em qualquer tensão de 3.3V a 5V.
Os lotes não são todos iguais, e os três pinos podem vir em outra ordem. Confie nas legendas da sua própria placa, não na ordem de uma imagem.
Diagrama de Ligação
O Nano ESP32 funciona com lógica de 3.3V, e os pinos de entrada dele não foram feitos para 5V. O sinal OUT sobe até a tensão que está no VCC, então alimentamos o sensor pelo pino 3.3V e não pelo 5V. Assim, o D2 nunca vê mais de 3.3V.

This image is created using Fritzing. Click to enlarge image
O D2 também aceita interrupção, que o sketch de velocidade usa mais adiante.
Como Programar o Sensor Óptico de Velocidade com Ranhura IR
Existem duas formas de ler este sensor. Qual delas serve depende de quão rápido as coisas passam pela abertura.
Forma 1 - ler o pino no loop() (boa para objetos lentos):
- Diga à placa que o D2 é uma entrada.
- Faça uma leitura. Um valor LOW significa que a abertura está bloqueada.
- Faça algo só quando a nova leitura for diferente da antiga, e depois salve-a para a próxima vez.
Forma 2 - deixar uma interrupção contar (necessária para um disco girando):
- Crie o contador com a palavra volatile, já que a função de interrupção o altera em segundo plano.
- Escreva a função de interrupção. No chip ESP32, adicione IRAM_ATTR antes do nome dela. Isso coloca a função na RAM interna rápida do chip, para que ela possa rodar na hora, toda vez.
- Ligue a função ao D2. FALLING significa que a função roda quando OUT cai de HIGH para LOW, o que acontece uma vez cada vez que um dente entra na abertura.
- A cada segundo, pegue a contagem, zere-a e transforme-a em RPM.
Como funciona a conta? Digamos que o disco tem 20 ranhuras. Então 20 pulsos significam uma volta completa. Multiplique os pulsos de um segundo por 60 e você tem os pulsos por minuto. Divida isso por 20 e você tem as voltas por minuto, que é o RPM.
Código do Arduino Nano ESP32 - Contar Objetos Passando pela Ranhura
O sketch abaixo lê o D2 várias vezes. Uma nova linha aparece no Serial Monitor só quando a abertura muda de livre para bloqueada, ou o contrário. Cada vez que ela fica bloqueada, o contador sobe um.
Passos Rápidos
Siga estas instruções passo a passo:
- Novo no Nano ESP32? Primeiro veja como configurar o Arduino Nano ESP32 no Arduino IDE.
- Ligue os componentes de acordo com o diagrama fornecido. Confira de novo se o VCC vai para o 3.3V.
- Conecte o Arduino Nano ESP32 ao seu computador com o cabo Type-C.
- Abra o Arduino IDE no seu computador.
- Selecione a placa Arduino Nano ESP32 apropriada (ex.: Arduino Nano ESP32) e a porta COM.
- Cole o código em um novo sketch.
- Pressione o botão Upload e espere terminar.
- Abra o Serial Monitor e escolha 9600 baud.
- Empurre uma tira de cartolina para dentro da abertura, segure por um momento e tire. Repita mais duas vezes.
- Leia as mensagens:
A cartolina gera uma linha "blocked" ao entrar e uma linha "clear" ao sair. Enquanto você a segura parada, a tela fica quieta.
Código do Arduino Nano ESP32 - Ler a Velocidade do Motor (RPM)
Um disco rápido pode fazer muitos dentes passarem pela abertura entre duas execuções do loop(), então a leitura direta perderia alguns deles. Este sketch usa uma interrupção no lugar. A função countPulse() é marcada com IRAM_ATTR para que o ESP32 a mantenha na memória rápida e possa saltar para ela na hora. Uma vez por segundo, o sketch imprime quantos pulsos recebeu e a velocidade em RPM.
Procure SLOTS_PER_TURN perto do topo. Ele guarda 20, o número de ranhuras do disco encoder que normalmente vem com os motores de redução TT. Conte as ranhuras do seu próprio disco e coloque esse número aqui se não for 20.
Monte o Disco Encoder
- Encaixe o disco no eixo do motor (ou prenda-o à roda).
- Alinhe o sensor de modo que a borda do disco, com os dentes, passe dentro da abertura.
- Gire o disco devagar com a mão para ter certeza de que ele nunca roça nas paredes do U.
- Para girá-lo, use a mão ou ligue o motor. O motor tem a própria ligação, explicada no tutorial Arduino Nano ESP32 - Motor DC.
Passos Rápidos
- Não mude a ligação do sensor.
- Cole o código de RPM no Arduino IDE.
- Pressione Upload.
- Abra o Serial Monitor em 9600 baud.
- Faça o disco girar e depois deixe-o parar.
- Observe os números. Nesta execução o motor gira a cerca de 300 RPM:
Teste a conta na linha do 101: 101 × 60 ÷ 20 = 303 RPM. A primeira e a última linha mostram 0 porque o disco não está se movendo.
Para uma roda de robô, você também pode descobrir a distância que ela rolou: número de voltas × π × diâmetro da roda.
※ Nota:
- Coloque muito pouco código dentro de countPulse(). Nunca imprima a partir dela.
- Toda variável que a função de interrupção altera precisa da palavra-chave volatile.
- Mantenha IRAM_ATTR na frente da função de interrupção, para que ela fique na memória rápida.
- Para detectar um objeto na frente do sensor (e não dentro de uma abertura), veja o tutorial do sensor de obstáculos. Para um botão giratório que também informa a direção, veja o tutorial do encoder rotativo.