Arduino Nano - Optische IR-sleufsensor (snelheidssensor)
Deze tutorial legt uit hoe u Arduino Nano gebruikt om de optische IR-sleufsensor te lezen, een klein U-vormig onderdeel dat het board laat weten wanneer er iets door de opening gaat. We leren in detail:
- Hoe u Arduino Nano op een breadboard aansluit op de optische IR-sleufsensor
- Hoe u Arduino Nano programmeert om elk object te tellen dat door de sleuf gaat
- Hoe u Arduino Nano programmeert om de snelheid van een motor in tpm (RPM) te berekenen, met een encoderschijf en de interruptpin D2
Wij raden aan:
- Gebruik een rotary encoder als u een knop bouwt die met de hand wordt gedraaid, of als uw project moet weten in welke richting iets draait.
- Gebruik een infrarood obstakeldetectiesensor als het object dat u wilt vinden vrij in de ruimte staat en niet door een kleine opening gaat.

Hardware Benodigd
Of u kunt de volgende kits kopen:
| 1 | × | DIYables Sensorkit (18 sensoren/displays) |
Over de optische IR-sleufsensor
Mensen noemen dit onderdeel met veel namen: sleufsensor, vorkvormige optische sensor, opto-interrupter of U-vormige IR-sensor. Ze bedoelen allemaal hetzelfde. Het is een lichtpoort. Er schijnt licht van de ene kant van een opening naar de andere kant, en de module meldt of dat licht erdoor komt.
Hoe het een object detecteert

Kijk naar de twee armen van de "U". De eerste arm heeft een infraroodled erin. De tweede arm heeft een NPN-fototransistor erin. Ze kijken naar elkaar over een opening van 5.9 mm.
Er zijn maar twee gevallen:
- De opening is leeg. De fototransistor ziet het infraroodlicht, dus de module zet OUT op HIGH.
- Er zit iets ondoorzichtigs in de opening, zoals een strook karton of één tand van een encoderschijf. Het licht kan er niet door, dus de module zet OUT op LOW.
De module heeft ook een Schmitt-trigger aan boord. Die zet het ruwe lichtniveau om in een scherpe 0 of 1. Omdat de flanken al schoon zijn, heeft uw Arduino Nano-sketch geen debounce-code nodig.
Twee dingen om te onthouden:
- Doorzichtig plastic of glas kan infraroodlicht doorlaten. Test met iets waar u niet doorheen kunt kijken.
- Enkele modules van andere merken werken andersom (LOW als leeg). Als de uwe dat doet, verwissel dan LOW en HIGH in de eerste sketch. De RPM-sketch telt één flank per sleuf, dus hij geeft met beide soorten het juiste antwoord.
Specificaties
| Optische IR-sleufsensor | |
|---|---|
| Type sensor | Fotoëlektrisch van het sleuftype (IR-led + NPN-fototransistor) |
| Sleufbreedte | 5.9 mm |
| Werkspanning | 3.3V tot 5V DC |
| Uitgang | Digitaal (TTL), LOW bij geblokkeerd, HIGH bij vrij |
| Signaalconditionering | Ingebouwde Schmitt-trigger |
| Montage | M3-schroefgaten aan beide uiteinden |
| Pinnen | 3 (VCC, GND, OUT) |
U vindt deze sensor in projecten zoals deze: een toerenteller voor een kleine motor, terugkoppeling van de wielsnelheid op een robotauto, een teller voor onderdelen op een band, een eindschakelaar die een bewegend onderdeel laat weten dat het zijn limiet heeft bereikt, en een eenvoudige kilometerteller die telt hoe vaak een wiel is gedraaid.
De pinout van de optische IR-sleufsensor

Er komen maar drie pinnen uit de module:
- VCC-pin: moet aangesloten worden op de 5V-pin van Arduino Nano
- GND-pin: moet aangesloten worden op GND (0V)
- OUT-pin: de digitale signaallijn; hij moet naar een ingangspin van Arduino Nano gaan (D2 in deze tutorial)
※ Notiz:
De indeling van de pinnen op een module kan per fabrikant verschillen, en de volgorde kan zelfs veranderen tussen twee batches van hetzelfde product. Het is essentieel om altijd de labels te raadplegen die op de module staan gedrukt. Kijk goed!
Pulsen omzetten in snelheid
Op zichzelf ziet de sensor alleen "iets" of "niets". Om de snelheid te lezen, voegen we een encoderschijf toe. Dit is een dun wiel met gaten langs de rand. Het zit op de motoras en de rand draait door de opening. Elke tand onderbreekt de lichtstraal één keer, dus de OUT-pin geeft één LOW-puls per tand.
De schijf die bij de meeste TT-tandwielmotoren wordt geleverd, heeft 20 sleuven. Dus 20 pulsen betekenen één volledige draaiing. Als Arduino Nano de pulsen één seconde lang telt, is de berekening:
RPM = (pulsen in één seconde x 60) / 20
De "x 60" zet seconden om in minuten. De "/ 20" zet pulsen om in draaiingen.
Bedradingsschema
Plaats de Arduino Nano over het midden van het breadboard en leg dan drie jumperdraden vanaf de sensor: VCC naar 5V, GND naar GND en OUT naar D2, zoals de afbeelding hieronder laat zien.

