ESP32 - Capteur de vitesse optique à fente IR
Ce tutoriel vous explique comment utiliser le capteur de vitesse optique à fente IR avec l'ESP32 et MicroPython. Plus précisément, nous allons apprendre :
- Comment le capteur à fente sait si son espace est vide ou bloqué.
- Comment connecter le capteur à fente IR à un ESP32 et placer un disque codeur dans son espace.
- Comment écrire le code MicroPython pour que l'ESP32 compte des objets et mesure la vitesse d'un moteur en tr/min (RPM).

Matériel nécessaire
Ou vous pouvez acheter les kits suivants:
| 1 | × | Kit de Démarrage DIYables ESP32 (ESP32 inclus) | |
| 1 | × | Kit de Capteurs DIYables (18 capteurs/écrans) |
À propos du capteur de vitesse optique à fente IR
Regardez le module de côté et vous voyez la lettre U. Entre ses deux bras, il y a un canal ouvert, et c'est là que se fait la détection. Les makers connaissent cette pièce sous le nom de fourche optique (opto interrupter ou photo interrupter). Sa sortie est numérique, donc MicroPython n'a qu'à lire un 0 ou un 1 sur une seule broche.
| 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) - LOW si bloqué, HIGH si libre |
| Conditionnement du signal | trigger de Schmitt intégré |
| Fixation | trous de vis M3 aux deux extrémités |
| Broches | 3 (VCC, GND, OUT) |
Où pouvez-vous l'utiliser ? Voici quelques idées :
- Lire les tr/min (RPM) d'un moteur avec un disque codeur à fentes
- Construire un petit tachymètre
- Compter des impulsions ou des objets qui passent dans l'espace
- Trouver la distance parcourue par un robot en comptant les tours de roue
- Donner un retour de vitesse de roue à une voiture robot
- Détecter la position de fin (butée) d'une pièce mobile
Brochage

- Broche VCC : à connecter à la broche 3.3V de l'ESP32 (le module accepte de 3,3 volts à 5 volts)
- Broche GND : à connecter à GND (0 volt)
- Broche OUT : à connecter à un GPIO de l'ESP32, ici GPIO18. Elle lit 0 quand le canal est bloqué et 1 quand le canal est libre
Selon les lots, ces trois broches peuvent être dans un ordre différent. Faites confiance aux marquages de la carte, pas à une image.
Un mot sur l'alimentation : la tension sur OUT peut monter aussi haut que la tension sur VCC. Les broches GPIO de l'ESP32 fonctionnent en 3,3 volts. Si vous alimentez le module en 5 volts, OUT peut envoyer 5 volts dans le GPIO. Alimentez donc depuis la broche 3.3V, et le signal reste sûr.
Comment ça marche

