Arduino - Optische IR-sleufsensor (snelheidssensor)
In deze tutorial leren we:
- Hoe de optische IR-sleufsensor (ook wel vorkvormige optische sensor genoemd) werkt
- Hoe u de optische IR-sleufsensor aansluit op Arduino
- Hoe u Arduino programmeert om objecten te detecteren en te tellen die door de sleuf gaan
- Hoe u Arduino programmeert om de snelheid van een motor in tpm (RPM) te meten met een encoderschijf

Benodigde Hardware
Of u kunt de volgende kits kopen:
| 1 | × | DIYables STEM V3 Starterskit (Arduino inbegrepen) | |
| 1 | × | DIYables Sensorkit (18 sensoren/displays) |
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

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

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.

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
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.
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
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.
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.