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 :
- Pourquoi le capteur de fente donne un signal BAS quand un objet est dans son espace.
- Comment câbler le capteur à la broche 3,3V et à la broche D2 de l'Arduino Nano ESP32.
- Comment programmer l'Arduino Nano ESP32 pour compter chaque objet qui passe dans l'espace.
- Comment programmer l'Arduino Nano ESP32 pour lire la vitesse de rotation d'un disque en tr/min (RPM), avec une fonction d'interruption gardée dans la mémoire rapide.

Matériel requis
Ou vous pouvez acheter les kits suivants:
| 1 | × | Kit de Capteurs DIYables (18 capteurs/écrans) |
À 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

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

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

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.
- Faites une lecture. Une valeur BAS veut dire que l'espace est bloqué.
- Agissez seulement quand la nouvelle lecture est différente de l'ancienne, puis enregistrez-la pour la fois suivante.
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.
- É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.
- 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.
- Chaque seconde, prenez le compte, remettez-le à zéro, et transformez-le en RPM.
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.
É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 :
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.
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 :
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..