Deze afbeelding is gemaakt met Fritzing. Klik om de afbeelding te vergroten.
Zie De beste manier om Arduino Nano en andere componenten van stroom te voorzien.
De Nano is een 5V-board, dus we nemen de voeding van zijn 5V-pin. Het OUT-signaal beweegt dan tussen 0V en 5V, en dat past precies bij de ingangspinnen van de Nano. U hebt geen niveauomzetter of extra weerstand nodig.
Hoe programmeert u voor de optische IR-sleufsensor
U hoeft geen bibliotheek te installeren. Beide sketches gebruiken alleen functies die al deel uitmaken van de Arduino-core.
Deel 1: de sleuf controleren met digitalRead()
- De eerste stap is het opgeven van de pin van de Arduino Nano die op OUT is aangesloten:
- In setup() wordt die pin als ingang ingesteld. De module stuurt de lijn zelf aan, dus een gewone INPUT is genoeg:
- In loop() wordt de pin steeds opnieuw gelezen. Een LOW-waarde vertelt ons dat de lichtstraal onderbroken is:
- De sketch bewaart de laatste waarde in lastState. Hij print en telt alleen als de nieuwe waarde niet gelijk is aan de oude, dus één object geeft één telling, ook als het lang in de opening blijft.
Deel 2: snelle pulsen opvangen met een interrupt
De Arduino Nano heeft maar twee pinnen die een externe interrupt kunnen activeren: D2 en D3. Daarom gaat de sensor naar D2. Elke andere digitale pin werkt voor Deel 1, maar niet voor Deel 2.
- De pulsteller wordt gedeclareerd met het sleutelwoord volatile. Dit vertelt de compiler dat de waarde op elk moment kan veranderen, buiten de normale loop van loop():
- De interruptroutine doet één klein werkje. Hij telt 1 op bij de teller en keert terug:
- In setup() wordt de routine aan D2 gekoppeld. De optie FALLING start hem op het moment dat OUT van HIGH naar LOW gaat. Dat is het moment waarop een tand de opening binnengaat, dus elke tand wordt één keer geteld:
- Eén keer per seconde kopieert de sketch de teller en zet hem terug op nul. De ATmega328P-chip op de Nano verwerkt 8 bits tegelijk, dus het kopiëren van een getal van 4 bytes kost meerdere stappen. noInterrupts() en interrupts() zorgen ervoor dat een nieuwe puls het getal niet halverwege het kopiëren kan veranderen:
- De laatste stap gebruikt de formule van hierboven:
Arduino Nano Code om objecten in de sleuf te tellen
De onderstaande sketch leest D2 uit in loop(). Elke keer dat een nieuw object de lichtstraal onderbreekt, telt hij er één bij en print hij de telling. Als de opening weer leeg is, print hij een kort bericht.
Snelle Stappen
- Als dit de eerste keer is dat u Arduino Nano gebruikt, zie dan hoe u de omgeving voor Arduino Nano instelt in Arduino IDE.
- Sluit de componenten aan zoals in het schema getoond.
- Verbind het Arduino Nano-board met uw computer via een USB-kabel.
- Open Arduino IDE op uw computer.
- Kies het Arduino Nano-board en de COM-poort die het gebruikt. Als de upload later mislukt, probeer dan ATmega328P (Old Bootloader) in het menu Processor.
- Plak de bovenstaande code in een nieuwe sketch.
- Druk op de Upload-knop en wacht op de melding "Done uploading".
- Open de Serial Monitor en kies 9600 baud.
- Schuif een stukje karton of een vinger in de opening en haal het er weer uit. Doe dit drie keer.
- Bekijk de berichten op de Serial Monitor.
Ziet u "blocked" terwijl de opening leeg is? Dan heeft uw module omgekeerde logica. Verwissel de LOW- en HIGH-controles in de code en upload opnieuw.
Arduino Nano Code om de motorsnelheid (RPM) te meten
Een motor met een schijf van 20 sleuven kan honderden pulsen per seconde maken. Pollen kan er enkele missen, bijvoorbeeld terwijl Serial.print() bezig is met het versturen van tekst. Met een interrupt pauzeert de Nano zijn huidige werk voor een zeer korte tijd, telt de puls en gaat dan verder. Elke tand wordt geteld.
De sketch print eenmaal per seconde het aantal pulsen en de RPM. De constante SLOTS_PER_TURN is 20. Als uw schijf een ander aantal gaten heeft, tel ze dan en zet dat getal in de code.
Snelle Stappen
- Verander de bedrading van de eerste sketch niet. OUT moet op D2 blijven. D3 is de enige andere keuze op de Nano; als u die gebruikt, zet dan SENSOR_PIN op 3.
- Monteer de encoderschijf op de motoras of het wiel. Lijn hem zo uit dat de tanden door het midden van de opening lopen en het plastic niet raken.
- Plak de RPM-code in Arduino IDE en upload hem naar de Nano.
- Open de Serial Monitor op 9600 baud.
- Draai de schijf met de hand, of schakel de motor in. De tutorial Arduino Nano - DC Motor laat zien hoe u een motor met de Nano aanstuurt.
- Lees de snelheid af op de Serial Monitor.
Hier draait de motor met ongeveer 300 RPM. Neem de regel met 98 pulsen: 98 x 60 = 5880 pulsen per minuut, en 5880 / 20 = 294 RPM. De regels met 0 bovenaan en onderaan zijn geprint voordat de motor startte en nadat hij stopte.
Goede gewoonten voor interruptcode op de Nano:
- Markeer elke variabele die de interruptroutine verandert als volatile.
- Houd de routine klein. Zet nooit delay() of Serial.print() erin.
- Blijf bij FALLING. CHANGE zou twee keer per tand afgaan en uw RPM verdubbelen.
Extra kennis
Welke sensor moet u kiezen?
Een sleufsensor, een IR-obstakelsensor en een rotary encoder kunnen allemaal pulsen aan Arduino Nano geven. Toch lost elk een ander probleem op. Stel uzelf deze vragen:
- Gaat het object door een kleine, vaste opening (een schijftand, een vlag op een bewegend onderdeel)? Kies de optische IR-sleufsensor. Hij geeft één schoon digitaal signaal per passage.
- Staat het object ergens voor de sensor, niet in een opening (een muur, een hand, een doos op een tafel)? Kies de IR-obstakeldetectiesensor. Hij ziet gereflecteerd licht in open ruimte.
- Draait een persoon aan een knop, en heeft de code de richting nodig (links of rechts)? Kies de rotary encoder. Hij heeft twee uitgangen (CLK en DT) en een drukknop.
Het is duidelijk dat de sleufsensor de betrouwbaarste telling geeft voor snel draaiende onderdelen, omdat het doel altijd op dezelfde plek door dezelfde opening van 5.9 mm gaat. De enige beperking is dat hij de draairichting niet kan bepalen.
Twee wielen, twee sensoren
Een kleine robotauto heeft vaak twee aangedreven wielen. De Nano heeft precies twee interruptpinnen, dus één sensor kan op D2 en een tweede sensor op D3. Elke sensor heeft dan zijn eigen teller en zijn eigen interruptroutine nodig. Houd hier rekening mee voordat u de rest van de robot plant: als D2 en D3 al door andere onderdelen worden gebruikt, verplaats die onderdelen dan naar andere pinnen, want geen enkele andere Nano-pin kan deze taak doen.
Probleemoplossing
| Probleem | Wat te controleren |
|---|---|
| De telling verandert nooit | Controleer of OUT naar D2 gaat en VCC naar 5V. Lees de pinlabels op uw module, want de volgorde is niet bij elke batch hetzelfde. |
| "Blocked" terwijl de opening leeg is | Uw module gebruikt omgekeerde logica. Verwissel LOW en HIGH in de eerste sketch. |
| RPM is altijd 0 | De tanden van de schijf bereiken de opening misschien niet. Verplaats de sensor zodat de tanden door het midden van de sleuf gaan. |
| RPM springt op en neer | Zorg ervoor dat de schijf strak op de as zit en niet wiebelt of de sensor raakt. |
| RPM is te hoog of te laag | SLOTS_PER_TURN komt niet overeen met uw schijf. Tel de gaten en pas de constante aan. |
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.