Arduino - Capteur de vitesse optique à fente IR

Dans ce tutoriel, nous allons apprendre :

Capteur de vitesse optique à fente IR Arduino

Matériel Requis

1×Arduino Uno R3
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é: Shield à bornier à vis pour Arduino Uno
1×Recommandé: Sensors/Servo Expansion Shield for Arduino Uno
1×Recommandé: Shield plaque d'essai pour Arduino Uno
1×Recommandé: Boîtier pour Arduino Uno
1×Recommandé: Kit plaque de base prototypage et plaque d'essai pour Arduino Uno

Ou vous pouvez acheter les kits suivants:

1×Kit de Démarrage DIYables STEM V3 (Arduino inclus)
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. On l'appelle aussi capteur à fente, interrupteur optique ou capteur IR en U. Il indique à l'Arduino si un objet se trouve dans sa fente ou non. Avec un disque codeur, il peut aussi indiquer à quelle vitesse tourne un moteur ou une roue.

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 CC
Sortie numérique (TTL), BAS quand bloqué, HAUT quand dégagé
Conditionnement du signal trigger de Schmitt intégré
Fixation trous pour vis M3 aux deux extrémités
Broches 3 (VCC, GND, OUT)

Vous pouvez l'utiliser pour :

  • Mesurer la vitesse d'un moteur (tr/min, RPM) avec un disque codeur
  • Fabriquer un tachymètre
  • Compter des objets ou des impulsions
  • Mesurer une distance en comptant les tours de roue
  • Obtenir le retour de vitesse d'une roue sur un robot
  • Détecter une limite ou une position

Brochage

Brochage du capteur de vitesse optique à fente IR

Le capteur de vitesse optique à fente IR a trois broches :

  • Broche VCC : doit être connectée à VCC (5V ou 3.3V)
  • Broche GND : doit être connectée à GND (0V)
  • Broche OUT : est une broche de sortie numérique. Elle est à l'état BAS quand la fente est bloquée et à l'état HAUT quand la fente est dégagée. Cette broche doit être connectée à une broche d'entrée de l'Arduino.

L'ordre des broches peut être différent selon les lots. Veuillez lire les étiquettes sur votre module.

Fonctionnement

Fonctionnement du capteur de vitesse optique à fente IR

Un côté du U a une LED infrarouge. L'autre côté a un phototransistor NPN. Ils se font face de chaque côté de la fente de 5.9 mm.

  • Quand la fente est vide, la lumière IR atteint le phototransistor. La broche OUT est à l'état HAUT.
  • Quand un objet opaque (un morceau de carton, ou une dent d'un disque codeur) entre dans la fente, il bloque la lumière. La broche OUT est à l'état BAS.

Le trigger de Schmitt intégré rend la sortie propre et stable, 0 ou 1, sans instabilité. Donc nous n'avons pas besoin de filtrer les rebonds dans le code.

Quelques conseils :

  • Utilisez des objets opaques. Un objet transparent peut ne pas bien bloquer la lumière IR.
  • Certains modules d'autres fabricants fonctionnent à l'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 dent, donc il fonctionne dans les deux cas.

Mesurer la Vitesse avec un Disque Codeur

Un disque codeur est une plaque ronde avec des fentes (trous) près de son bord. Le disque courant pour les moteurs à engrenages TT a 20 fentes. Fixez le disque sur l'arbre du moteur ou sur la roue, pour que ses dents passent dans la fente du capteur sans la toucher.

Quand le disque tourne, chaque dent bloque la lumière un court instant. La broche OUT donne une impulsion par dent. Un tour complet donne 20 impulsions. L'Arduino compte les impulsions pendant 1 seconde, puis calcule la vitesse :

  • Impulsions en 1 seconde × 60 = impulsions en 1 minute
  • Impulsions en 1 minute ÷ 20 = tours par minute (tr/min, RPM)

Schéma de Câblage

Connectez VCC du capteur à 5V de l'Arduino, GND à GND, et OUT à la broche 2 de l'Arduino, comme indiqué dans l'image ci-dessous.

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

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Nous utilisons la broche 2 car c'est une broche d'interruption sur l'Arduino Uno. Le code RPM en a besoin.

Comment Programmer l'Arduino pour le Capteur de Vitesse Optique à Fente IR

  • Aucune bibliothèque nécessaire : le code utilise uniquement des fonctions intégrées.
  • Définir la broche : const int SENSOR_PIN = 2;
  • Configurer la broche en entrée avec pinMode() : pinMode(SENSOR_PIN, INPUT);
  • Lire l'état avec digitalRead() : int state = digitalRead(SENSOR_PIN);
  • Vérifier l'état : if (state == LOW) signifie qu'un objet est dans la fente. HIGH signifie que la fente est dégagée.
  • Pour compter des impulsions rapides, utilisez une interruption. Chaque fois que la broche OUT passe de HIGH à LOW (une dent bloque la fente), l'Arduino exécute une petite fonction : attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Déclarez le compteur volatile, car il change dans l'interruption : volatile unsigned long pulseCount = 0;
  • Toutes les 1 seconde, transformez les impulsions en RPM : float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Pourquoi utiliser une interruption ? Quand le moteur tourne vite, les impulsions sont très courtes. Si nous vérifions la broche seulement dans loop(), nous pouvons en manquer. L'interruption capte chaque impulsion. Nous utilisons FALLING pour que chaque dent soit comptée une seule fois.

Code Arduino - Détecter un Objet dans la Fente

Le code ci-dessous fait ces choses :

  • Lit la broche OUT en boucle
  • Affiche un message seulement quand l'état change
  • Compte combien de fois la fente est bloquée
/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino 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/arduino-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino 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

  • Réalisez le câblage comme indiqué dans le schéma ci-dessus.
  • Connectez l'Arduino au PC via un câble USB.
  • Ouvrez Arduino IDE. Allez dans le menu Outils, sélectionnez la bonne carte et le bon port.
  • Copiez le code ci-dessus et collez-le dans Arduino IDE.
  • Cliquez sur le bouton Téléverser dans Arduino IDE pour téléverser le code vers l'Arduino.
  • Ouvrez le Moniteur Série (débit en bauds 9600).
  • Passez un morceau de carton ou votre doigt dans la fente plusieurs fois.
  • Regardez le résultat dans le Moniteur Série.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' 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 Uno on COM15
2

Code Arduino - Mesurer la Vitesse du Moteur (RPM)

Le code ci-dessous fait ces choses :

  • Compte une impulsion chaque fois qu'une dent du disque bloque la fente (interruption sur le front DESCENDANT, FALLING)
  • Toutes les 1 seconde, calcule la vitesse en RPM
  • Affiche le nombre d'impulsions et la vitesse
/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino 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/arduino-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino 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"); } }

Le code utilise SLOTS_PER_TURN = 20. Si votre disque codeur a un nombre de fentes différent, changez ce nombre.

Étapes Rapides

  • Fixez le disque codeur sur l'arbre du moteur ou sur la roue, pour que ses dents passent dans la fente.
  • Gardez le même câblage que pour le premier code.
  • Copiez le code ci-dessus, collez-le dans Arduino IDE et téléversez-le.
  • Faites tourner le disque à la main, ou alimentez le moteur. Pour piloter le moteur, voir Arduino - Moteur à courant continu..
  • Regardez le résultat dans le Moniteur Série. L'exemple ci-dessous montre un moteur qui tourne à environ 300 RPM.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' 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 Uno on COM15
2

Par exemple, 100 impulsions en 1 seconde donnent 100 × 60 ÷ 20 = 300 RPM.

Voulez-vous trouver la distance parcourue par une roue ? Multipliez le nombre de tours par la circonférence de la roue (π × diamètre de la roue).

Si vous voulez détecter un objet à distance (pas dans une fente), voir Arduino - Capteur infrarouge de détection d'obstacles.. Si vous voulez lire un bouton rotatif et son sens, voir Arduino - Encodeur rotatif..

Vidéo

Références de fonction

Commentaires

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