Arduino - Optische IR-sleufsensor (snelheidssensor)

In deze tutorial leren we:

Arduino optische IR-sleufsensor

Over de optische IR-sleufsensor

De optische IR-sleufsensor is een kleine U-vormige module. Mensen noemen hem ook een sleufsensor, een opto-interrupter of een U-vormige IR-sensor. Hij vertelt Arduino of er iets in de sleuf zit of niet. Met een encoderschijf kan hij ook meten hoe snel een motor of een wiel draait.

Optische IR-sleufsensor
Sensortype foto-elektrisch van het sleuftype (IR-LED + NPN-fototransistor)
Sleufbreedte 5.9 mm
Bedrijfsspanning 3.3V tot 5V DC
Uitgang digitaal (TTL), LOW als geblokkeerd, HIGH als vrij
Signaalconditionering ingebouwde Schmitt-trigger
Montage M3-schroefgaten aan beide uiteinden
Pinnen 3 (VCC, GND, OUT)

U kunt hem gebruiken voor:

  • Het meten van de motorsnelheid (RPM) met een encoderschijf
  • Het maken van een toerenteller
  • Het tellen van objecten of pulsen
  • Het meten van afstand door wielomwentelingen te tellen
  • Het krijgen van terugkoppeling over de wielsnelheid van een robot
  • Het detecteren van een limiet of een positie

Pinout

Optische IR-sleufsensor pinout

De optische IR-sleufsensor heeft drie pinnen:

  • VCC-pin: moet worden verbonden met VCC (5V of 3.3V)
  • GND-pin: moet worden verbonden met GND (0V)
  • OUT-pin: is een digitale uitgangspin. Hij is LOW als de sleuf geblokkeerd is en HIGH als de sleuf vrij is. Deze pin moet worden verbonden met een ingangspin van Arduino.

De volgorde van de pinnen kan per partij verschillen. Lees de labels op uw module.

Hoe het werkt

Hoe de optische IR-sleufsensor werkt

Aan één kant van de U zit een infrarood-LED. Aan de andere kant zit een NPN-fototransistor. Ze kijken naar elkaar over de sleuf van 5.9 mm.

  • Als de sleuf leeg is, bereikt het IR-licht de fototransistor. De OUT-pin is HIGH.
  • Als een ondoorzichtig object (een stukje karton of een tand van een encoderschijf) in de sleuf komt, blokkeert het het licht. De OUT-pin is LOW.

De ingebouwde Schmitt-trigger maakt de uitgang een zuivere en stabiele 0 of 1, zonder jitter. We hoeven het dus niet te debouncen in de code.

Een paar tips:

  • Gebruik ondoorzichtige objecten. Een doorzichtig object blokkeert het IR-licht mogelijk niet goed.
  • Sommige modules van andere makers werken andersom. Zegt uw sensor "geblokkeerd" als de sleuf leeg is, wissel dan gewoon LOW en HIGH in de eerste code. De RPM-code telt één flank per tand, dus hij werkt op beide manieren.

Snelheid meten met een encoderschijf

Een encoderschijf is een ronde plaat met sleuven (gaten) bij de rand. De gewone schijf voor TT-tandwielmotoren heeft 20 sleuven. Bevestig de schijf op de motoras of op het wiel, zodat de tanden door de sleuf van de sensor gaan zonder die aan te raken.

Als de schijf draait, blokkeert elke tand het licht even. De OUT-pin geeft één puls per tand. Een volledige omwenteling geeft 20 pulsen. Arduino telt de pulsen in 1 seconde en berekent dan de snelheid:

  • Pulsen in 1 seconde × 60 = pulsen in 1 minuut
  • Pulsen in 1 minuut ÷ 20 = omwentelingen in 1 minuut (RPM)

Bedradingsschema

Verbind VCC van de sensor met 5V van Arduino, GND met GND, en OUT met pin 2 van Arduino, zoals in de afbeelding hieronder.

