Arduino - Sensor Óptico de Velocidade IR com Fenda
Neste tutorial, vamos aprender:
- Como funciona o sensor óptico de velocidade IR com fenda (também chamado de fotointerruptor)
- Como conectar o sensor óptico de velocidade IR com fenda ao Arduino
- Como programar o Arduino para detectar e contar objetos que passam pela fenda
- Como programar o Arduino para medir a velocidade de um motor em RPM com um disco encoder

Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Sensor Óptico de Velocidade IR com Fenda
O sensor óptico de velocidade IR com fenda é um pequeno módulo em formato de U. As pessoas também o chamam de sensor de fenda, optointerruptor ou sensor IR em U. Ele informa ao Arduino se há algo dentro da fenda ou não. Com um disco encoder, ele também pode informar a velocidade com que um motor ou uma roda gira.
| Sensor Óptico de Velocidade IR com Fenda | |
|---|---|
| Tipo de Sensor | fotoelétrico do tipo fenda (LED IR + fototransistor NPN) |
| Largura da Fenda | 5.9 mm |
| Tensão de Operação | 3.3V a 5V DC |
| Saída | digital (TTL), LOW quando bloqueada, HIGH quando livre |
| Condicionamento de Sinal | Schmitt trigger embutido |
| Montagem | furos para parafuso M3 nas duas extremidades |
| Pinos | 3 (VCC, GND, OUT) |
Você pode usá-lo para:
- Medir a velocidade de um motor (RPM) com um disco encoder
- Fazer um tacômetro
- Contar objetos ou pulsos
- Medir distância contando as voltas de uma roda
- Obter o retorno de velocidade das rodas em um robô
- Detectar um limite ou uma posição
Pinagem

O sensor óptico de velocidade IR com fenda tem três pinos:
- Pino VCC: precisa ser conectado ao VCC (5V ou 3.3V)
- Pino GND: precisa ser conectado ao GND (0V)
- Pino OUT: é um pino de saída digital. Ele fica em LOW quando a fenda está bloqueada e em HIGH quando a fenda está livre. Este pino precisa ser conectado a um pino de entrada do Arduino.
A ordem dos pinos pode ser diferente entre lotes. Por favor, leia as indicações no seu módulo.
Como Funciona

Um lado do U tem um LED infravermelho. O outro lado tem um fototransistor NPN. Eles ficam um de frente para o outro, separados pela fenda de 5.9 mm.
- Quando a fenda está vazia, a luz IR chega ao fototransistor. O pino OUT fica em HIGH.
- Quando um objeto opaco (um pedaço de cartão ou um dente de um disco encoder) entra na fenda, ele bloqueia a luz. O pino OUT fica em LOW.
O Schmitt trigger embutido torna a saída um 0 ou 1 limpo e estável, sem oscilações. Por isso, não precisamos fazer debounce no código.
Algumas dicas:
- Use objetos opacos. Um objeto transparente pode não bloquear bem a luz IR.
- Alguns módulos de outros fabricantes funcionam ao contrário. Se o seu sensor indicar "bloqueado" quando a fenda estiver vazia, basta trocar LOW e HIGH no primeiro código. O código de RPM conta uma borda por dente, então funciona das duas formas.
Medindo a Velocidade com um Disco Encoder
Um disco encoder é uma placa redonda com fendas (furos) perto da borda. O disco comum para motores com caixa de redução TT tem 20 fendas. Fixe o disco no eixo do motor ou na roda, de modo que seus dentes passem pela fenda do sensor sem tocá-lo.
Quando o disco gira, cada dente bloqueia a luz por um momento. O pino OUT gera um pulso por dente. Uma volta completa gera 20 pulsos. O Arduino conta os pulsos em 1 segundo e então calcula a velocidade:
- Pulsos em 1 segundo × 60 = pulsos em 1 minuto
- Pulsos em 1 minuto ÷ 20 = voltas em 1 minuto (RPM)
Diagrama de Ligação
Conecte o VCC do sensor ao 5V do Arduino, o GND ao GND e o OUT ao pino 2 do Arduino, como mostrado na imagem abaixo.

This image is created using Fritzing. Click to enlarge image
Usamos o pino 2 porque ele é um pino de interrupção no Arduino Uno. O código de RPM precisa dele.
Como Programar o Sensor Óptico de Velocidade IR com Fenda
- Nenhuma biblioteca é necessária: o código usa apenas funções nativas.
- Defina o pino: const int SENSOR_PIN = 2;
- Configure o pino como entrada com pinMode(): pinMode(SENSOR_PIN, INPUT);
- Leia o estado com digitalRead(): int state = digitalRead(SENSOR_PIN);
- Verifique o estado: if (state == LOW) significa que há algo na fenda. HIGH significa que a fenda está livre.
- Para contar pulsos rápidos, use uma interrupção. Cada vez que o pino OUT passa de HIGH para LOW (um dente bloqueia a fenda), o Arduino executa uma pequena função: attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
- Mantenha o contador como volatile, porque ele muda dentro da interrupção: volatile unsigned long pulseCount = 0;
- A cada 1 segundo, converta os pulsos em RPM: float rpm = pulses * 60.0 / SLOTS_PER_TURN;
Por que usar uma interrupção? Quando o motor gira rápido, os pulsos são muito curtos. Se verificarmos o pino apenas em loop(), podemos perder alguns deles. A interrupção captura todos os pulsos. Usamos FALLING para que cada dente seja contado apenas uma vez.
Código Arduino - Detectar Objeto na Fenda
O código abaixo faz o seguinte:
- Lê o pino OUT repetidamente
- Imprime uma mensagem apenas quando o estado muda
- Conta quantas vezes a fenda é bloqueada
Passos Rápidos
- Faça a ligação como mostrado no diagrama acima.
- Conecte o Arduino ao PC por meio do cabo USB.
- Abra o Arduino IDE. Vá ao menu Tools e selecione a placa e a porta corretas.
- Copie o código acima e cole-o no Arduino IDE.
- Clique no botão Upload no Arduino IDE para carregar o código no Arduino.
- Abra o Serial Monitor (baud rate 9600).
- Passe um pedaço de cartão ou o seu dedo pela fenda algumas vezes.
- Veja o resultado no Serial Monitor.
Código Arduino - Medir a Velocidade do Motor (RPM)
O código abaixo faz o seguinte:
- Conta um pulso cada vez que um dente do disco bloqueia a fenda (interrupção na borda FALLING)
- A cada 1 segundo, calcula a velocidade em RPM
- Imprime o número de pulsos e a velocidade
O código usa SLOTS_PER_TURN = 20. Se o seu disco encoder tiver um número diferente de fendas, altere este número.
Passos Rápidos
- Fixe o disco encoder no eixo do motor ou na roda, de modo que seus dentes passem pela fenda.
- Mantenha a mesma ligação do primeiro código.
- Copie o código acima, cole-o no Arduino IDE e faça o upload.
- Gire o disco com a mão ou ligue o motor. Para acionar o motor, veja Arduino - Motor DC.
- Veja o resultado no Serial Monitor. O exemplo abaixo é de um motor girando a cerca de 300 RPM.
Por exemplo, 100 pulsos em 1 segundo resultam em 100 × 60 ÷ 20 = 300 RPM.
Quer descobrir a distância que uma roda percorre? Multiplique o número de voltas pela circunferência da roda (π × diâmetro da roda).
Se você quiser detectar um objeto à distância (não dentro de uma fenda), veja Arduino - Sensor Infravermelho de Desvio de Obstáculos. Se você quiser ler um botão giratório e sua direção, veja Arduino - Encoder Rotativo.