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:

Wij raden aan:

Arduino Nano optische IR-sleufsensor

Hardware Benodigd

1×Official Arduino Nano
1×Alternatief: DIYables Nano V3.0 Development Board
1×USB-A-naar-Mini-B-Kabel
1×IR Slotted Optical Speed Sensor
1×Verbindingsdraden
1×(Optioneel) Breadboard
1×(Aanbevolen) Schroefklem Uitbreidingsboard voor Arduino Nano
1×(Aanbevolen) Breakout Uitbreidingsboard voor Arduino Nano
1×(Aanbevolen) Stromsplitter voor Arduino Nano

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

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

Hoe de optische IR-sleufsensor werkt

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

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.

Arduino Nano bedradingsschema met optische IR-sleufsensor

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:
const int SENSOR_PIN = 2;
  • In setup() wordt die pin als ingang ingesteld. De module stuurt de lijn zelf aan, dus een gewone INPUT is genoeg:
pinMode(SENSOR_PIN, INPUT);
  • In loop() wordt de pin steeds opnieuw gelezen. Een LOW-waarde vertelt ons dat de lichtstraal onderbroken is:
int state = digitalRead(SENSOR_PIN);
  • 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():
volatile unsigned long pulseCount = 0;
  • De interruptroutine doet één klein werkje. Hij telt 1 op bij de teller en keert terug:
void countPulse() { pulseCount++; }
  • 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:
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • 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:
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts();
  • De laatste stap gebruikt de formule van hierboven:
float rpm = pulses * 60.0 / SLOTS_PER_TURN;

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.

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino Nano 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

  • 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.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

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.

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 2; // Arduino Nano 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"); } }

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.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

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.

Gerelateerde Tutorials

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