Arduino Nano ESP32 - Capteur de vitesse optique à fente IR

Dans ce guide, nous allons apprendre à utiliser le capteur de vitesse optique à fente IR avec l'Arduino Nano ESP32. En détail, nous allons apprendre :

Arduino Nano ESP32 et capteur de vitesse optique à fente IR

Matériel requis

1×Arduino Nano ESP32
1×Câble USB Type-A vers Type-C (pour PC USB-A)
1×Câble USB Type-C vers Type-C (pour PC USB-C)
1×IR Slotted Optical Speed Sensor
1×Fils de connexion
1×Optionnel: Breadboard
1×Optionnel: Connecteur d'alimentation DC
1×Recommandé: Carte d'extension à bornier à vis pour Arduino Nano
1×Recommandé: Carte d'extension breakout pour Arduino Nano
1×Recommandé: Répartiteur d'alimentation pour Arduino Nano ESP32

Ou vous pouvez acheter les kits suivants:

1×Kit de Capteurs DIYables (18 capteurs/écrans)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos du capteur de vitesse optique à fente IR

Regardez le capteur de côté et vous voyez la lettre U. À l'intérieur des parois gauche et droite de ce U, deux petits composants se font face : une LED infrarouge sur une paroi et un phototransistor NPN sur l'autre. L'espace ouvert entre eux fait 5,9 mm de large. Certains vendeurs appellent cette pièce un interrupteur optique, une fourche optique, ou simplement un capteur à fente IR. C'est la même chose.

Comment ça marche

Comment fonctionne le capteur de vitesse optique à fente IR

Imaginez une petite barrière de lumière. La LED ne s'éteint jamais, et le phototransistor surveille sans arrêt sa lumière.

  • Rien dans l'espace → le phototransistor reçoit la lumière → OUT est à l'état HAUT.
  • Un objet solide dans l'espace (une bande de carton, un bout de doigt, une dent d'un disque codeur) → la lumière est coupée → OUT est à l'état BAS.

Un trigger de Schmitt se trouve sur le module. Il transforme le niveau de lumière en un 0 ou un 1 net, sans rebond entre les deux. Grâce à cela, votre programme n'a pas besoin de code anti-rebond.

À garder en tête :

  • Le verre et le plastique transparent peuvent laisser passer la lumière infrarouge, donc le capteur peut ne pas les voir. Choisissez un objet que la lumière ne traverse pas.
  • Quelques modules d'autres marques utilisent une logique inversée : BAS quand l'espace est vide. Si le premier programme ci-dessous indique « bloqué » alors qu'il n'y a rien dans l'espace, échangez LOW et HIGH dans ce programme. Le programme de vitesse fonctionne avec les deux types, car il compte un front par dent.

Spécifications

Capteur de vitesse optique à fente IR
Type de capteur photoélectrique à fente (LED IR + phototransistor NPN)
Largeur de la fente 5,9 mm
Tension de fonctionnement 3,3V à 5V DC
Sortie numérique (TTL), BAS si bloqué, HAUT si dégagé
Conditionnement du signal trigger de Schmitt intégré
Fixation trous de vis M3 aux deux extrémités
Broches 3 (VCC, GND, OUT)

Où les gens l'utilisent :

  • Un tachymètre : placez un disque codeur sur un moteur et lisez son RPM.
  • Un retour sur la vitesse de rotation de la roue d'un robot.
  • Compter des pièces, des impulsions ou des objets sur un tapis.
  • Trouver une distance en comptant combien de fois une roue tourne.
  • Une butée de fin de course ou un interrupteur de position d'origine sans contact mobile.

Brochage

Brochage du capteur de vitesse optique à fente IR
  • Broche OUT : le signal numérique. À connecter à une entrée numérique de l'Arduino Nano ESP32 (D2 dans ce guide).
  • Broche GND : à connecter à GND (0V).
  • Broche VCC : à connecter à la broche 3,3V de l'Arduino Nano ESP32. Le module fonctionne de 3,3V à 5V.

Les lots ne sont pas tous identiques, et les trois broches peuvent venir dans un ordre différent. Fiez-vous aux étiquettes de votre propre carte, pas à l'ordre d'une image.

Diagramme de câblage

Le Nano ESP32 fonctionne avec une logique 3,3V, et ses broches d'entrée ne sont pas prévues pour 5V. Le signal OUT monte aussi haut que la tension sur VCC, donc nous alimentons le capteur par la broche 3,3V et non par 5V. Ainsi, D2 ne voit jamais plus de 3,3V.

Diagramme de câblage de l'Arduino Nano ESP32 avec le capteur de vitesse optique à fente IR

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

D2 accepte aussi une interruption, que le programme de vitesse utilise plus loin.

Comment programmer le capteur de vitesse optique à fente IR

Il y a deux façons de lire ce capteur. Le bon choix dépend de la vitesse à laquelle les objets passent dans l'espace.

Méthode 1 - lire la broche dans loop() (bon pour les objets lents) :

  • Dites à la carte que D2 est une entrée.
pinMode(SENSOR_PIN, INPUT);
  • Faites une lecture. Une valeur BAS veut dire que l'espace est bloqué.
int state = digitalRead(SENSOR_PIN);
  • Agissez seulement quand la nouvelle lecture est différente de l'ancienne, puis enregistrez-la pour la fois suivante.
