Arduino Nano ESP32 - IR-Gabellichtschranke (Geschwindigkeitssensor)
In dieser Anleitung lernen wir, wie man die IR-Gabellichtschranke (optischer Geschwindigkeitssensor) mit dem Arduino Nano ESP32 verwendet. Im Detail lernen wir:
- Warum die Gabellichtschranke ein LOW-Signal gibt, wenn ein Objekt in ihrem Spalt sitzt.
- Wie man den Sensor an den 3,3-V-Pin und Pin D2 des Arduino Nano ESP32 anschließt.
- Wie man ein Programm für den Arduino Nano ESP32 schreibt, das jedes Objekt zählt, das sich durch den Spalt bewegt.
- Wie man ein Programm für den Arduino Nano ESP32 schreibt, das die Drehzahl einer Scheibe in U/min (RPM) liest, mit einer Interrupt-Funktion im schnellen Speicher.
Erforderliche Hardware
Oder Sie können die folgenden Kits kaufen:
| 1 | × | DIYables Sensor-Kit (18 Sensoren/Displays) |
Über die IR-Gabellichtschranke
Wenn Sie den Sensor von der Seite ansehen, sehen Sie den Buchstaben U. Innen an der linken und rechten Wand dieses U schauen sich zwei winzige Bauteile an: eine Infrarot-LED an der einen Wand und ein NPN-Fototransistor an der anderen. Der offene Raum dazwischen ist 5,9 mm breit. Manche Verkäufer nennen dieses Bauteil Opto-Interrupter, Photo Interrupter oder einfach IR-Schlitzsensor. Es ist dasselbe.
Wie es funktioniert

Stellen Sie sich eine winzige Lichtschranke vor. Die LED geht nie aus, und der Fototransistor beobachtet ständig ihr Licht.
- Nichts im Spalt → der Fototransistor bekommt das Licht → OUT liest HIGH.
- Ein festes Objekt im Spalt (ein Streifen Pappe, eine Fingerspitze, ein Zahn einer Encoderscheibe) → das Licht wird unterbrochen → OUT liest LOW.
Auf dem Modul sitzt ein Schmitt-Trigger. Er macht aus dem Lichtpegel eine klare 0 oder 1, ohne Springen dazwischen. Deshalb braucht Ihr Sketch keinen Entprell-Code.
Bitte beachten Sie:
- Glas und klarer Kunststoff können Infrarotlicht durchlassen, daher sieht der Sensor sie eventuell nicht. Wählen Sie etwas, das Licht nicht durchlässt.
- Einige Module anderer Hersteller nutzen umgekehrte Logik: LOW, wenn der Spalt leer ist. Wenn der erste Sketch unten „blockiert“ meldet, obwohl nichts im Spalt ist, tauschen Sie in diesem Sketch LOW und HIGH. Der Geschwindigkeits-Sketch funktioniert mit beiden Typen, da er eine Flanke pro Zahn zählt.
Spezifikationen
| IR-Gabellichtschranke (Geschwindigkeitssensor) | |
|---|---|
| Sensortyp | Gabel-Lichtschranke (IR-LED + NPN-Fototransistor) |
| Spaltbreite | 5,9 mm |
| Betriebsspannung | 3,3V bis 5V DC |
| Ausgang | digital (TTL), LOW bei Blockierung, HIGH bei freiem Spalt |
| Signalaufbereitung | eingebauter Schmitt-Trigger |
| Montage | M3-Schraubenlöcher an beiden Enden |
| Pins | 3 (VCC, GND, OUT) |
Wo man ihn einsetzt:
- Ein Drehzahlmesser: Setzen Sie eine Encoderscheibe auf einen Motor und lesen Sie seine U/min (RPM).
- Rückmeldung, wie schnell sich ein Roboterrad dreht.
- Teile, Impulse oder Dinge auf einem Band zählen.
- Eine Strecke bestimmen, indem man zählt, wie oft sich ein Rad dreht.
- Ein Endschalter oder Referenzpunkt-Schalter ohne bewegliche Kontakte.
Pinbelegung

