Arduino Nano - Sensor Óptico de Velocidade IR com Fenda
Este tutorial ensina como usar o Arduino Nano para ler o sensor óptico de velocidade IR com fenda, uma pequena peça em formato de U que avisa a placa quando algo passa pelo vão. Em detalhes, vamos aprender:
- Como conectar o Arduino Nano ao sensor óptico de velocidade IR com fenda em uma protoboard
- Como programar o Arduino Nano para contar cada objeto que passa pela fenda
- Como programar o Arduino Nano para calcular a velocidade de um motor em RPM, usando um disco encoder e o pino de interrupção D2
Nós sugerimos:
- Usar um encoder rotativo se você estiver construindo um botão giratório manual, ou se o seu projeto precisa saber para que lado algo gira.
- Usar um sensor infravermelho de desvio de obstáculos se o objeto que você quer encontrar estiver em espaço aberto e não passar por um vão pequeno.

Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Sensor Óptico de Velocidade IR com Fenda
As pessoas chamam esta peça por muitos nomes: sensor de fenda, fotointerruptor, opto interruptor ou sensor IR em formato de U. Todos significam a mesma coisa. É uma barreira de luz. Uma luz brilha de um lado do vão para o outro, e o módulo informa se essa luz chega ao outro lado.
Como Ele Detecta um Objeto

Olhe para os dois braços do "U". O primeiro braço tem um LED infravermelho dentro. O segundo braço tem um fototransistor NPN dentro. Eles se olham através de um vão de 5,9 mm.
Há apenas dois casos:
- O vão está vazio. O fototransistor enxerga a luz infravermelha, então o módulo coloca o OUT em HIGH.
- Algo opaco está no vão, como uma tira de cartão ou um dente de um disco encoder. A luz não consegue passar, então o módulo coloca o OUT em LOW.
O módulo também tem um Schmitt trigger na placa. A função dele é transformar o nível bruto de luz em um 0 ou 1 bem definido. Como as bordas já são limpas, o seu sketch do Arduino Nano não precisa de nenhum código de debounce.
Duas coisas para lembrar:
- Plástico transparente ou vidro podem deixar a luz infravermelha passar. Teste com algo que você não consiga enxergar através.
- Alguns módulos de outras marcas funcionam ao contrário (LOW quando vazio). Se o seu for assim, troque LOW e HIGH no primeiro sketch. O sketch de RPM conta uma borda para cada fenda, então dá a resposta certa com os dois tipos.
Especificações
| Sensor Óptico de Velocidade IR com Fenda | |
|---|---|
| Tipo de sensor | Fotoelétrico 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 bloqueado, HIGH quando livre |
| Condicionamento de sinal | Schmitt trigger embutido |
| Montagem | Furos para parafuso M3 nas duas pontas |
| Pinos | 3 (VCC, GND, OUT) |
Você vai encontrar este sensor em projetos como estes: um tacômetro para um motor pequeno, retorno da velocidade da roda em um carrinho robô, um contador de peças em uma esteira, um fim de curso que avisa a uma peça em movimento que ela chegou ao seu limite e um odômetro simples que conta quantas vezes uma roda girou.
Pinagem do Sensor Óptico de Velocidade IR com Fenda

Apenas três pinos saem do módulo:
- Pino VCC: deve ser conectado ao pino 5V do Arduino Nano
- Pino GND: deve ser conectado ao GND (0V)
- Pino OUT: a linha do sinal digital; ele deve ir para um pino de entrada do Arduino Nano (D2 neste tutorial)
※ Nota:
A disposição dos pinos em um módulo pode variar de um fabricante para outro, e a ordem pode até mudar entre dois lotes do mesmo produto. É essencial sempre consultar os rótulos impressos no módulo ao usá-lo. Olhe com atenção!
Transformando Pulsos em Velocidade
Sozinho, o sensor só enxerga "algo" ou "nada". Para ler a velocidade, adicionamos um disco encoder. Ele é uma roda fina com furos ao longo da borda. Ela fica no eixo do motor, e a borda dela gira através do vão. Cada dente corta o feixe uma vez, então o pino OUT dá um pulso LOW por dente.
O disco que vem com a maioria dos motores com caixa de redução TT tem 20 fendas. Então 20 pulsos significam uma volta completa. Se o Arduino Nano contar os pulsos durante um segundo, a conta é:
RPM = (pulsos em um segundo x 60) / 20
O "x 60" transforma segundos em minutos. O "/ 20" transforma pulsos em voltas.
Diagrama de Ligação
Coloque o Arduino Nano no meio da protoboard e depois ligue três fios jumper do sensor: VCC ao 5V, GND ao GND e OUT ao D2, como mostra a figura abaixo.