if (state != lastState) { // the gap just changed: blocked or clear lastState = state; }

Méthode 2 - laisser une interruption compter (nécessaire pour un disque qui tourne) :

  • Créez le compteur avec le mot volatile, car la fonction d'interruption le modifie en arrière-plan.
volatile unsigned long pulseCount = 0;
  • Écrivez la fonction d'interruption. Sur la puce ESP32, ajoutez IRAM_ATTR avant son nom. Cela place la fonction dans la RAM interne rapide de la puce, donc elle peut s'exécuter tout de suite, à chaque fois.
void IRAM_ATTR countPulse() { pulseCount++; }
  • Reliez la fonction à D2. FALLING veut dire que la fonction s'exécute quand OUT passe de HAUT à BAS, ce qui arrive une fois à chaque entrée d'une dent dans l'espace.
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Chaque seconde, prenez le compte, remettez-le à zéro, et transformez-le en RPM.
unsigned long pulses = pulseCount; pulseCount = 0; float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Comment fonctionne le calcul ? Disons que le disque a 20 fentes. Alors 20 impulsions font un tour complet. Multipliez les impulsions d'une seconde par 60 et vous avez les impulsions par minute. Divisez par 20 et vous avez les tours par minute, c'est-à-dire le RPM.

Code Arduino Nano ESP32 - Compter les objets qui passent dans la fente

Le programme ci-dessous lit D2 en boucle. Une nouvelle ligne apparaît dans le Moniteur série seulement quand l'espace passe de dégagé à bloqué, ou l'inverse. Chaque fois qu'il devient bloqué, le compteur augmente de un.

/* * Ce code Arduino Nano ESP32 a été développé par newbiely.fr * Ce code Arduino Nano ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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; } }

Étapes rapides

Suivez ces instructions étape par étape :

  • Nouveau avec le Nano ESP32 ? Suivez d'abord Installation du logiciel Arduino Nano ESP32..
  • Câblez les composants selon le diagramme fourni. Vérifiez bien que VCC va à 3,3V.
  • Branchez l'Arduino Nano ESP32 à votre ordinateur avec le câble Type-C.
  • Lancez l'IDE Arduino sur votre ordinateur.
  • Sélectionnez la carte Arduino Nano ESP32 appropriée (par exemple, Arduino Nano ESP32) et le port COM.
  • Collez le code dans un nouveau croquis.
  • Appuyez sur le bouton Upload et attendez la fin.
  • Ouvrez le Arduino Nano ESP32 - Moniteur série. et choisissez 9600 bauds.
  • Poussez une bande de carton dans l'espace, gardez-la un instant, puis retirez-la. Répétez deux fois de plus.
  • Lisez les messages :
∞
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

Le carton fait une ligne « blocked » à l'entrée et une ligne « clear » à la sortie. Tant que vous le tenez immobile, l'écran reste silencieux.

Code Arduino Nano ESP32 - Lire la vitesse du moteur (RPM)

Un disque rapide peut faire passer beaucoup de dents dans l'espace entre deux passages de loop(), donc la lecture en boucle en perdrait certaines. Ce programme utilise plutôt une interruption. La fonction countPulse() est marquée avec IRAM_ATTR pour que l'ESP32 la garde en mémoire rapide et puisse y sauter tout de suite. Une fois par seconde, le programme affiche combien d'impulsions il a reçues et la vitesse en RPM.

Cherchez SLOTS_PER_TURN en haut du code. Il vaut 20, le nombre de fentes du disque codeur qui est souvent livré avec les moteurs à engrenages TT. Comptez les fentes de votre propre disque et mettez ce nombre ici s'il n'est pas 20.

/* * Ce code Arduino Nano ESP32 a été développé par newbiely.fr * Ce code Arduino Nano ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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"); } }

Monter le disque codeur

  • Poussez le disque sur l'axe du moteur (ou fixez-le à la roue).
  • Alignez le capteur pour que le bord du disque, avec ses dents, passe à l'intérieur de l'espace.
  • Tournez le disque lentement à la main pour vérifier qu'il ne frotte jamais les parois du U.
  • Pour le faire tourner, utilisez votre main ou faites marcher le moteur. Le moteur a son propre câblage, expliqué dans le tutoriel Arduino Nano ESP32 - Moteur à courant continu..

Étapes rapides

  • Ne changez pas le câblage du capteur.
  • Collez le code RPM dans l'IDE Arduino.
  • Appuyez sur Upload.
  • Ouvrez le Moniteur série à 9600 bauds.
  • Faites tourner le disque, puis laissez-le s'arrêter.
  • Regardez les nombres. Dans cet essai, le moteur tourne à environ 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

Essayez le calcul sur la ligne 101 : 101 × 60 ÷ 20 = 303 RPM. La première et la dernière ligne affichent 0 car le disque ne bouge pas.

Pour une roue de robot, vous pouvez aussi trouver la distance parcourue : nombre de tours × π × diamètre de la roue.

※ Note:

  • Mettez très peu de code dans countPulse(). N'affichez jamais rien depuis cette fonction.
  • Chaque variable que la fonction d'interruption modifie a besoin du mot-clé volatile.
  • Gardez IRAM_ATTR devant la fonction d'interruption, pour qu'elle reste en mémoire rapide.
  • Pour détecter un objet devant le capteur (et non dans une fente), consultez le tutoriel Arduino Nano ESP32 - Capteur d'obstacles.. Pour un bouton qui indique aussi la direction, consultez le tutoriel Arduino Nano ESP32 - Encodeur rotatif..

Vidéo

Références des fonctions

Commentaires

※ NOS MESSAGES

  • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !