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 :

Nous vous suggérons :

Arduino Mega et capteur de vitesse optique à fente IR

Matériel Requis

1×Arduino MEGA
1×Alternativement: DIYables MEGA Development Board
1×Câble USB 2.0 type A/B (pour PC USB-A)
1×Câble USB 2.0 type C/B (pour PC USB-C)
1×IR Slotted Optical Speed Sensor
1×Fils de connexion
1×Optionnel: Breadboard
1×Recommandé: Screw Terminal Block Shield for Arduino Uno/Mega
1×Recommandé: Sensors/Servo Expansion Shield for Arduino Mega
1×Recommandé: Breadboard Shield for Arduino Mega
1×Recommandé: Enclosure for Arduino Mega

Ou vous pouvez acheter les kits suivants:

1×Kit de Capteurs DIYables (18 capteurs/écrans)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À 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

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

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.

Schéma de câblage Arduino Mega et capteur de vitesse optique à fente IR

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 :
const int SENSOR_PIN = 2;
  • L'étape suivante est de configurer la broche en entrée numérique dans la fonction setup() :
pinMode(SENSOR_PIN, INPUT);
  • 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 :
int state = digitalRead(SENSOR_PIN);
  • 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 :
volatile unsigned long pulseCount = 0;
  • Une courte fonction est écrite pour s'exécuter à chaque impulsion. Elle ajoute seulement un au compteur :
void countPulse() { pulseCount++; }
  • 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 :
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • 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 :
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts();
  • Enfin, le RPM est calculé à partir des impulsions comptées en une seconde :
float rpm = pulses * 60.0 / SLOTS_PER_TURN;

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.

/* * Ce code Arduino Mega a été développé par newbiely.fr * Ce code Arduino Mega 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/arduino-mega/arduino-mega-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino Mega pin connected to the OUT pin of the speed sensor int lastState; // the previous state of the sensor int objectCount = 0; // how many times the slot was blocked void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); lastState = digitalRead(SENSOR_PIN); } void loop() { int state = digitalRead(SENSOR_PIN); if (state != lastState) { // the state has changed if (state == LOW) { // LOW = something is in the slot objectCount++; Serial.print("The slot is blocked - count: "); Serial.println(objectCount); } else { // HIGH = the slot is clear Serial.println("The slot is clear"); } lastState = state; } }

É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.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Mega Or...
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Mega Or...' on 'COM15')
New Line
9600 baud
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
Ln 11, Col 1
Arduino Mega Or... on COM15
2

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.

/* * Ce code Arduino Mega a été développé par newbiely.fr * Ce code Arduino Mega 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/arduino-mega/arduino-mega-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino Mega pin connected to the OUT pin of the speed sensor const int SLOTS_PER_TURN = 20; // number of slots (holes) in the encoder disc volatile unsigned long pulseCount = 0; // changed inside the interrupt unsigned long lastTime = 0; // runs every time a tooth of the disc blocks the slot void countPulse() { pulseCount++; } void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING); } void loop() { if (millis() - lastTime >= 1000) { // every 1 second lastTime = millis(); noInterrupts(); // read and reset the counter safely unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); float rpm = pulses * 60.0 / SLOTS_PER_TURN; // pulses per second -> turns per minute Serial.print("Pulses: "); Serial.print(pulses); Serial.print(" | Speed: "); Serial.print(rpm); Serial.println(" RPM"); } }

É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.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Mega Or...
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Mega Or...' on 'COM15')
New Line
9600 baud
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
Ln 11, Col 1
Arduino Mega Or... on COM15
2

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.

Vidéo

Références des fonctions

Commentaires

Tutoriels connexes

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