Arduino Nano - Capteur de vitesse optique à fente IR
Ce tutoriel vous explique comment utiliser l'Arduino Nano pour lire le capteur de vitesse optique à fente IR, une petite pièce en forme de U qui indique à la carte quand quelque chose passe dans son espace. En détail, nous allons apprendre :
- Comment connecter l'Arduino Nano au capteur de vitesse optique à fente IR sur une breadboard
- Comment programmer l'Arduino Nano pour compter chaque objet qui passe dans la fente
- Comment programmer l'Arduino Nano pour calculer la vitesse d'un moteur en tr/min (RPM), avec un disque codeur et la broche d'interruption D2
Nous vous suggérons :
- D'utiliser un Arduino Nano - Encodeur rotatif. si vous construisez un bouton tourné à la main, ou si votre projet doit connaître le sens de rotation.
- D'utiliser un Arduino Nano - Capteur d'obstacles. si l'objet que vous voulez détecter est à l'air libre et ne passera pas dans un petit espace.

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
On appelle cette pièce de plusieurs noms : capteur à fente, fourche optique, interrupteur optique ou capteur IR en U. Tous ces noms veulent dire la même chose. C'est une barrière lumineuse. Une lumière brille d'un côté de l'espace vers l'autre côté, et le module indique si cette lumière passe.
Comment Il Détecte un Objet

Regardez les deux bras du « U ». Le premier bras contient une LED infrarouge. Le second bras contient un phototransistor NPN. Ils se font face de chaque côté d'un espace de 5.9 mm.
Il n'y a que deux cas :
- L'espace est vide. Le phototransistor voit la lumière infrarouge, donc le module met OUT à l'état HAUT (HIGH).
- Quelque chose d'opaque se trouve dans l'espace, comme une bande de carton ou une dent d'un disque codeur. La lumière ne peut pas passer, donc le module met OUT à l'état BAS (LOW).
Le module a aussi un trigger de Schmitt sur la carte. Son rôle est de transformer le niveau de lumière brut en un 0 ou un 1 net. Comme les fronts sont déjà propres, votre programme Arduino Nano n'a pas besoin de code anti-rebond.
Deux choses à retenir :
- Le plastique transparent ou le verre peut laisser passer la lumière infrarouge. Testez avec quelque chose à travers lequel vous ne pouvez pas voir.
- Quelques modules d'autres marques fonctionnent à l'inverse (LOW quand l'espace est vide). Si c'est le cas du vôtre, échangez LOW et HIGH dans le premier programme. Le programme RPM compte un front pour chaque fente, donc il donne la bonne réponse avec les deux types.
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), LOW quand bloqué, HIGH quand dégagé |
| Conditionnement du signal | Trigger de Schmitt intégré |
| Montage | Trous de vis M3 aux deux extrémités |
| Broches | 3 (VCC, GND, OUT) |
Vous trouverez ce capteur dans des projets comme ceux-ci : un tachymètre pour un petit moteur, un retour de vitesse de roue sur une voiture robot, un compteur de pièces sur un tapis roulant, une butée de fin de course qui indique à une pièce mobile qu'elle a atteint sa limite, et un simple odomètre qui compte combien de fois une roue a tourné.
Brochage du Capteur de Vitesse Optique à Fente IR

