ESP32 - Optische IR-sleufsensor (snelheidssensor)

Deze handleiding laat zien hoe u met ESP32 de toestand van een optische IR-sleufsensor leest, de objecten telt die door de sleuf gaan, en de pulsen van een encoderschijf omzet in een motorsnelheid in tpm (RPM) die in de Serial Monitor wordt afgedrukt.

ESP32 en optische IR-sleufsensor

Over de optische IR-sleufsensor

Deze kleine module heeft een U-vorm met een smalle opening in het midden. Mensen noemen hem met veel namen: photo interrupter, opto interrupter, U-vormige IR-sensor of gewoon sleufsensor. Hij doet één ding. Hij vertelt de ESP32 of er iets in de opening zit of niet. Omdat hij heel snel kan schakelen, is hij een goede keuze om te meten hoe snel een wiel of een motor draait.

Optische IR-sleufsensor
Het sensortype fotoelektrisch met sleuf (IR-led + NPN-fototransistor)
De breedte van de sleuf 5.9 mm
De uitgang digitaal (TTL), LOW als geblokkeerd, HIGH als vrij
De signaalbewerking ingebouwde Schmitt-trigger
De montage M3-schroefgaten aan beide uiteinden
Het aantal pinnen 3 (VCC, GND, OUT)
Werkspanning 3.3V tot 5V DC

Typische toepassingen zijn het meten van de motorsnelheid (tpm) met een encoderschijf, een eenvoudige toerenteller, het tellen van objecten of pulsen, het meten van afstand door wielomwentelingen te tellen, snelheidsterugkoppeling voor een robotauto, en eindstand- of positiedetectie.

Pinout van de optische IR-sleufsensor

Pinout van de optische IR-sleufsensor
  • VCC-pin: sluit deze pin aan op de 3.3V-pin van de ESP32
  • GND-pin: sluit deze pin aan op GND (0V)
  • OUT-pin: sluit deze pin aan op een inputpin van de ESP32 (GPIO18 in deze handleiding). Hij geeft LOW als de sleuf geblokkeerd is en HIGH als de sleuf vrij is

De volgorde van de pinnen is niet altijd gelijk van batch tot batch. Lees de labels die op uw eigen module staan voordat u de kabels aansluit.

De OUT-pin gaat zo hoog als de spanning die u aan VCC geeft. De ESP32 is een 3,3V-board, dus voed de sensor met de 3.3V-pin, niet met 5V. Op die manier stuurt de OUT-pin nooit meer dan 3,3V naar de GPIO-pin.

Hoe werkt de optische IR-sleufsensor

Hoe de optische IR-sleufsensor werkt

Eén arm van de U bevat een infrarood-led. De andere arm bevat een NPN-fototransistor. De twee staan tegenover elkaar aan weerszijden van de opening van 5,9 mm.

  • Niets in de opening: het IR-licht bereikt de fototransistor en de OUT-pin is HIGH.
  • Een ondoorzichtig object in de opening, zoals een stukje karton of één tand van een encoderschijf: het licht wordt onderbroken en de OUT-pin is LOW.

Een Schmitt-trigger op de module zet het ruwe lichtniveau om in een schone 0 of 1, zonder getril tussen de twee. Daardoor heeft de ESP32-code geen debounce nodig.

Doorzichtig plastic kan het IR-licht doorlaten, dus het wordt niet altijd als geblokkeerd gezien. Gebruik objecten waar u niet doorheen kunt kijken.

Sommige modules van andere makers werken andersom. Als uw sensor "geblokkeerd" meldt terwijl de opening leeg is, wissel dan gewoon LOW en HIGH in de eerste code. De RPM-code telt één flank voor elke sleuf van de schijf, dus hij werkt met beide typen.

Aansluitschema

Hoe u ESP32 en de optische IR-sleufsensor aansluit

Er zijn maar drie kabels nodig. Sluit VCC aan op 3.3V, GND op GND en OUT op GPIO18. U kunt de kabels direct in de pinnen steken, of een breadboard gebruiken als u dat wilt.

ESP32 aansluitschema met optische IR-sleufsensor

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

Als u niet weet hoe u ESP32 en andere componenten van stroom moet voorzien, vindt u instructies in de volgende tutorial: Hoe ESP32 van stroom te voorzien.

Optische IR-sleufsensor ESP32
VCC 3.3V
GND GND
OUT GPIO18

Hoe u de encoderschijf instelt voor snelheidsmeting

Om snelheid te meten heeft de sensor iets nodig dat het licht steeds opnieuw onderbreekt terwijl het draait. Dat is de taak van de encoderschijf. Bevestig de schijf op de motoras of het wiel en bevestig dan de sensor met zijn M3-gaten zodat de tanden van de schijf door de opening gaan. De schijf mag de sensor op geen enkel punt van de draai raken.

U kunt de schijf met de hand laten draaien voor een eerste test. Om hem met een motor te laten draaien, zie de ESP32 gelijkstroommotor-handleiding, want de motor heeft zijn eigen bedrading nodig.

Hoe te Programmeren voor de optische IR-sleufsensor

Er is geen library nodig. De twee voorbeelden hieronder gebruiken alleen functies die bij de ESP32-core horen.

  • Stel de pin in als input: pinMode(SENSOR_PIN, INPUT);
  • Lees de toestand van de sleuf (LOW betekent geblokkeerd): int state = digitalRead(SENSOR_PIN);
  • Doe alleen iets als de toestand verandert: if (state != lastState) { ... }
  • Roep een korte functie aan elke keer dat een tand de sleuf blokkeert: attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Markeer die functie met IRAM_ATTR zodat de ESP32 hem snel kan uitvoeren: void IRAM_ATTR countPulse() { pulseCount++; }
  • Zet de pulsen van één seconde om in toeren per minuut: float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Waarom een interrupt gebruiken voor snelheid? Als de motor snel draait, komen de pulsen heel dicht op elkaar, en een eenvoudige controle in loop() kan er een paar missen. De interrupt vangt ze allemaal op. De FALLING-flank is gekozen zodat elke tand maar één keer wordt geteld. Lees voor meer informatie de ESP32 GPIO-interrupt-handleiding.

ESP32 Code - Objecten in de sleuf detecteren en tellen

Deze code controleert de OUT-pin steeds opnieuw. Hij drukt alleen een bericht af als de toestand verandert. Elke keer dat de sleuf geblokkeerd wordt, gaat de teller met één omhoog.

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

Snel aan de slag

Is dit de eerste keer dat u een ESP32 gebruikt? Bekijk dan hoe u de omgeving instelt voor ESP32 in Arduino IDE.

  • Sluit de sensor aan op de ESP32 zoals getoond in het aansluitschema.
  • Steek de USB-kabel in de ESP32 en uw pc.
  • Open Arduino IDE en selecteer het ESP32 Dev Module-board en de juiste COM-poort.
  • Kopieer bovenstaande code en plak deze in Arduino IDE.
  • Klik op de knop Upload in Arduino IDE om de code te compileren en naar de ESP32 te uploaden.
  • Klik op het pictogram Serial Monitor en typ of selecteer 9600 als baudrate.
  • Beweeg een stukje karton of uw vinger in de sleuf en haal het er weer uit. Doe dit een paar keer.
  • Bekijk de berichten in de Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' 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
ESP32 Dev Module on COM15
2

ESP32 Code - Motorsnelheid meten (RPM)

Nu werkt de sensor als toerenteller. Elke tand van de schijf die de sleuf blokkeert, start de interrupt, die één bij een teller optelt. Eén keer per seconde leest de code de teller, zet hem terug op nul en berekent de snelheid.

De berekening is eenvoudig. Een gewone encoderschijf, zoals die bij TT-tandwielmotoren wordt verkocht, heeft 20 sleuven, dus één volledige draai geeft 20 pulsen. De pulsen in één seconde, maal 60, geeft de pulsen in één minuut. Deel dat door 20 en u krijgt de toeren per minuut (RPM). Als uw schijf een ander aantal sleuven heeft, verander dan de waarde van SLOTS_PER_TURN in de code.

/* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = 18; // ESP32 GPIO18 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 IRAM_ATTR 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(); unsigned long pulses = pulseCount; // read and reset the counter pulseCount = 0; 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"); } }

Snel aan de slag

  • Bevestig de encoderschijf en de sensor zoals getoond op de afbeelding van de encoderschijf hierboven. De bedrading naar de ESP32 blijft hetzelfde.
  • Kopieer bovenstaande code, plak deze in Arduino IDE en klik op de knop Upload.
  • Open de Serial Monitor op 9600 baud.
  • Laat de schijf met de hand draaien, of zet de motor aan.
  • Bekijk de snelheid in de Serial Monitor. Het voorbeeld hieronder is een motor die op ongeveer 300 RPM draait, met de motor stilstaand aan het begin en aan het einde.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' 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
ESP32 Dev Module on COM15
2

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

Als u een object een paar centimeter verderop wilt detecteren in plaats van in een sleuf, zie de ESP32 infrarood obstakeldetectiesensor-handleiding. Als u een knop nodig heeft die ook de draairichting geeft, zie de ESP32 rotary encoder-handleiding.

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.

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