This image is created using Fritzing. Click to enlarge image
Veja A melhor forma de alimentar o Arduino Nano e outros componentes.
O Nano é uma placa de 5V, então pegamos a alimentação do pino 5V dele. O sinal OUT então varia entre 0V e 5V, e isso combina exatamente com os pinos de entrada do Nano. Você não precisa de um conversor de nível nem de nenhum resistor extra.
Como Programar o Sensor Óptico de Velocidade IR com Fenda
Você não precisa instalar uma biblioteca. Os dois sketches usam apenas funções que já fazem parte do núcleo do Arduino.
Parte 1: verificando a fenda com digitalRead()
- O primeiro passo é especificar o pino do Arduino Nano que está ligado ao OUT:
- Dentro de setup(), esse pino é configurado como entrada. O módulo controla a linha sozinho, então um INPUT simples é suficiente:
- Dentro de loop(), o pino é lido repetidamente. Um valor LOW nos diz que o feixe está interrompido:
- O sketch guarda o último valor em lastState. Ele imprime e conta somente quando o novo valor é diferente do antigo, então um objeto gera uma contagem, mesmo que fique no vão por muito tempo.
Parte 2: capturando pulsos rápidos com uma interrupção
O Arduino Nano tem apenas dois pinos que podem disparar uma interrupção externa: D2 e D3. Por isso o sensor vai no D2. Qualquer outro pino digital funciona na Parte 1, mas não na Parte 2.
- O contador de pulsos é declarado com a palavra-chave volatile. Isso avisa ao compilador que o valor pode mudar a qualquer momento, fora do fluxo normal de loop():
- A rotina de interrupção faz uma tarefa pequena. Ela soma 1 ao contador e retorna:
- Em setup(), a rotina é ligada ao D2. A opção FALLING a inicia no momento em que o OUT cai de HIGH para LOW. Esse é o momento em que um dente entra no vão, então cada dente é contado uma vez:
- Uma vez por segundo, o sketch copia o contador e o zera. O chip ATmega328P do Nano trabalha com 8 bits por vez, então copiar um número de 4 bytes leva vários passos. noInterrupts() e interrupts() garantem que um novo pulso não possa mudar o número no meio da cópia:
- O último passo usa a fórmula de cima:
Código Arduino Nano para Contar Objetos na Fenda
O sketch abaixo lê o D2 por polling em loop(). Cada vez que um novo objeto interrompe o feixe, ele soma um à contagem e a imprime. Quando o vão fica vazio de novo, ele imprime uma mensagem curta.
Passos Rápidos
- Se esta é a primeira vez que você usa o Arduino Nano, veja como configurar o ambiente para o Arduino Nano na Arduino IDE.
- Ligue os componentes como mostrado no diagrama.
- Conecte a placa Arduino Nano ao seu computador usando um cabo USB.
- Abra a Arduino IDE no seu computador.
- Escolha a placa Arduino Nano e a porta COM que ela está usando. Se o upload falhar mais tarde, tente ATmega328P (Old Bootloader) no menu Processor.
- Cole o código acima em um novo sketch.
- Pressione o botão Upload e espere a mensagem "Done uploading".
- Abra o Serial Monitor e escolha 9600 baud.
- Deslize um pedaço de cartão, ou um dedo, para dentro do vão e tire de novo. Faça isso três vezes.
- Observe as mensagens no Serial Monitor.
Você vê "blocked" enquanto o vão está vazio? Então o seu módulo tem lógica invertida. Troque as verificações de LOW e HIGH no código e faça o upload de novo.
Código Arduino Nano para Medir a Velocidade do Motor (RPM)
Um motor com um disco de 20 fendas pode gerar centenas de pulsos por segundo. O polling pode perder alguns deles, por exemplo enquanto Serial.print() está ocupado enviando texto. Com uma interrupção, o Nano pausa o trabalho atual por um tempo bem curto, conta o pulso e depois continua. Todo dente é contado.
O sketch imprime o número de pulsos e o RPM uma vez por segundo. A constante SLOTS_PER_TURN é 20. Se o seu disco tem um número diferente de furos, conte-os e coloque esse número no código.
Passos Rápidos
- Não mude a ligação do primeiro sketch. O OUT deve continuar no D2. O D3 é a única outra opção no Nano; se você usá-lo, defina SENSOR_PIN como 3.
- Monte o disco encoder no eixo do motor ou na roda. Alinhe-o para que os dentes passem pelo meio do vão e não encostem no plástico.
- Cole o código de RPM na Arduino IDE e faça o upload para o Nano.
- Abra o Serial Monitor em 9600 baud.
- Gire o disco com a mão, ou ligue o motor. O tutorial Arduino Nano - Motor DC mostra como acionar um motor a partir do Nano.
- Leia a velocidade no Serial Monitor.
Aqui o motor gira a cerca de 300 RPM. Pegue a linha com 98 pulsos: 98 x 60 = 5880 pulsos por minuto, e 5880 / 20 = 294 RPM. As linhas com 0 no início e no fim foram impressas antes de o motor começar e depois de ele parar.
Bons hábitos para código de interrupção no Nano:
- Marque como volatile toda variável que a rotina de interrupção altera.
- Mantenha a rotina bem pequena. Nunca coloque delay() ou Serial.print() dentro dela.
- Fique com FALLING. CHANGE dispararia duas vezes por dente e dobraria o seu RPM.
Conhecimento Adicional
Qual Sensor Você Deve Escolher?
Um sensor de fenda, um sensor IR de obstáculos e um encoder rotativo podem todos enviar pulsos ao Arduino Nano. Mesmo assim, cada um resolve um problema diferente. Faça a si mesmo estas perguntas:
- O objeto passa por um vão pequeno e fixo (um dente de disco, uma aba em uma peça em movimento)? Escolha o sensor óptico de velocidade IR com fenda. Ele dá um sinal digital limpo para cada passagem.
- O objeto está em algum lugar na frente do sensor, e não dentro de um vão (uma parede, uma mão, uma caixa sobre uma mesa)? Escolha o sensor IR de desvio de obstáculos. Ele enxerga a luz refletida em espaço aberto.
- Uma pessoa gira um botão, e o código precisa da direção (esquerda ou direita)? Escolha o encoder rotativo. Ele tem duas saídas (CLK e DT) e um botão de pressão.
É evidente que o sensor de fenda dá a contagem mais confiável para peças girando rápido, já que o alvo sempre cruza o mesmo vão de 5,9 mm no mesmo ponto. O único limite dele é que não consegue dizer a direção da rotação.
Duas Rodas, Dois Sensores
Um carrinho robô pequeno costuma ter duas rodas motrizes. O Nano tem exatamente dois pinos de interrupção, então um sensor pode ir no D2 e um segundo sensor no D3. Cada sensor então precisa do seu próprio contador e da sua própria rotina de interrupção. Tenha isso em mente antes de planejar o resto do robô: se o D2 e o D3 já estiverem sendo usados por outras peças, mude essas peças para outros pinos, porque nenhum outro pino do Nano pode fazer esse trabalho.
Solução de Problemas
| Problema | O que verificar |
|---|---|
| A contagem nunca muda | Verifique se o OUT vai ao D2 e o VCC vai ao 5V. Leia os rótulos dos pinos do seu módulo, porque a ordem não é a mesma em todos os lotes. |
| "Blocked" quando o vão está vazio | O seu módulo usa lógica invertida. Troque LOW e HIGH no primeiro sketch. |
| O RPM é sempre 0 | Os dentes do disco podem não chegar ao vão. Mova o sensor para que os dentes passem pelo meio da fenda. |
| O RPM sobe e desce | Verifique se o disco está firme no eixo e não balança nem encosta no sensor. |
| O RPM está muito alto ou muito baixo | SLOTS_PER_TURN não corresponde ao seu disco. Conte os furos e corrija a constante. |