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:

Nós sugerimos:

Arduino Nano IR slotted optical speed sensor

Hardware Necessário

1×Official Arduino Nano
1×Alternatively, DIYables Nano V3.0 Development Board
1×Cabo USB A para Mini-B
1×IR Slotted Optical Speed Sensor
1×Fios Jumper
1×(Opcional) Breadboard
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

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

How IR Slotted Optical Speed Sensor Works

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

IR Slotted Optical Speed Sensor Pinout

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.

The wiring diagram between Arduino Nano and IR Slotted Optical Speed Sensor

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:
const int SENSOR_PIN = 2;
  • Dentro de setup(), esse pino é configurado como entrada. O módulo controla a linha sozinho, então um INPUT simples é suficiente:
pinMode(SENSOR_PIN, INPUT);
  • Dentro de loop(), o pino é lido repetidamente. Um valor LOW nos diz que o feixe está interrompido:
int state = digitalRead(SENSOR_PIN);
  • 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():
volatile unsigned long pulseCount = 0;
  • A rotina de interrupção faz uma tarefa pequena. Ela soma 1 ao contador e retorna:
void countPulse() { pulseCount++; }
  • 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:
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • 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:
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts();
  • O último passo usa a fórmula de cima:
float rpm = pulses * 60.0 / SLOTS_PER_TURN;

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.

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino Nano pin 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 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.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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
Arduino Nano on COM15
2

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.

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino Nano pin 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 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(); noInterrupts(); // read and reset the counter safely unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); 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

  • 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.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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
Arduino Nano on COM15
2

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.

Vídeo

Referências de Funções

Tutoriais Relacionados

※ 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!