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:

Arduino Nano ESP32 und IR-Gabellichtschranke (optischer Geschwindigkeitssensor)

Erforderliche Hardware

1×Arduino Nano ESP32
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×IR Slotted Optical Speed Sensor
1×Verbindungskabel
1×(Optional) Breadboard
1×(Optional) DC-Stromanschluss
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für Arduino Nano
1×(Empfohlen) Breakout-Erweiterungsboard für Arduino Nano
1×(Empfohlen) Stromverteiler für Arduino Nano ESP32

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Ü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

Wie die IR-Gabellichtschranke 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

Pinbelegung der IR-Gabellichtschranke
  • 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.

Arduino Nano ESP32 IR-Gabellichtschranke Verdrahtungsdiagramm

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.
pinMode(SENSOR_PIN, INPUT);
  • Lesen Sie einen Wert. Ein LOW-Wert bedeutet, dass der Spalt blockiert ist.
int state = digitalRead(SENSOR_PIN);
  • Tun Sie nur etwas, wenn der neue Wert nicht dem alten entspricht, und speichern Sie ihn dann für das nächste Mal.
if (state != lastState) { // the gap just changed: blocked or clear lastState = state; }

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.
volatile unsigned long pulseCount = 0;
  • 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.
void IRAM_ATTR countPulse() { pulseCount++; }
  • 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.
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, FALLING);
  • Nehmen Sie jede Sekunde die Anzahl, setzen Sie sie auf null zurück und rechnen Sie sie in U/min (RPM) um.
unsigned long pulses = pulseCount; pulseCount = 0; float rpm = pulses * 60.0 / SLOTS_PER_TURN;

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.

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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/arduino-nano-esp32/arduino-nano-esp32-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = D2; // Arduino Nano ESP32 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; } }

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

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.

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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/arduino-nano-esp32/arduino-nano-esp32-ir-slotted-optical-speed-sensor */ const int SENSOR_PIN = D2; // Arduino Nano ESP32 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 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"); } }

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

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.

Funktionsreferenzen

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