- OUT-Pin: das digitale Signal. Mit einem digitalen Eingang des Arduino Nano ESP32 verbinden (in dieser Anleitung D2).
- GND-Pin: mit GND (0V) verbinden.
- VCC-Pin: mit dem 3,3-V-Pin des Arduino Nano ESP32 verbinden. Das Modul arbeitet von 3,3V bis 5V.
Chargen sind nicht alle gleich, und die drei Pins können in einer anderen Reihenfolge kommen. Vertrauen Sie den Beschriftungen auf Ihrer eigenen Platine, nicht der Reihenfolge in einem Bild.
Verdrahtungsdiagramm
Der Nano ESP32 arbeitet mit 3,3-V-Logik, und seine Eingangspins sind nicht für 5V gemacht. Das OUT-Signal steigt bis zur Spannung an VCC, daher versorgen wir den Sensor vom 3,3-V-Pin und nicht von 5V. So sieht D2 nie mehr als 3,3V.

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
D2 akzeptiert auch einen Interrupt, den der Geschwindigkeits-Sketch später nutzt.
So programmiert man die IR-Gabellichtschranke
Es gibt zwei Wege, diesen Sensor zu lesen. Welcher passt, hängt davon ab, wie schnell sich Dinge durch den Spalt bewegen.
Weg 1 - den Pin in loop() lesen (gut für langsame Objekte):
- Sagen Sie dem Board, dass D2 ein Eingang ist.
- Lesen Sie einen Wert. Ein LOW-Wert bedeutet, dass der Spalt blockiert ist.
- Tun Sie nur etwas, wenn der neue Wert nicht dem alten entspricht, und speichern Sie ihn dann für das nächste Mal.
Weg 2 - einen Interrupt zählen lassen (nötig für eine drehende Scheibe):
- Erstellen Sie den Zähler mit dem Wort volatile, da die Interrupt-Funktion ihn im Hintergrund ändert.
- Schreiben Sie die Interrupt-Funktion. Beim ESP32-Chip fügen Sie IRAM_ATTR vor ihrem Namen hinzu. Dadurch liegt die Funktion im schnellen internen RAM des Chips und kann jedes Mal sofort laufen.
- Verknüpfen Sie die Funktion mit D2. FALLING bedeutet, dass die Funktion läuft, wenn OUT von HIGH auf LOW fällt. Das passiert einmal, jedes Mal wenn ein Zahn in den Spalt kommt.
- Nehmen Sie jede Sekunde die Anzahl, setzen Sie sie auf null zurück und rechnen Sie sie in U/min (RPM) um.
Wie funktioniert die Rechnung? Nehmen wir an, die Scheibe hat 20 Schlitze. Dann sind 20 Impulse eine ganze Umdrehung. Multiplizieren Sie die Impulse einer Sekunde mit 60, und Sie haben die Impulse pro Minute. Teilen Sie das durch 20, und Sie haben die Umdrehungen pro Minute, also U/min (RPM).
Arduino Nano ESP32-Code - Objekte zählen, die durch den Spalt laufen
Der Sketch unten liest D2 immer wieder. Eine neue Zeile erscheint im Serial Monitor nur, wenn der Spalt von frei zu blockiert wechselt oder zurück. Jedes Mal, wenn er blockiert wird, steigt der Zähler um eins.
Schnelle Schritte
Folgen Sie diesen Anweisungen Schritt für Schritt:
- Neu beim Nano ESP32? Gehen Sie zuerst durch wie man den Arduino Nano ESP32 in der Arduino IDE einrichtet.
- Verdrahten Sie die Komponenten gemäß dem gezeigten Diagramm. Prüfen Sie doppelt, dass VCC an 3,3V geht.
- Verbinden Sie den Arduino Nano ESP32 mit dem Type-C-Kabel mit Ihrem Computer.
- Starten Sie die Arduino IDE auf Ihrem Computer.
- Wählen Sie das passende Arduino Nano ESP32-Board (z. B. Arduino Nano ESP32) und den COM-Port aus.
- Fügen Sie den Code in einen neuen Sketch ein.
- Drücken Sie die Schaltfläche Upload und warten Sie, bis der Vorgang fertig ist.
- Öffnen Sie den Serial Monitor und wählen Sie 9600 Baud.
- Schieben Sie einen Pappstreifen in den Spalt, halten Sie ihn kurz und ziehen Sie ihn heraus. Wiederholen Sie das noch zweimal.
- Lesen Sie die Meldungen:
Die Pappe erzeugt eine „blocked“-Zeile beim Hineinschieben und eine „clear“-Zeile beim Herausziehen. Solange Sie sie still halten, bleibt der Bildschirm ruhig.
Arduino Nano ESP32-Code - Motordrehzahl lesen (U/min)
Eine schnelle Scheibe kann viele Zähne durch den Spalt schieben, zwischen zwei Durchläufen von loop(). Beim Abfragen gingen daher einige verloren. Dieser Sketch nutzt stattdessen einen Interrupt. Die Funktion countPulse() ist mit IRAM_ATTR markiert, damit der ESP32 sie im schnellen Speicher hält und sofort zu ihr springen kann. Einmal pro Sekunde gibt der Sketch aus, wie viele Impulse er bekommen hat und die Drehzahl in U/min (RPM).
Suchen Sie SLOTS_PER_TURN oben im Code. Dort steht 20, die Schlitzzahl der Encoderscheibe, die meist mit TT-Getriebemotoren geliefert wird. Zählen Sie die Schlitze Ihrer eigenen Scheibe und tragen Sie diese Zahl hier ein, wenn sie nicht 20 ist.
Die Encoderscheibe montieren
- Schieben Sie die Scheibe auf die Motorwelle (oder befestigen Sie sie am Rad).
- Richten Sie den Sensor so aus, dass der Rand der Scheibe mit seinen Zähnen im Spalt läuft.
- Drehen Sie die Scheibe langsam von Hand, um sicherzugehen, dass sie nie an den Wänden des U schleift.
- Zum Drehen nutzen Sie Ihre Hand oder lassen Sie den Motor laufen. Der Motor hat seine eigene Verdrahtung, die in der Anleitung Arduino Nano ESP32 - Gleichstrommotor behandelt wird.
Schnelle Schritte
- Ändern Sie die Sensorverdrahtung nicht.
- Fügen Sie den RPM-Code in die Arduino IDE ein.
- Drücken Sie Upload.
- Öffnen Sie den Serial Monitor mit 9600 Baud.
- Bringen Sie die Scheibe zum Drehen und lassen Sie sie dann zum Stillstand kommen.
- Beobachten Sie die Zahlen. In diesem Durchlauf dreht sich der Motor mit etwa 300 U/min (RPM):
Probieren Sie die Rechnung in der Zeile mit 101: 101 × 60 ÷ 20 = 303 U/min (RPM). Die erste und die letzte Zeile zeigen 0, weil sich die Scheibe nicht bewegt.
Bei einem Roboterrad können Sie auch ausrechnen, wie weit es gerollt ist: Anzahl der Umdrehungen × π × Raddurchmesser.
※ Notiz:
- Schreiben Sie sehr wenig Code in countPulse(). Geben Sie dort nie etwas aus.
- Jede Variable, die die Interrupt-Funktion ändert, braucht das Schlüsselwort volatile.
- Lassen Sie IRAM_ATTR vor der Interrupt-Funktion stehen, damit sie im schnellen Speicher bleibt.
- Um ein Objekt vor dem Sensor (nicht in einem Spalt) zu erkennen, lesen Sie die Anleitung Hindernissensor. Für einen Drehknopf, der auch die Richtung meldet, lesen Sie die Anleitung Drehencoder.
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.