Arduino UNO R4 - Sensor Óptico de Velocidade IR com Fenda

Neste guia, vamos aprender a usar o sensor óptico de velocidade IR com fenda com o Arduino UNO R4. Em detalhes, vamos aprender:

Arduino UNO R4 and IR slotted optical speed sensor

Sobre o Sensor Óptico de Velocidade IR com Fenda

Este pequeno módulo tem formato de U. Também é chamado de fotointerruptor ou optointerruptor. Um braço tem um LED infravermelho. O outro braço tem um fototransistor NPN. Eles ficam um de frente para o outro, separados por um vão de 5,9 mm. O sensor diz uma coisa simples ao Arduino UNO R4: o vão está vazio ou tem algo dentro dele?

Sensor Óptico de Velocidade IR com Fenda
Tipo de sensor fotoelétrico de 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
Fixação furos para parafuso M3 nas duas pontas
Pinos 3 (VCC, GND, OUT)

Usos comuns:

  • Medir a velocidade de um motor (RPM) com um disco encoder, como um tacômetro.
  • Contar objetos ou pulsos.
  • Medir distância contando as voltas de uma roda.
  • Dar feedback da velocidade da roda para um robô.
  • Detectar um limite ou uma posição inicial.

Pinagem

IR slotted optical speed sensor pinout

O módulo tem três pinos:

  • Pino VCC: conecte ao 5V do Arduino UNO R4 (o módulo aceita de 3,3V a 5V).
  • Pino GND: conecte ao GND (0V).
  • Pino OUT: saída digital, conecte a um pino de entrada do Arduino UNO R4.

A ordem dos pinos pode mudar de um lote para outro. Sempre leia as etiquetas impressas no seu módulo.

Como Funciona

How the IR slotted optical speed sensor works

O LED IR ilumina a fenda o tempo todo.

  • Fenda vazia: a luz chega ao fototransistor, então o pino OUT fica HIGH.
  • Fenda bloqueada por algo opaco (um cartão, um dedo, um dente de um disco encoder): a luz não passa, então o pino OUT fica LOW.

O Schmitt trigger embutido transforma o nível bruto de luz em um 0 ou 1 limpo. O sinal não oscila, então você não precisa de debounce por software.

Duas coisas pequenas para saber:

  • Plástico transparente ou vidro podem deixar a luz IR passar. Use objetos opacos.
  • Alguns módulos de outros fabricantes funcionam ao contrário. Se a sua placa diz "bloqueado" com a fenda vazia, basta trocar LOW e HIGH no primeiro código. O código de RPM conta uma borda por fenda, então funciona com os dois tipos.

Diagrama de Ligação

Só três fios são necessários: VCC ao 5V, GND ao GND e OUT ao pino 2 do Arduino UNO R4. O UNO R4 é uma placa de 5V, então a alimentação de 5V serve bem aqui, e o sinal OUT continua em um nível seguro.

The wiring diagram between Arduino UNO R4 IR slotted optical speed sensor

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Uno R4 e outros componentes.

Usamos o pino 2 porque ele consegue tratar uma interrupção. O segundo código precisa disso.

Como Programar o Sensor Óptico de Velocidade IR com Fenda

Verificar se a fenda está bloqueada (polling):

  • Defina como entrada o pino que se conecta ao pino OUT:
pinMode(SENSOR_PIN, INPUT);
  • Leia o pino. LOW significa bloqueado, HIGH significa livre:
int state = digitalRead(SENSOR_PIN);
  • Compare com a última leitura, para agir só quando o estado mudar:
