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:

Arduino Nano ESP32 e sensor óptico de velocidade com ranhura IR

Hardware Necessário

1×Arduino Nano ESP32
1×Cabo USB Tipo-A para Tipo-C (para PC com USB-A)
1×Cabo USB Tipo-C para Tipo-C (para PC com USB-C)
1×IR Slotted Optical Speed Sensor
1×Fios Jumper
1×(Opcional) Breadboard
1×(Opcional) Conector de Alimentação DC
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 ESP32

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

Como o sensor óptico de velocidade com ranhura IR 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

Pinagem do sensor óptico de velocidade com ranhura IR
  • 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.

Diagrama de ligação do sensor óptico de velocidade com ranhura IR com o Arduino Nano ESP32

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.
pinMode(SENSOR_PIN, INPUT);
  • Faça uma leitura. Um valor LOW significa que a abertura está bloqueada.
int state = digitalRead(SENSOR_PIN);
  • Faça algo só quando a nova leitura for diferente da antiga, e depois salve-a para a próxima vez.
if (state != lastState) { // the gap just changed: blocked or clear lastState = state; }

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.
volatile unsigned long pulseCount = 0;
  • 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.
void IRAM_ATTR countPulse() { pulseCount++; }
  • 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.
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • A cada segundo, pegue a contagem, zere-a e transforme-a em RPM.
unsigned long pulses = pulseCount; pulseCount = 0; float rpm = pulses * 60.0 / SLOTS_PER_TURN;

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.

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

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

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.

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

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

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.

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!