Seulement trois broches sortent du module :
- Broche VCC : doit être connectée à la broche 5V de l'Arduino Nano
- Broche GND : doit être connectée à GND (0V)
- Broche OUT : la ligne du signal numérique ; elle doit aller à une broche d'entrée de l'Arduino Nano (D2 dans ce tutoriel)
※ Note:
La disposition des broches d'un module peut différer d'un fabricant à l'autre, et l'ordre peut même changer entre deux lots du même produit. Il est essentiel de toujours se référer aux étiquettes imprimées sur le module lors de son utilisation. Regardez-les bien !
Transformer les Impulsions en Vitesse
Seul, le capteur voit uniquement « quelque chose » ou « rien ». Pour lire une vitesse, nous ajoutons un disque codeur. C'est une roue fine avec des trous sur son bord. Elle se place sur l'axe du moteur, et son bord tourne dans l'espace du capteur. Chaque dent coupe le faisceau une fois, donc la broche OUT donne une impulsion BASSE par dent.
Le disque fourni avec la plupart des moteurs réducteurs TT a 20 fentes. Donc 20 impulsions font un tour complet. Si l'Arduino Nano compte les impulsions pendant une seconde, le calcul est :
RPM = (impulsions en une seconde x 60) / 20
Le « x 60 » change les secondes en minutes. Le « / 20 » change les impulsions en tours.
Schéma de Câblage
Placez l'Arduino Nano au milieu de la breadboard, puis tirez trois fils de liaison depuis le capteur : VCC vers 5V, GND vers GND, et OUT vers D2, comme le montre l'image ci-dessous.

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
Voir Comment alimenter un Arduino Nano..
Le Nano est une carte 5V, donc nous prenons l'alimentation sur sa broche 5V. Le signal OUT varie alors entre 0V et 5V, ce qui correspond exactement aux broches d'entrée du Nano. Vous n'avez besoin ni d'un convertisseur de niveau, ni d'une résistance supplémentaire.
Comment Programmer le Capteur de Vitesse Optique à Fente IR
Vous n'avez pas besoin d'installer de bibliothèque. Les deux programmes utilisent uniquement des fonctions qui font déjà partie du noyau Arduino.
Partie 1 : vérifier la fente avec digitalRead()
- La première étape est d'indiquer la broche de l'Arduino Nano reliée à OUT :
- Dans setup(), cette broche est configurée en entrée. Le module pilote la ligne lui-même, donc un simple INPUT suffit :
- Dans loop(), la broche est lue encore et encore. Une valeur LOW nous dit que le faisceau est coupé :
- Le programme garde la dernière valeur dans lastState. Il affiche et compte seulement quand la nouvelle valeur est différente de l'ancienne, donc un objet donne un seul comptage, même s'il reste longtemps dans l'espace.
Partie 2 : capter les impulsions rapides avec une interruption
L'Arduino Nano n'a que deux broches qui peuvent déclencher une interruption externe : D2 et D3. C'est pourquoi le capteur va sur D2. N'importe quelle autre broche numérique convient pour la Partie 1, mais pas pour la Partie 2.
- Le compteur d'impulsions est déclaré avec le mot-clé volatile. Cela indique au compilateur que la valeur peut changer à tout moment, en dehors du déroulement normal de loop() :
- La routine d'interruption fait un petit travail. Elle ajoute 1 au compteur et se termine :
- Dans setup(), la routine est liée à D2. L'option FALLING la déclenche au moment où OUT passe de HIGH à LOW. C'est le moment où une dent entre dans l'espace, donc chaque dent est comptée une seule fois :
- Une fois par seconde, le programme copie le compteur et le remet à zéro. La puce ATmega328P du Nano traite 8 bits à la fois, donc copier un nombre de 4 octets demande plusieurs étapes. noInterrupts() et interrupts() garantissent qu'une nouvelle impulsion ne peut pas changer le nombre au milieu de la copie :
- La dernière étape utilise la formule vue plus haut :
Code Arduino Nano pour Compter les Objets dans la Fente
Le programme ci-dessous lit D2 dans loop(). Chaque fois qu'un nouvel objet coupe le faisceau, il ajoute un au comptage et l'affiche. Quand l'espace est de nouveau vide, il affiche un court message.
Étapes Rapides
- Si c'est la première fois que vous utilisez l'Arduino Nano, consultez Installation du logiciel Arduino Nano..
- Câblez les composants comme indiqué dans le schéma.
- Connectez la carte Arduino Nano à votre ordinateur à l'aide d'un câble USB.
- Ouvrez l'IDE Arduino sur votre ordinateur.
- Choisissez la carte Arduino Nano et le port COM qu'elle utilise. Si le téléversement échoue plus tard, essayez ATmega328P (Old Bootloader) dans le menu Processor.
- Collez le code ci-dessus dans un nouveau programme.
- Appuyez sur le bouton Upload et attendez le message « Done uploading ».
- Ouvrez le Moniteur Série et choisissez 9600 bauds.
- Glissez un morceau de carton, ou un doigt, dans l'espace puis retirez-le. Faites-le trois fois.
- Regardez les messages sur le Moniteur Série.
Voyez-vous « blocked » alors que l'espace est vide ? Dans ce cas, votre module a une logique inversée. Échangez les tests LOW et HIGH dans le code et téléversez de nouveau.
Code Arduino Nano pour Mesurer la Vitesse d'un Moteur (RPM)
Un moteur avec un disque de 20 fentes peut produire des centaines d'impulsions par seconde. La lecture en boucle peut en manquer quelques-unes, par exemple pendant que Serial.print() est occupé à envoyer du texte. Avec une interruption, le Nano arrête son travail en cours pendant un très court instant, compte l'impulsion, puis continue. Chaque dent est comptée.
Le programme affiche le nombre d'impulsions et les tr/min (RPM) une fois par seconde. La constante SLOTS_PER_TURN vaut 20. Si votre disque a un nombre de trous différent, comptez-les et mettez ce nombre dans le code.
Étapes Rapides
- Ne changez pas le câblage du premier programme. OUT doit rester sur D2. D3 est le seul autre choix sur le Nano ; si vous l'utilisez, mettez SENSOR_PIN à 3.
- Montez le disque codeur sur l'axe du moteur ou sur la roue. Alignez-le pour que les dents passent au milieu de l'espace et ne frottent pas le plastique.
- Collez le code RPM dans l'IDE Arduino et téléversez-le sur le Nano.
- Ouvrez le Moniteur Série à 9600 bauds.
- Tournez le disque à la main, ou allumez le moteur. Le tutoriel Arduino Nano - Moteur à courant continu. montre comment piloter un moteur avec le Nano.
- Lisez la vitesse sur le Moniteur Série.
Ici, le moteur tourne à environ 300 tr/min (RPM). Prenez la ligne avec 98 impulsions : 98 x 60 = 5880 impulsions par minute, et 5880 / 20 = 294 tr/min (RPM). Les lignes à 0 en haut et en bas ont été affichées avant le démarrage du moteur et après son arrêt.
Bonnes habitudes pour le code d'interruption sur le Nano :
- Marquez comme volatile chaque variable que la routine d'interruption modifie.
- Gardez la routine très courte. Ne mettez jamais delay() ou Serial.print() dedans.
- Restez avec FALLING. CHANGE se déclencherait deux fois par dent et doublerait vos tr/min (RPM).
Connaissances Supplémentaires
Quel Capteur Choisir ?
Un capteur à fente, un capteur d'obstacles IR et un encodeur rotatif peuvent tous envoyer des impulsions à l'Arduino Nano. Pourtant, chacun résout un problème différent. Posez-vous ces questions :
- L'objet passe-t-il dans un petit espace fixe (une dent de disque, un drapeau sur une pièce mobile) ? Choisissez le capteur de vitesse optique à fente IR. Il donne un signal numérique propre à chaque passage.
- L'objet est-il quelque part devant le capteur, pas dans un espace (un mur, une main, une boîte sur une table) ? Choisissez le Arduino Nano - Capteur d'obstacles.. Il voit la lumière réfléchie en espace ouvert.
- Une personne tourne-t-elle un bouton, et le code a-t-il besoin du sens (gauche ou droite) ? Choisissez l'Arduino Nano - Encodeur rotatif.. Il a deux sorties (CLK et DT) et un bouton poussoir.
Il est évident que le capteur à fente donne le comptage le plus fiable pour les pièces qui tournent vite, car la cible traverse toujours le même espace de 5.9 mm au même endroit. Sa seule limite est qu'il ne peut pas dire le sens de rotation.
Deux Roues, Deux Capteurs
Une petite voiture robot a souvent deux roues motrices. Le Nano a exactement deux broches d'interruption, donc un capteur peut aller sur D2 et un second capteur sur D3. Chaque capteur a alors besoin de son propre compteur et de sa propre routine d'interruption. Gardez cela en tête avant de planifier le reste du robot : si D2 et D3 sont déjà utilisées par d'autres composants, déplacez ces composants vers d'autres broches, car aucune autre broche du Nano ne peut faire ce travail.
Dépannage
| Problème | Quoi vérifier |
|---|---|
| Le comptage ne change jamais | Vérifiez que OUT va à D2 et que VCC va à 5V. Lisez les étiquettes des broches de votre module, car l'ordre n'est pas le même sur tous les lots. |
| « Blocked » quand l'espace est vide | Votre module utilise une logique inversée. Échangez LOW et HIGH dans le premier programme. |
| Les tr/min (RPM) sont toujours 0 | Les dents du disque n'atteignent peut-être pas l'espace. Déplacez le capteur pour que les dents passent au milieu de la fente. |
| Les tr/min (RPM) montent et descendent | Assurez-vous que le disque est bien serré sur l'axe et qu'il ne vacille pas et ne touche pas le capteur. |
| Les tr/min (RPM) sont trop hauts ou trop bas | SLOTS_PER_TURN ne correspond pas à votre disque. Comptez les trous et corrigez la constante. |