Dans le bras gauche se trouve une LED infrarouge. Dans le bras droit se trouve un phototransistor NPN. Ils se regardent en face à travers le canal de 5,9 mm.
- Le canal est vide : le faisceau invisible atteint le phototransistor. Pin.value() renvoie 1.
- Une carte, un doigt ou une dent d'un disque codeur est dans le canal : le faisceau est coupé. Pin.value() renvoie 0.
Le module a aussi un trigger de Schmitt. Il transforme le niveau de lumière qui change lentement en un 0 ou un 1 net. Grâce à cela, le signal ne rebondit pas, et votre script MicroPython n'a besoin d'aucun code anti-rebond.
Choisissez des objets que la lumière ne peut pas traverser. Une fine feuille de plastique transparente peut laisser passer le faisceau IR, et le capteur lit alors toujours « libre ».
Toutes les marques n'utilisent pas la même logique. Sur certains modules d'autres fabricants, la sortie est inversée. Si le vôtre signale un blocage alors que le canal est vide, échangez le 0 et le 1 dans le premier script. Le script de tr/min n'a pas besoin de changement, car il compte un front par dent dans les deux cas.
Schéma de câblage
Câblage de l'ESP32 et du capteur à fente
Le module n'a besoin que de trois fils de liaison. Une breadboard est facultative. Vous pouvez aussi utiliser une carte d'extension à borniers à vis pour l'ESP32 si vous voulez des connexions solides.

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
| Broche du capteur de vitesse | Broche ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| OUT | GPIO18 |
Placer le disque codeur dans la fente
Pour la vitesse, il faut un disque rond avec des trous ou des dents sur son bord. Quand le disque tourne, chaque dent coupe le faisceau un instant, et chaque coupure est une impulsion. Enfoncez le disque sur l'arbre du moteur ou sur la roue. Vissez ensuite le module par ses trous M3, pour que le bord du disque passe dans le canal. Faites tourner le disque une fois à la main et vérifiez qu'il ne frotte jamais le capteur.
Une rotation lente avec votre doigt suffit pour un premier essai. Si vous voulez qu'un moteur entraîne le disque, le moteur a son propre câblage. Vous le trouverez dans le ESP32 - moteur à courant continu..
Code ESP32 MicroPython - Compter les objets qui passent dans la fente
Ce premier script lit GPIO18 en boucle rapide (polling). Il garde la dernière valeur vue. Quand la nouvelle valeur est différente, il affiche une ligne. Un passage à 0 ajoute aussi un au compteur.
Étapes rapides
Voici les instructions pour configurer et exécuter votre code MicroPython sur l'ESP32 avec l'IDE Thonny :
- Assurez-vous que Thonny IDE est installé sur votre ordinateur.
- Vérifiez que le firmware MicroPython est chargé sur votre carte ESP32.
- Nouveau sur MicroPython avec l'ESP32 ? Commencez par le guide ESP32 - Premiers pas..
- Connectez le capteur de vitesse optique à fente IR à la carte ESP32 selon le schéma fourni.
- Connectez la carte ESP32 à votre ordinateur avec un câble USB.
- Ouvrez Thonny IDE sur votre ordinateur.
- Dans Thonny IDE, allez dans Outils Options.
- Dans l'onglet Interpréteur, choisissez MicroPython (ESP32) dans le menu déroulant, et vérifiez que le bon port est sélectionné (par exemple COM12 sous Windows ou /dev/ttyUSB0 sous Linux).
- Copiez le code MicroPython fourni et collez-le dans l'éditeur de Thonny.
- Enregistrez le code sur votre ESP32 en :
- Cliquant sur le bouton Enregistrer ou en appuyant sur Ctrl+S.
- Dans la boîte de dialogue d'enregistrement, choisissant Périphérique MicroPython.
- Nommant le fichier main.py.
- Cliquez sur le bouton vert Exécuter (ou appuyez sur F5) pour exécuter le script.
- Glissez une bande de carton dans l'espace, retirez-la, et recommencez deux fois.
- Consultez le message dans le Shell en bas de Thonny.
Si vous nommez votre script main.py et l'enregistrez sur le périphérique MicroPython, il s'exécutera automatiquement à chaque mise sous tension de l'ESP32.
Code ESP32 MicroPython - Lire la vitesse du moteur (tr/min)
Le deuxième script transforme le module en tachymètre. Le polling est trop lent quand un disque tourne vite, donc ce script utilise plutôt une interruption. La ligne sensor.irq(trigger=Pin.IRQ_FALLING, handler=count_pulse) demande à l'ESP32 d'appeler count_pulse() à l'instant exact où la broche passe de 1 à 0. Ce passage se produit une fois par dent, donc aucune dent n'est comptée deux fois.
La boucle principale attend une seconde, copie le compteur, puis le remet à zéro. Ensuite elle fait le calcul :
- Un tour complet d'un disque à 20 fentes donne 20 impulsions.
- Impulsions en une seconde × 60 = impulsions en une minute.
- Impulsions en une minute ÷ 20 = tours par minute, c'est-à-dire les tr/min (RPM).
Vingt fentes est le nombre habituel sur le disque fourni avec les moteurs à réducteur TT. Votre disque est différent ? Réglez SLOTS_PER_TURN sur le vrai nombre de fentes.
Étapes rapides
- Montez le disque et le module comme sur l'image du disque codeur. Gardez les trois mêmes fils.
- Copiez le code MicroPython fourni et collez-le dans l'éditeur de Thonny.
- Enregistrez-le sur le périphérique MicroPython. Un seul fichier peut s'appeler main.py. Si vous réutilisez ce nom, ce script remplace le premier. Si vous voulez garder les deux, donnez à celui-ci un autre nom, comme rpm.py.
- Cliquez sur le bouton vert Exécuter (ou appuyez sur F5) pour exécuter le script.
- Faites tourner le disque avec la main, ou allumez le moteur.
- Consultez le message dans le Shell en bas de Thonny. Dans l'exemple ci-dessous, le moteur démarre à l'arrêt, tourne près de 300 tr/min, puis s'arrête.
Seul le fichier nommé main.py démarre tout seul à la mise sous tension. Enregistrez donc sous ce nom le script que vous voulez lancer seul, et gardez l'autre sous un nom différent.
Vous voulez aussi la distance ? Un tour de roue fait avancer le robot de la circonférence de la roue, soit π × diamètre de la roue. Multipliez cela par le nombre de tours.
Besoin de détecter un objet devant le robot, et non dans un espace étroit ? Essayez le ESP32 - Capteur d'évitement d'obstacles..