Arduino Mega - Capteur de vitesse optique à fente IR
Ce tutoriel vous explique comment utiliser l'Arduino Mega pour lire le signal d'un capteur de vitesse optique à fente IR, puis transformer ce signal en nombre d'objets ou en vitesse de moteur en tr/min (RPM). En détail, nous allons apprendre :
- Comment fonctionne le capteur de vitesse optique à fente IR (aussi appelé fourche optique)
- Comment connecter l'Arduino Mega au capteur de vitesse optique à fente IR
- Comment programmer l'Arduino Mega pour détecter et compter les objets qui passent dans la fente
- Comment programmer l'Arduino Mega pour mesurer la vitesse (tr/min) d'un moteur avec un disque codeur et une interruption externe
- Quelles broches de l'Arduino Mega peuvent être utilisées pour les interruptions, et pourquoi c'est important pour mesurer la vitesse
Nous vous suggérons :
- D'utiliser un Arduino Mega - Encodeur rotatif si vous cherchez une entrée de type bouton rotatif ou si vous avez besoin de connaître le sens de rotation.
- D'utiliser un Arduino - Capteur infrarouge d'évitement d'obstacles si vous voulez détecter des objets à distance, et non à l'intérieur d'une fente étroite.

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
Le capteur de vitesse optique à fente IR est un petit module en forme de U. Un bras du « U » contient une LED infrarouge. L'autre bras contient un phototransistor NPN. Les deux pièces se font face de chaque côté d'un espace de 5.9 mm. Cet espace est la fente.
Le capteur donne un simple signal numérique. Il dit une seule chose à l'Arduino Mega : la fente est-elle libre, ou y a-t-il quelque chose dedans ? Pour cette raison, il convient bien au comptage, à la détection de fin de course et de position, et, avec un disque codeur à fentes, à la mesure de la vitesse.
| Capteur de vitesse optique à fente IR | |
|---|---|
| Type de capteur | Cellule 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 quand bloqué, HIGH quand libre |
| Conditionnement du signal | Trigger de Schmitt intégré |
| Fixation | Trous de vis M3 aux deux extrémités |
| Broches | 3 (VCC, GND, OUT) |
Utilisations courantes :
- Mesurer la vitesse d'un moteur (tr/min) avec un disque codeur
- Construire un tachymètre simple
- Compter des objets ou des impulsions
- Mesurer une distance en comptant les tours de roue
- Retour de vitesse pour les roues d'un robot
- Détection de fin de course et de position
Brochage du Capteur de Vitesse Optique à Fente IR