if (state != lastState) { // the slot just became blocked or clear }

Contar pulsos rápidos (interrupção):

  • Crie um contador. Marque-o como volatile, porque a interrupção o altera:
volatile unsigned long pulseCount = 0;
  • Escreva uma função bem pequena que soma um ao contador:
void countPulse() { pulseCount++; }
  • Execute essa função toda vez que o sinal cair de HIGH para LOW (um dente entra na fenda):
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Uma vez por segundo, copie e zere o contador com as interrupções pausadas, depois transforme os pulsos em RPM:
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Por que essa fórmula? Com um disco de 20 fendas, uma volta completa gera 20 pulsos. Pulsos em 1 segundo × 60 dá pulsos por minuto. Divida por 20 e você tem voltas por minuto (RPM).

Código Arduino UNO R4 - Detectar Objeto na Fenda

Este sketch verifica o pino OUT sem parar. Ele imprime uma linha só quando o estado muda, e soma um a um contador cada vez que a fenda é bloqueada.

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino UNO R4 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

Siga estas instruções passo a passo:

  • Se esta é a primeira vez que você usa o Arduino Uno R4 WiFi/Minima, consulte o tutorial sobre como configurar o ambiente para o Arduino Uno R4 WiFi/Minima no Arduino IDE.
  • Ligue os componentes de acordo com o diagrama fornecido.
  • Conecte a placa Arduino Uno R4 ao seu computador usando um cabo USB.
  • Abra o Arduino IDE no seu computador.
  • Selecione a placa Arduino Uno R4 correta (por exemplo, Arduino Uno R4 WiFi) e a porta COM.
  • Copie o código acima e cole-o no Arduino IDE.
  • Clique no botão Upload para enviar o código ao Arduino UNO R4.
  • Abra o Serial Monitor e configure-o para 9600 baud.
  • Deslize um pedaço de cartão (ou o seu dedo) para dentro da fenda e depois puxe para fora. Faça isso algumas vezes.
  • Veja o resultado no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 Uno R4 WiFi on COM15
2

Cada passagem gera duas linhas: uma quando o cartão entra, outra quando ele sai. Nenhuma linha é impressa enquanto nada muda.

Código Arduino UNO R4 - Medir a Velocidade do Motor (RPM)

O polling no loop() funciona bem para objetos lentos. Um disco girando é muito mais rápido, e o loop() pode perder alguns dentes. Por isso, este sketch conta os pulsos com uma interrupção na borda de descida (FALLING), o que dá exatamente uma contagem por dente. A cada segundo, ele imprime a contagem de pulsos e a velocidade em RPM.

A constante SLOTS_PER_TURN está definida como 20. Esse é o disco encoder comum que acompanha os motores com caixa de redução TT. Se o seu disco tiver um número diferente de fendas, mude esse valor.

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino UNO R4 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"); } }

Configure o Disco Encoder

  • Fixe o disco encoder no eixo do motor ou na roda.
  • Posicione o sensor de modo que os dentes do disco passem pela fenda.
  • Garanta que o disco não encoste nos braços do sensor.
  • Você pode girar o disco com a mão ou alimentar o motor. O motor precisa da própria ligação. Veja o tutorial Arduino UNO R4 - Motor DC para essa parte.

Passos Rápidos

  • Mantenha a mesma ligação de antes.
  • Copie o código de RPM acima e cole-o no Arduino IDE.
  • Clique no botão Upload.
  • Abra o Serial Monitor em 9600 baud.
  • Gire o disco e depois deixe-o parar.
  • Observe a velocidade no Serial Monitor. Aqui o motor gira a cerca de 300 RPM:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 Uno R4 WiFi on COM15
2

Confira uma linha: 100 pulsos × 60 ÷ 20 = 300 RPM.

Quer saber a distância que uma roda percorreu? Multiplique o número de voltas pela circunferência da roda (π × diâmetro da roda).

※ Nota:

  • Mantenha a função de interrupção curta. Não chame Serial.print() dentro dela.
  • Qualquer variável que a interrupção altera deve ser volatile.
  • Precisa detectar um objeto à distância, em vez de dentro de uma fenda? Experimente o sensor de desvio de obstáculos. Precisa de um botão que também informe o sentido da rotação? Experimente o encoder rotativo.

Vídeo

Referências de Funções

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