Arduino optische IR-sleufsensor aansluitschema

Deze afbeelding is gemaakt met Fritzing. Klik om de afbeelding te vergroten.

We gebruiken pin 2 omdat dit een interrupt-pin is op de Arduino Uno. De RPM-code heeft hem nodig.

Hoe te programmeren voor de optische IR-sleufsensor

  • Geen bibliotheek nodig: de code gebruikt alleen ingebouwde functies.
  • Definieer de pin: const int SENSOR_PIN = 2;
  • Zet de pin als ingang met pinMode(): pinMode(SENSOR_PIN, INPUT);
  • Lees de status met digitalRead(): int state = digitalRead(SENSOR_PIN);
  • Controleer de status: if (state == LOW) betekent dat er iets in de sleuf zit. HIGH betekent dat de sleuf vrij is.
  • Gebruik een interrupt om snelle pulsen te tellen. Elke keer dat de OUT-pin van HIGH naar LOW gaat (een tand blokkeert de sleuf), voert Arduino een kleine functie uit: attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Houd de teller volatile, omdat hij verandert binnen de interrupt: volatile unsigned long pulseCount = 0;
  • Zet elke seconde de pulsen om naar RPM: float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Waarom een interrupt gebruiken? Als de motor snel draait, zijn de pulsen heel kort. Als we de pin alleen in loop() controleren, missen we mogelijk een deel ervan. De interrupt vangt elke puls op. We gebruiken FALLING zodat elke tand maar één keer wordt geteld.

Arduino Code - Object in de sleuf detecteren

De code hieronder doet deze dingen:

  • Leest de OUT-pin steeds opnieuw
  • Print alleen een bericht als de status verandert
  • Telt hoe vaak de sleuf geblokkeerd wordt
/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; } }

Snelle stappen

  • Maak de bedrading zoals in het diagram hierboven.
  • Verbind Arduino met de pc via een USB-kabel.
  • Open de Arduino IDE. Ga naar het menu Tools en kies het juiste board en de juiste poort.
  • Kopieer de bovenstaande code en plak deze in de Arduino IDE.
  • Klik op de Upload knop in de Arduino IDE om de code naar Arduino te uploaden.
  • Open de Serial Monitor (baudrate 9600).
  • Haal een stukje karton of uw vinger een paar keer door de sleuf.
  • Bekijk het resultaat op de Serial Monitor.
∞
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

Arduino Code - Motorsnelheid meten (RPM)

De code hieronder doet deze dingen:

  • Telt één puls elke keer dat een tand van de schijf de sleuf blokkeert (interrupt op de FALLING-flank)
  • Berekent elke seconde de snelheid in RPM
  • Print het aantal pulsen en de snelheid
/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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"); } }

De code gebruikt SLOTS_PER_TURN = 20. Heeft uw encoderschijf een ander aantal sleuven, verander dan dit getal.

Snelle stappen

  • Bevestig de encoderschijf op de motoras of het wiel, zodat de tanden door de sleuf gaan.
  • Houd dezelfde bedrading aan als in de eerste code.
  • Kopieer de bovenstaande code, plak deze in de Arduino IDE en upload hem.
  • Draai de schijf met de hand, of zet de motor aan. Om de motor aan te sturen, zie Arduino - DC Motor.
  • Bekijk het resultaat op de Serial Monitor. Het voorbeeld hieronder is een motor die met ongeveer 300 RPM draait.
∞
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

Bijvoorbeeld, 100 pulsen in 1 seconde geeft 100 × 60 ÷ 20 = 300 RPM.

Wilt u de afstand weten die een wiel aflegt? Vermenigvuldig het aantal omwentelingen met de omtrek van het wiel (π × wieldiameter).

Wilt u een object op afstand detecteren (niet in een sleuf), zie dan Arduino - Infrarood obstakeldetectiesensor. Wilt u een knop en de richting ervan uitlezen, zie dan Arduino - Rotary Encoder.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Functiereferenties

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!