Le module a trois broches :
- Broche VCC : doit être connectée à VCC (5V sur l'Arduino Mega)
- Broche GND : doit être connectée à GND (0V)
- Broche OUT : sortie numérique, utilisée pour envoyer l'état de la fente du capteur à l'Arduino Mega
※ Note:
La disposition des broches d'un module peut varier d'un fabricant à l'autre, et même d'un lot à l'autre. Il est essentiel de toujours vous référer aux étiquettes imprimées sur le module lorsque vous l'utilisez. Regardez-les bien !
Comment Fonctionne le Capteur de Vitesse Optique à Fente IR

La LED IR envoie en permanence un faisceau de lumière infrarouge à travers la fente. Ce qui se passe ensuite dépend de ce qui se trouve dans la fente :
- Rien dans la fente : la lumière IR atteint le phototransistor, et la broche OUT est à HIGH.
- Un objet opaque dans la fente (un morceau de carton, une dent d'un disque codeur) : la lumière est bloquée, et la broche OUT est à LOW.
Un trigger de Schmitt est intégré au module. Il nettoie le signal, donc la broche OUT donne un 0 ou un 1 net et stable, sans instabilité. Pour cette raison, il n'y a pas besoin d'anti-rebond logiciel dans le code de l'Arduino Mega.
Gardez ces points à l'esprit :
- Les objets transparents peuvent ne pas bien bloquer la lumière IR. Utilisez des objets opaques.
- Certains modules d'autres fabricants ont la logique inverse. Si votre capteur indique « bloqué » quand la fente est vide, échangez simplement LOW et HIGH dans le premier code. Le code RPM compte un front par fente, donc il fonctionne dans les deux cas.
Mesurer la Vitesse avec un Disque Codeur
Pour mesurer la vitesse, un disque codeur rond avec des fentes est fixé sur l'arbre du moteur ou sur la roue. Le bord du disque tourne à l'intérieur de la fente du capteur. Chaque dent bloque la lumière un court instant, et chaque trou la laisse passer. Ainsi, la broche OUT fait une impulsion par fente du disque.
Le disque codeur courant pour les motoréducteurs TT a 20 fentes. Cela signifie :
- 1 tour complet = 20 impulsions
- Impulsions en 1 seconde x 60 = impulsions par minute
- Impulsions par minute / 20 = tours par minute (tr/min, RPM)
Schéma de Câblage
Le câblage entre l'Arduino Mega et le capteur de vitesse optique à fente IR est montré dans l'image ci-dessous.

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
| Capteur de vitesse optique à fente IR | Arduino Mega |
|---|---|
| VCC | 5V |
| GND | GND |
| OUT | Broche 2 |
Pourquoi la Broche 2 sur l'Arduino Mega ?
Le premier code utilise seulement digitalRead(), donc n'importe quelle broche numérique de l'Arduino Mega conviendrait. Cependant, le code RPM utilise une interruption externe, et toutes les broches de l'Arduino Mega ne la gèrent pas. L'Arduino Mega 2560 a six broches d'interruption externe :
| Broche de l'Arduino Mega | Autre usage de cette broche |
|---|---|
| 2 | Aucun (libre) |
| 3 | Aucun (libre) |
| 18 | TX1 (Serial1) |
| 19 | RX1 (Serial1) |
| 20 | SDA (I2C) |
| 21 | SCL (I2C) |
Les broches 2 et 3 sont les meilleurs choix, car elles ne partagent pas de fonction avec Serial1 ou I2C. Si votre projet utilise aussi un écran LCD I2C ou un appareil Serial1, évitez les broches 18 à 21. Nous utilisons la broche 2 dans les deux exemples de code, donc vous pouvez câbler le capteur une seule fois et exécuter les deux programmes.
※ Note:
L'Arduino Mega fonctionne avec une logique 5V. Alimentez le capteur avec la broche 5V de l'Arduino Mega. La broche OUT varie alors entre 0V et 5V, ce qui est exactement ce que les broches d'entrée du Mega attendent. Aucun convertisseur de niveau n'est nécessaire.
Comment Programmer pour le Capteur de Vitesse Optique à Fente IR
Aucune bibliothèque n'est nécessaire. Le code utilise uniquement les fonctions Arduino intégrées.
Lire l'État de la Fente
- La première étape est de définir la broche de l'Arduino Mega qui est connectée à la broche OUT du capteur :
- L'étape suivante est de configurer la broche en entrée numérique dans la fonction setup() :
- Ensuite, l'état de la fente est lu avec digitalRead(). LOW signifie qu'il y a quelque chose dans la fente, et HIGH signifie que la fente est libre :
- Pour compter chaque objet une seule fois, le nouvel état est comparé à l'état précédent. Un passage de HIGH à LOW signifie qu'un nouvel objet est entré dans la fente.
Compter les Impulsions avec une Interruption
- Une variable de comptage est déclarée volatile, car elle est modifiée dans la fonction d'interruption :
- Une courte fonction est écrite pour s'exécuter à chaque impulsion. Elle ajoute seulement un au compteur :
- La fonction est attachée à la broche 2 dans la fonction setup(). FALLING signifie que la fonction s'exécute chaque fois que la broche OUT passe de HIGH à LOW, c'est-à-dire chaque fois qu'une dent du disque bloque la fente :
- Une fois par seconde, le compteur est lu puis remis à zéro. L'Arduino Mega est une carte 8 bits, donc il lit une variable de 32 bits en plusieurs étapes. Désactiver les interruptions un instant empêche la valeur de changer au milieu de la lecture :
- Enfin, le RPM est calculé à partir des impulsions comptées en une seconde :
Code Arduino Mega pour Détecter des Objets dans la Fente
Ce code vérifie la broche OUT en boucle dans loop(). Il affiche un message seulement quand l'état change, et il compte chaque fois que la fente est bloquée.
Étapes Rapides
- Si c'est la première fois que vous utilisez l'Arduino Mega, consultez Arduino Mega - Installation du Logiciel.
- Câblez les composants comme indiqué sur le schéma.
- Connectez la carte Arduino Mega à votre ordinateur avec un câble USB.
- Ouvrez l'Arduino IDE sur votre ordinateur.
- Sélectionnez la carte Arduino Mega or Mega 2560 et le bon port COM.
- Copiez le code ci-dessus et collez-le dans l'Arduino IDE.
- Cliquez sur le bouton Téléverser dans l'Arduino IDE pour téléverser le code vers l'Arduino Mega.
- Ouvrez le Moniteur Série et réglez la vitesse de transmission sur 9600.
- Passez un morceau de carton ou votre doigt dans la fente plusieurs fois.
- Voyez le résultat dans le Moniteur Série.
Si les messages sont inversés (« blocked » quand la fente est vide), votre module utilise la logique inverse. Échangez LOW et HIGH dans le code.
Code Arduino Mega pour Mesurer la Vitesse du Moteur (RPM)
Les impulsions d'un disque en rotation sont rapides. Si le code vérifie la broche seulement dans loop(), il peut en manquer certaines, par exemple pendant qu'il est occupé à écrire dans le Moniteur Série. Une interruption règle ce problème. L'Arduino Mega arrête ce qu'il fait, ajoute un au compteur, puis revient, donc aucune impulsion n'est perdue.
Ce code compte les impulsions sur la broche d'interruption 2. Chaque seconde, il calcule le RPM et affiche les deux valeurs. SLOTS_PER_TURN est réglé sur 20. Changez-le pour correspondre au nombre de fentes de votre disque.
Étapes Rapides
- Gardez le même câblage que dans le premier exemple. La broche OUT doit rester sur la broche 2 (ou une autre broche d'interruption : 3, 18, 19, 20 ou 21 ; si vous la déplacez, changez SENSOR_PIN dans le code).
- Fixez le disque codeur sur l'arbre du moteur ou sur la roue. Assurez-vous que les dents passent dans la fente sans toucher le capteur.
- Copiez le code ci-dessus et collez-le dans l'Arduino IDE.
- Cliquez sur le bouton Téléverser pour téléverser le code vers l'Arduino Mega.
- Ouvrez le Moniteur Série à 9600 bauds.
- Faites tourner le disque à la main, ou alimentez le moteur. Pour piloter le moteur avec l'Arduino Mega, voir le tutoriel Arduino Mega - Moteur DC.
- Voyez le résultat dans le Moniteur Série.
Dans la sortie ci-dessus, le moteur tourne à environ 300 tr/min (RPM). Par exemple, 100 impulsions en une seconde donnent 100 x 60 / 20 = 300 tr/min. La première et la dernière ligne montrent 0 tr/min car le disque ne tourne pas.
※ Note:
- Déclarez volatile toute variable modifiée dans la fonction d'interruption.
- Gardez la fonction d'interruption courte. N'appelez pas Serial.print() ni delay() à l'intérieur.
- Utilisez FALLING pour que chaque dent du disque donne exactement un comptage.
Connaissances Supplémentaires
Capteur Optique à Fente vs Capteur d'Évitement d'Obstacles IR vs Encodeur Rotatif
Ces trois composants donnent des impulsions ou des signaux numériques à l'Arduino Mega, mais chacun est conçu pour un usage différent.
| Capteur de vitesse optique à fente IR | Capteur d'évitement d'obstacles IR | Encodeur rotatif | |
|---|---|---|---|
| Comment il détecte | Un objet coupe un faisceau lumineux dans une fente | La lumière IR se réfléchit sur un objet devant le capteur | Rotation d'un bouton ou d'un arbre |
| Zone de détection | Uniquement dans la fente de 5.9 mm | Espace ouvert devant le capteur | Aucun objet, il détecte la rotation |
| Sortie | 1 signal numérique | 1 signal numérique | 2 signaux (CLK, DT) + bouton |
| Sens de rotation | Non | Non | Oui |
| Idéal pour | Tr/min, comptage, détection de position | Robots évitant les murs, alarmes de proximité | Menus, boutons de volume, saisie manuelle |
Il est évident que le capteur optique à fente est plus précis pour compter des impulsions rapides, car l'objet passe toujours dans le même petit espace fixe. Choisissez le capteur d'obstacles quand l'objet ne passe pas dans une fente, et choisissez l'encodeur rotatif quand vous avez aussi besoin de connaître le sens.
Choisir le Nombre de Fentes par Tour
Le nombre de fentes du disque définit la résolution de la mesure :
- Plus de fentes : plus d'impulsions par tour, donc les basses vitesses peuvent être mesurées plus finement. Le code lit par pas de 60 / SLOTS_PER_TURN tr/min. Avec 20 fentes, chaque pas est de 3 tr/min.
- Moins de fentes : moins d'impulsions par seconde, donc moins de travail pour l'Arduino Mega à très haute vitesse.
Un disque de 20 fentes est un bon choix intermédiaire pour les petits motoréducteurs. Si vous utilisez un autre disque, comptez ses fentes et changez SLOTS_PER_TURN dans le code.
Mesurer la Distance à partir des Tours de Roue
Quand le disque codeur est fixé sur la roue d'un robot, les mêmes impulsions peuvent aussi donner la distance parcourue par la roue :
- Tours = total des impulsions / SLOTS_PER_TURN
- Circonférence de la roue = π x diamètre de la roue
- Distance = tours x circonférence de la roue
Par exemple, une roue de 65 mm a une circonférence d'environ 204 mm. Après 200 impulsions avec un disque de 20 fentes, la roue a fait 10 tours, donc elle a roulé d'environ 2.04 mètres.