ESP32 - IR-Gabellichtschranke (Geschwindigkeitssensor)

Dieses Tutorial zeigt Ihnen, wie Sie mit dem ESP32 den Zustand einer IR-Gabellichtschranke lesen, die Objekte zählen, die durch ihren Schlitz laufen, und die Impulse einer Encoderscheibe in eine Motordrehzahl in U/min (RPM) umrechnen, die im Serial Monitor ausgegeben wird.

ESP32 und IR-Gabellichtschranke

Über die IR-Gabellichtschranke

Dieses kleine Modul hat eine U-Form mit einem schmalen Spalt in der Mitte. Man nennt es mit vielen Namen: Gabellichtschranke, Opto-Interrupter, U-förmiger IR-Sensor oder einfach Schlitzsensor. Es erfüllt eine Aufgabe. Es sagt dem ESP32, ob sich etwas im Spalt befindet oder nicht. Weil es sehr schnell schalten kann, ist es eine gute Wahl, um zu messen, wie schnell sich ein Rad oder ein Motor dreht.

IR-Gabellichtschranke
Sensortyp Schlitz-Lichtschranke (IR-LED + NPN-Fototransistor)
Schlitzbreite 5,9 mm
Ausgang digital (TTL), LOW bei Unterbrechung, HIGH bei freiem Schlitz
Signalaufbereitung eingebauter Schmitt-Trigger
Befestigung M3-Schraubenlöcher an beiden Enden
Anzahl der Pins 3 (VCC, GND, OUT)
Betriebsspannung 3,3V bis 5V DC

Typische Anwendungen sind die Messung der Motordrehzahl (U/min) mit einer Encoderscheibe, ein einfacher Tachometer, das Zählen von Objekten oder Impulsen, die Entfernungsmessung durch Zählen der Radumdrehungen, die Rückmeldung der Raddrehzahl bei einem Roboterauto sowie die Endlagen- und Positionserkennung.

Pinbelegung der IR-Gabellichtschranke

Pinbelegung der IR-Gabellichtschranke
  • VCC-Pin: Verbinden Sie diesen Pin mit dem 3,3V-Pin des ESP32
  • GND-Pin: Verbinden Sie diesen Pin mit GND (0V)
  • OUT-Pin: Verbinden Sie diesen Pin mit einem Eingangspin des ESP32 (GPIO18 in diesem Tutorial). Er gibt LOW aus, wenn der Schlitz blockiert ist, und HIGH, wenn er frei ist

Die Pin-Reihenfolge ist nicht von Charge zu Charge immer gleich. Lesen Sie die auf Ihrem Modul aufgedruckten Beschriftungen, bevor Sie die Drähte anschließen.

Der OUT-Pin geht so hoch wie die Spannung, die Sie an VCC anlegen. Der ESP32 ist ein 3,3V-Board, versorgen Sie den Sensor also über den 3,3V-Pin, nicht über 5V. So sendet der OUT-Pin nie mehr als 3,3V in den GPIO-Pin.

Wie die IR-Gabellichtschranke funktioniert

Wie die IR-Gabellichtschranke funktioniert

Ein Arm des U enthält eine Infrarot-LED. Der andere Arm enthält einen NPN-Fototransistor. Beide liegen sich über den 5,9 mm breiten Spalt gegenüber.

  • Nichts im Spalt: Das IR-Licht erreicht den Fototransistor, und der OUT-Pin ist HIGH.
  • Ein undurchsichtiges Objekt im Spalt, etwa ein Stück Karton oder ein Zahn einer Encoderscheibe: Das Licht wird unterbrochen, und der OUT-Pin ist LOW.

Ein Schmitt-Trigger auf der Platine wandelt den rohen Lichtpegel in eine saubere 0 oder 1 um, ohne Flattern dazwischen. Dank ihm braucht der ESP32-Code kein Entprellen.

Klarer Kunststoff lässt das IR-Licht eventuell durch, daher wird er nicht immer als blockiert erkannt. Verwenden Sie Objekte, durch die Sie nicht hindurchsehen können.

Einige Module anderer Hersteller arbeiten umgekehrt. Wenn Ihr Sensor "blockiert" meldet, obwohl der Spalt leer ist, tauschen Sie im ersten Code einfach LOW und HIGH. Der U/min-Code zählt eine Flanke pro Schlitz der Scheibe, daher funktioniert er mit beiden Typen.

Verdrahtungsdiagramm

So verbinden Sie den ESP32 und die IR-Gabellichtschranke

Es sind nur drei Drähte nötig. Verbinden Sie VCC mit 3,3V, GND mit GND und OUT mit GPIO18. Sie können die Drähte direkt an die Pins stecken oder ein Breadboard verwenden, wenn Sie möchten.

Verdrahtungsdiagramm ESP32 und IR-Gabellichtschranke

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Wenn Sie nicht wissen, wie Sie ESP32 und andere Komponenten mit Strom versorgen, finden Sie Anleitungen im folgenden Tutorial: Wie man ESP32 mit Strom versorgt.

IR-Gabellichtschranke ESP32
VCC 3.3V
GND GND
OUT GPIO18

So richten Sie die Encoderscheibe für die Geschwindigkeitsmessung ein

Um die Geschwindigkeit zu messen, braucht der Sensor etwas, das beim Drehen immer wieder das Licht unterbricht. Das ist die Aufgabe der Encoderscheibe. Befestigen Sie die Scheibe an der Motorwelle oder am Rad, und befestigen Sie dann den Sensor mit seinen M3-Löchern so, dass die Zähne der Scheibe durch den Spalt laufen. Die Scheibe darf den Sensor an keiner Stelle der Drehung berühren.

Für einen ersten Test können Sie die Scheibe von Hand drehen. Um sie mit einem Motor zu drehen, siehe das ESP32-Gleichstrommotor-Tutorial, denn der Motor braucht eine eigene Verdrahtung.

So programmieren Sie die IR-Gabellichtschranke

Es wird keine Bibliothek benötigt. Die zwei folgenden Beispiele verwenden nur Funktionen, die im ESP32-Core enthalten sind.

  • Legen Sie den Pin als Eingang fest: pinMode(SENSOR_PIN, INPUT);
  • Lesen Sie den Zustand des Schlitzes (LOW bedeutet blockiert): int state = digitalRead(SENSOR_PIN);
  • Handeln Sie nur, wenn sich der Zustand ändert: if (state != lastState) { ... }
  • Rufen Sie jedes Mal, wenn ein Zahn den Schlitz blockiert, eine kurze Funktion auf: attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Markieren Sie diese Funktion mit IRAM_ATTR, damit der ESP32 sie schnell ausführen kann: void IRAM_ATTR countPulse() { pulseCount++; }
  • Wandeln Sie die Impulse einer Sekunde in Umdrehungen pro Minute um: float rpm = pulses * 60.0 / SLOTS_PER_TURN;

Warum einen Interrupt für die Geschwindigkeit verwenden? Wenn der Motor schnell läuft, kommen die Impulse sehr dicht aufeinander, und eine einfache Abfrage in loop() kann einige davon verpassen. Der Interrupt fängt jeden einzelnen ab. Die FALLING-Flanke wird gewählt, damit jeder Zahn nur einmal gezählt wird. Mehr dazu finden Sie im ESP32-GPIO-Interrupt-Tutorial.

ESP32-Code - Objekte im Schlitz erkennen und zählen

Dieser Code prüft immer wieder den OUT-Pin. Er gibt nur dann eine Meldung aus, wenn sich der Zustand ändert. Jedes Mal, wenn der Schlitz blockiert wird, steigt der Zähler um eins.

/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/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; } }

Schnelle Schritte

Wenn Sie den ESP32 zum ersten Mal verwenden, lesen Sie wie Sie die Umgebung für den ESP32 in der Arduino IDE einrichten.

  • Verbinden Sie den Sensor wie im Verdrahtungsdiagramm gezeigt mit dem ESP32.
  • Stecken Sie das USB-Kabel in den ESP32 und Ihren PC.
  • Öffnen Sie die Arduino IDE und wählen Sie dann das Board ESP32 Dev Module und den richtigen COM-Port aus.
  • Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein.
  • Klicken Sie in der Arduino IDE auf die Schaltfläche Upload, um den Code zu kompilieren und auf den ESP32 hochzuladen.
  • Klicken Sie auf das Symbol Serial Monitor und geben Sie dann 9600 als Baudrate ein oder wählen Sie sie aus.
  • Bewegen Sie ein Stück Karton oder Ihren Finger in den Schlitz und nehmen Sie es wieder heraus. Tun Sie das einige Male.
  • Sehen Sie sich die Meldungen im Serial Monitor an.
∞
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 - Motordrehzahl messen (U/min)

Jetzt arbeitet der Sensor als Tachometer. Jeder Zahn der Scheibe, der den Schlitz blockiert, löst den Interrupt aus, der einen Zähler um eins erhöht. Einmal pro Sekunde liest der Code den Zähler, setzt ihn auf null zurück und berechnet die Drehzahl.

Die Rechnung ist einfach. Eine übliche Encoderscheibe, wie sie mit TT-Getriebemotoren verkauft wird, hat 20 Schlitze, sodass eine volle Umdrehung 20 Impulse ergibt. Die Impulse einer Sekunde mal 60 ergeben die Impulse einer Minute. Teilen Sie das durch 20, und Sie erhalten die Umdrehungen pro Minute (U/min). Wenn Ihre Scheibe eine andere Anzahl von Schlitzen hat, ändern Sie den Wert von SLOTS_PER_TURN im Code.

/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/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"); } }

Schnelle Schritte

  • Befestigen Sie die Encoderscheibe und den Sensor wie auf dem Bild der Encoderscheibe oben gezeigt. Die Verdrahtung zum ESP32 bleibt gleich.
  • Kopieren Sie den obigen Code, fügen Sie ihn in die Arduino IDE ein und klicken Sie auf die Schaltfläche Upload.
  • Öffnen Sie den Serial Monitor mit 9600 Baud.
  • Drehen Sie die Scheibe von Hand oder schalten Sie den Motor ein.
  • Beobachten Sie die Geschwindigkeit im Serial Monitor. Das folgende Beispiel zeigt einen Motor, der sich mit etwa 300 U/min dreht, wobei der Motor am Anfang und am Ende steht.
∞
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

Möchten Sie auch wissen, wie weit ein Rad gefahren ist? Multiplizieren Sie die Anzahl der Umdrehungen mit dem Radumfang (π × Raddurchmesser).

Wenn Sie ein Objekt in einigen Zentimetern Entfernung statt in einem Schlitz erkennen möchten, siehe das ESP32-Infrarot-Hinderniserkennungssensor-Tutorial. Wenn Sie einen Drehknopf brauchen, der auch die Drehrichtung liefert, siehe das ESP32-Drehgeber-Tutorial.

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!