Arduino UNO R4 - Optische IR-sleufsensor (snelheidssensor)

In deze gids leren we hoe u de optische IR-sleufsensor (snelheidssensor) gebruikt met de Arduino UNO R4. In detail leren we:

Arduino UNO R4 en optische IR-sleufsensor (snelheidssensor)

Over de Optische IR-sleufsensor (snelheidssensor)

Deze kleine module heeft een U-vorm. Men noemt hem ook een photo interrupter of opto interrupter (vorkvormige optische sensor). Één arm bevat een infrarood-LED. De andere arm bevat een NPN-fototransistor. Ze staan tegenover elkaar over een opening van 5.9 mm. De sensor vertelt de Arduino UNO R4 één simpel ding: is de opening leeg, of zit er iets in?

Optische IR-sleufsensor (snelheidssensor)
Sensortype sleufvormig foto-elektrisch (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)

Veelvoorkomende toepassingen:

  • De motorsnelheid (tpm, RPM) meten met een encoderschijf, zoals een toerenteller.
  • Objecten of pulsen tellen.
  • Afstand meten door wielomwentelingen te tellen.
  • Wielsnelheid terugkoppelen naar een robot.
  • Een eindpositie of een beginpositie (home) detecteren.

Pinout

Pinout van de optische IR-sleufsensor (snelheidssensor)

De module heeft drie pinnen:

  • VCC-pin: verbind met 5V op de Arduino UNO R4 (de module accepteert 3.3V tot 5V).
  • GND-pin: verbind met GND (0V).
  • OUT-pin: digitale uitgang, verbind met een ingangspin van de Arduino UNO R4.

De volgorde van de pinnen kan per batch veranderen. Lees altijd de labels die op uw module zijn gedrukt.

Hoe Het Werkt

Hoe de optische IR-sleufsensor (snelheidssensor) werkt

De IR-LED schijnt de hele tijd door de sleuf.

  • Sleuf is leeg: het licht bereikt de fototransistor, dus de OUT-pin is HIGH.
  • Sleuf is geblokkeerd door iets ondoorzichtigs (een kaart, een vinger, een tand van een encoderschijf): het licht kan er niet door, dus de OUT-pin is LOW.

De ingebouwde Schmitt-trigger maakt van het ruwe lichtniveau een schone 0 of 1. Het signaal trilt niet, dus u hebt geen software-debounce nodig.

Twee kleine dingen om te weten:

  • Doorzichtig plastic of glas kan IR-licht doorlaten. Gebruik ondoorzichtige objecten.
  • Sommige modules van andere makers werken andersom. Als uw board "geblokkeerd" aangeeft terwijl de sleuf leeg is, wissel dan gewoon LOW en HIGH om in de eerste code. De RPM-code telt één flank per sleuf, dus werkt met beide types.

Bedradingsdiagram

Er zijn maar drie draden nodig: VCC naar 5V, GND naar GND, en OUT naar pin 2 van de Arduino UNO R4. De UNO R4 is een 5V-board, dus 5V-voeding is hier prima, en het OUT-signaal blijft op een veilig niveau.

Bedradingsdiagram van Arduino UNO R4 met optische IR-sleufsensor (snelheidssensor)

Zie De beste manier om Arduino Uno R4 en andere componenten van stroom te voorzien.

We gebruiken pin 2 omdat die een interrupt kan uitvoeren. De tweede code heeft dit nodig.

Hoe Te Programmeren Voor de Optische IR-sleufsensor (snelheidssensor)

Controleer of de sleuf geblokkeerd is (polling):

  • Stel de pin die verbonden is met de OUT-pin in als ingang:
pinMode(SENSOR_PIN, INPUT);
  • Lees de pin. LOW betekent geblokkeerd, HIGH betekent vrij:
int state = digitalRead(SENSOR_PIN);
  • Vergelijk met de vorige meting, zodat u alleen handelt als de toestand verandert:
if (state != lastState) { // the slot just became blocked or clear }

Snelle pulsen tellen (interrupt):

  • Maak een teller. Markeer hem als volatile, omdat de interrupt hem verandert:
volatile unsigned long pulseCount = 0;
  • Schrijf een kleine functie die één bij de teller optelt:
void countPulse() { pulseCount++; }
  • Voer die functie uit elke keer dat het signaal van HIGH naar LOW valt (één tand komt in de sleuf):
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Kopieer en reset de teller één keer per seconde terwijl de interrupts gepauzeerd zijn, en reken dan de pulsen om naar tpm (RPM):
noInterrupts(); unsigned long pulses = pulseCount; pulseCount = 0; interrupts(); float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Waarom deze formule? Bij een schijf met 20 sleuven geeft één volledige omwenteling 20 pulsen. Pulsen in 1 seconde × 60 geeft pulsen per minuut. Deel door 20 en u krijgt omwentelingen per minuut (tpm, RPM).

Arduino UNO R4 Code - Object in de Sleuf Detecteren

Deze sketch controleert de OUT-pin steeds opnieuw. Hij print alleen een regel als de toestand verandert, en telt er één bij een teller op elke keer dat de sleuf geblokkeerd wordt.

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

Volg deze instructies stap voor stap:

  • Als dit uw eerste keer is met de Arduino Uno R4 WiFi/Minima, raadpleeg dan de tutorial over het instellen van de omgeving voor Arduino Uno R4 WiFi/Minima in de Arduino IDE.
  • Verbind de componenten volgens het meegeleverde diagram.
  • Verbind het Arduino Uno R4 board met uw computer via een USB-kabel.
  • Start de Arduino IDE op uw computer.
  • Selecteer het juiste Arduino Uno R4 board (bijv. Arduino Uno R4 WiFi) en COM-poort.
  • Kopieer de bovenstaande code en plak deze in de Arduino IDE.
  • Klik op de Upload knop om de code naar de Arduino UNO R4 te versturen.
  • Open de Serial Monitor en stel hem in op 9600 baud.
  • Schuif een stukje karton (of uw vinger) in de sleuf en trek het er weer uit. Doe dit een paar keer.
  • Bekijk het resultaat op de Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 R4 WiFi on COM15
2

Elke passage geeft twee regels: één als de kaart erin gaat, één als hij eruit komt. Er wordt geen regel geprint zolang er niets verandert.

Arduino UNO R4 Code - Motorsnelheid Meten (tpm, RPM)

Polling in loop() is prima voor langzame objecten. Een draaiende schijf is veel sneller, en loop() kan sommige tanden missen. Daarom telt deze sketch pulsen met een interrupt op de FALLING-flank, wat precies één telling per tand geeft. Elke seconde print hij het aantal pulsen en de snelheid in tpm (RPM).

De constante SLOTS_PER_TURN staat op 20. Dat is de gebruikelijke encoderschijf die bij TT-tandwielmotoren wordt geleverd. Heeft uw schijf een ander aantal sleuven, verander dan deze waarde.

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

  • Bevestig de encoderschijf op de motoras of het wiel.
  • Plaats de sensor zo dat de tanden van de schijf door de sleuf gaan.
  • Zorg dat de schijf de armen van de sensor niet raakt.
  • U kunt de schijf met de hand laten draaien, of de motor voeden. De motor heeft zijn eigen bedrading nodig. Zie daarvoor de tutorial Arduino UNO R4 - DC Motor.

Snelle Stappen

  • Houd dezelfde bedrading als eerder.
  • Kopieer de RPM-code hierboven en plak deze in de Arduino IDE.
  • Klik op de Upload knop.
  • Open de Serial Monitor op 9600 baud.
  • Laat de schijf draaien en laat hem daarna stoppen.
  • Bekijk de snelheid op de Serial Monitor. Hier draait de motor met ongeveer 300 tpm (RPM):
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 R4 WiFi on COM15
2

Controleer één regel: 100 pulsen × 60 ÷ 20 = 300 tpm (RPM).

Wilt u weten hoe ver een wiel heeft bewogen? Vermenigvuldig het aantal omwentelingen met de omtrek van het wiel (π × wieldiameter).

※ Notiz:

  • Houd de interruptfunctie kort. Roep Serial.print() er niet in aan.
  • Elke variabele die de interrupt verandert, moet volatile zijn.
  • Wilt u een object op afstand detecteren in plaats van in een sleuf? Probeer de obstakel vermijdingssensor. Hebt u een knop nodig die ook de draairichting geeft? Probeer de 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.

Reacties

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