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 :

ESP32 MicroPython et module capteur de vitesse optique à fente IR

À 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

Brochage du capteur de vitesse optique à fente IR
  • 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

Comment fonctionne le capteur de vitesse optique à fente IR

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.

Schéma de câblage ESP32 MicroPython capteur de vitesse optique à fente IR

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.

/* * Ce code ESP32 MicroPython a été développé par newbiely.fr * Ce code ESP32 MicroPython 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/esp32-micropython/esp32-micropython-ir-slotted-optical-speed-sensor */ from machine import Pin import time SENSOR_PIN = 18 # ESP32 GPIO18 connected to the OUT pin of the speed sensor sensor = Pin(SENSOR_PIN, Pin.IN) last_state = sensor.value() object_count = 0 # how many times the slot was blocked while True: state = sensor.value() if state != last_state: # the state has changed if state == 0: # LOW = something is in the slot object_count += 1 print("The slot is blocked - count: {}".format(object_count)) else: # HIGH = the slot is clear print("The slot is clear") last_state = state time.sleep_ms(1)

É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.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot 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
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

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.

/* * Ce code ESP32 MicroPython a été développé par newbiely.fr * Ce code ESP32 MicroPython 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/esp32-micropython/esp32-micropython-ir-slotted-optical-speed-sensor */ from machine import Pin import time SENSOR_PIN = 18 # ESP32 GPIO18 connected to the OUT pin of the speed sensor SLOTS_PER_TURN = 20 # number of slots (holes) in the encoder disc pulse_count = 0 # runs every time a tooth of the disc blocks the slot def count_pulse(pin): global pulse_count pulse_count += 1 sensor = Pin(SENSOR_PIN, Pin.IN) sensor.irq(trigger=Pin.IRQ_FALLING, handler=count_pulse) while True: time.sleep(1) # count pulses for 1 second pulses = pulse_count # read and reset the counter pulse_count = 0 rpm = pulses * 60 / SLOTS_PER_TURN # pulses per second -> turns per minute print("Pulses: {} | Speed: {:.2f} RPM".format(pulses, rpm))

É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.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot 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
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

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

Vidéo

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