Arduino Mega - IR-Gabellichtschranke (Geschwindigkeitssensor)
In diesem Tutorial lernen Sie, wie Sie mit dem Arduino Mega das Signal einer IR-Gabellichtschranke lesen und dieses Signal dann in eine Objektanzahl oder eine Motordrehzahl in U/min (RPM) umwandeln. Im Detail lernen wir:
- Wie die IR-Gabellichtschranke (auch Photo Interrupter oder Opto Interrupter genannt) funktioniert
- Wie man den Arduino Mega mit der IR-Gabellichtschranke verbindet
- Wie man den Arduino Mega programmiert, um Objekte zu erkennen und zu zählen, die durch den Schlitz laufen
- Wie man den Arduino Mega programmiert, um die Drehzahl (U/min) eines Motors mit einer Encoderscheibe und einem externen Interrupt zu messen
- Welche Pins des Arduino Mega für Interrupts verwendet werden können und warum das für die Geschwindigkeitsmessung wichtig ist
Wir empfehlen:
- Verwenden Sie einen Drehgeber, wenn Sie eine Knopfeingabe suchen oder die Drehrichtung kennen müssen.
- Verwenden Sie einen Infrarot-Hindernissensor, wenn Sie Objekte aus der Entfernung erkennen wollen und nicht in einem schmalen Schlitz.

Erforderliche Hardware
Oder Sie können die folgenden Kits kaufen:
| 1 | × | DIYables Sensor-Kit (18 Sensoren/Displays) |
Über die IR-Gabellichtschranke
Die IR-Gabellichtschranke ist ein kleines U-förmiges Modul. Ein Arm des "U" enthält eine Infrarot-LED. Der andere Arm enthält einen NPN-Fototransistor. Die beiden Teile stehen sich über einen 5.9 mm breiten Spalt gegenüber. Dieser Spalt ist der Schlitz.
Der Sensor gibt ein einfaches digitales Signal aus. Er sagt dem Arduino Mega nur eine Sache: Ist der Schlitz frei, oder ist etwas darin? Deshalb eignet er sich gut zum Zählen, zur Endlagen- und Positionserkennung und, mit einer geschlitzten Encoderscheibe, zur Geschwindigkeitsmessung.
| IR-Gabellichtschranke | |
|---|---|
| Sensortyp | Schlitz-Lichtschranke (IR-LED + NPN-Fototransistor) |
| Schlitzbreite | 5.9 mm |
| Betriebsspannung | 3.3V bis 5V DC |
| Ausgang | Digital (TTL), LOW bei Unterbrechung, HIGH bei freiem Schlitz |
| Signalaufbereitung | Eingebauter Schmitt-Trigger |
| Befestigung | M3-Schraubenlöcher an beiden Enden |
| Pins | 3 (VCC, GND, OUT) |
Häufige Anwendungen:
- Messung der Motordrehzahl (U/min) mit einer Encoderscheibe
- Bau eines einfachen Drehzahlmessers
- Zählen von Objekten oder Impulsen
- Messung der Strecke durch Zählen der Radumdrehungen
- Geschwindigkeitsrückmeldung für Roboterräder
- Endlagen- und Positionserkennung
Die Pinbelegung der IR-Gabellichtschranke

Das Modul hat drei Pins:
- VCC-Pin: muss mit VCC (5V am Arduino Mega) verbunden werden
- GND-Pin: muss mit GND (0V) verbunden werden
- OUT-Pin: digitaler Ausgang, sendet den Zustand des Schlitzes vom Sensor an den Arduino Mega
※ Notiz:
Die Anordnung der Pins kann sich von Hersteller zu Hersteller und sogar von Charge zu Charge unterscheiden. Orientieren Sie sich beim Verwenden des Moduls immer an den Beschriftungen auf dem Modul. Schauen Sie genau hin!
Wie die IR-Gabellichtschranke funktioniert

Die IR-LED sendet die ganze Zeit einen Strahl Infrarotlicht quer durch den Schlitz. Was dann passiert, hängt davon ab, was im Schlitz ist:
- Nichts im Schlitz: Das IR-Licht erreicht den Fototransistor, und der OUT-Pin ist HIGH.
- Ein undurchsichtiges Objekt im Schlitz (ein Stück Karton, ein Zahn einer Encoderscheibe): Das Licht wird blockiert, und der OUT-Pin ist LOW.
Im Modul ist ein Schmitt-Trigger eingebaut. Er bereinigt das Signal, sodass der OUT-Pin eine saubere und stabile 0 oder 1 ohne Jitter liefert. Deshalb ist im Code des Arduino Mega keine Software-Entprellung nötig.
Beachten Sie diese Punkte:
- Durchsichtige Objekte blockieren IR-Licht möglicherweise nicht gut. Verwenden Sie undurchsichtige Objekte.
- Einige Module anderer Hersteller haben die umgekehrte Logik. Wenn Ihr Sensor "blockiert" meldet, obwohl der Schlitz leer ist, tauschen Sie im ersten Code einfach LOW und HIGH. Der RPM-Code zählt eine Flanke pro Schlitz, daher funktioniert er in beiden Fällen.
Geschwindigkeit mit einer Encoderscheibe messen
Um die Geschwindigkeit zu messen, wird eine runde Encoderscheibe mit Schlitzen auf der Motorwelle oder am Rad befestigt. Der Rand der Scheibe dreht sich im Schlitz des Sensors. Jeder Zahn blockiert das Licht für einen kurzen Moment, und jedes Loch lässt es durch. So erzeugt der OUT-Pin einen Impuls pro Schlitz der Scheibe.
Die übliche Encoderscheibe für TT-Getriebemotoren hat 20 Schlitze. Das bedeutet:
- 1 volle Umdrehung = 20 Impulse
- Impulse in 1 Sekunde x 60 = Impulse pro Minute
- Impulse pro Minute / 20 = Umdrehungen pro Minute (U/min, RPM)
Schaltplan
Die Verdrahtung zwischen dem Arduino Mega und der IR-Gabellichtschranke sehen Sie im Bild unten.

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
| IR-Gabellichtschranke | Arduino Mega |
|---|---|
| VCC | 5V |
| GND | GND |
| OUT | Pin 2 |
Warum Pin 2 am Arduino Mega?
Der erste Code verwendet nur digitalRead(), daher würde jeder digitale Pin des Arduino Mega funktionieren. Der RPM-Code verwendet jedoch einen externen Interrupt, und nicht jeder Pin des Arduino Mega unterstützt das. Der Arduino Mega 2560 hat sechs Pins für externe Interrupts:
| Arduino Mega Pin | Andere Verwendung dieses Pins |
|---|---|
| 2 | Keine (frei) |
| 3 | Keine (frei) |
| 18 | TX1 (Serial1) |
| 19 | RX1 (Serial1) |
| 20 | SDA (I2C) |
| 21 | SCL (I2C) |
Pin 2 und Pin 3 sind die beste Wahl, weil sie sich keine Aufgabe mit Serial1 oder I2C teilen. Wenn Ihr Projekt auch ein I2C-LCD oder ein Serial1-Gerät verwendet, meiden Sie die Pins 18 bis 21. Wir verwenden in beiden Codebeispielen Pin 2, sodass Sie den Sensor einmal verdrahten und beide Programme ausführen können.
※ Notiz:
Der Arduino Mega arbeitet mit 5V-Logik. Versorgen Sie den Sensor über den 5V-Pin des Arduino Mega. Der OUT-Pin schwingt dann zwischen 0V und 5V, genau das, was die Eingangspins des Mega erwarten. Ein Pegelwandler ist nicht nötig.
Wie man den Arduino Mega für die IR-Gabellichtschranke programmiert
Es wird keine Bibliothek benötigt. Der Code verwendet nur eingebaute Arduino-Funktionen.
Den Zustand des Schlitzes lesen
- Der erste Schritt ist, den Pin des Arduino Mega anzugeben, der mit dem OUT-Pin des Sensors verbunden ist:
- Der nächste Schritt ist, den Pin in der Funktion setup() als digitalen Eingang festzulegen:
- Danach wird der Zustand des Schlitzes mit digitalRead() gelesen. LOW bedeutet, dass etwas im Schlitz ist, und HIGH bedeutet, dass der Schlitz frei ist:
- Damit jedes Objekt nur einmal gezählt wird, wird der neue Zustand mit dem vorherigen Zustand verglichen. Ein Wechsel von HIGH auf LOW bedeutet, dass ein neues Objekt in den Schlitz gekommen ist.
Impulse mit einem Interrupt zählen
- Eine Zählervariable wird als volatile deklariert, weil sie in der Interrupt-Funktion geändert wird:
- Eine kurze Funktion wird geschrieben, die bei jedem Impuls läuft. Sie addiert nur eins zum Zähler:
- Die Funktion wird in der Funktion setup() an Pin 2 angehängt. FALLING bedeutet, dass die Funktion jedes Mal läuft, wenn der OUT-Pin von HIGH auf LOW wechselt, also jedes Mal, wenn ein Zahn der Scheibe den Schlitz blockiert:
- Einmal pro Sekunde wird der Zähler gelesen und zurückgesetzt. Der Arduino Mega ist ein 8-Bit-Board und liest daher eine 32-Bit-Variable in mehreren Schritten. Wenn man die Interrupts kurz ausschaltet, kann sich der Wert nicht mitten im Lesen ändern:
- Zum Schluss wird die Drehzahl (RPM) aus den in einer Sekunde gezählten Impulsen berechnet:
Arduino Mega Code zum Erkennen von Objekten im Schlitz
Dieser Code prüft den OUT-Pin in loop() immer wieder. Er gibt nur dann eine Meldung aus, wenn sich der Zustand ändert, und er zählt jedes Mal, wenn der Schlitz blockiert wird.
Schnelle Schritte
- Wenn Sie den Arduino Mega zum ersten Mal verwenden, lesen Sie wie man die Umgebung für den Arduino Mega in der Arduino IDE einrichtet.
- Verdrahten Sie die Bauteile wie im Diagramm gezeigt.
- Verbinden Sie das Arduino-Mega-Board über ein USB-Kabel mit Ihrem Computer.
- Öffnen Sie die Arduino IDE auf Ihrem Computer.
- Wählen Sie das Board Arduino Mega or Mega 2560 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 auf den Arduino Mega hochzuladen.
- Öffnen Sie den Serial Monitor und stellen Sie die Baudrate auf 9600 ein.
- Führen Sie ein Stück Karton oder Ihren Finger einige Male durch den Schlitz.
- Prüfen Sie das Ergebnis im Serial Monitor.
Wenn die Meldungen falsch herum sind ("blockiert", obwohl der Schlitz leer ist), verwendet Ihr Modul die umgekehrte Logik. Tauschen Sie LOW und HIGH im Code.
Arduino Mega Code zum Messen der Motordrehzahl (U/min)
Impulse einer drehenden Scheibe sind schnell. Wenn der Code den Pin nur in loop() prüft, kann er einige verpassen, zum Beispiel während er mit der Ausgabe im Serial Monitor beschäftigt ist. Ein Interrupt löst dieses Problem. Der Arduino Mega unterbricht, was er gerade tut, addiert eins zum Zähler und kehrt zurück, daher geht kein Impuls verloren.
Dieser Code zählt die Impulse am Interrupt-Pin 2. Jede Sekunde berechnet er die Drehzahl (RPM) und gibt beide Werte aus. SLOTS_PER_TURN ist auf 20 gesetzt. Ändern Sie den Wert passend zur Anzahl der Schlitze Ihrer Scheibe.
Schnelle Schritte
- Behalten Sie dieselbe Verdrahtung wie im ersten Beispiel. Der OUT-Pin muss an Pin 2 bleiben (oder an einem anderen Interrupt-Pin: 3, 18, 19, 20 oder 21; wenn Sie ihn verschieben, ändern Sie SENSOR_PIN im Code).
- Befestigen Sie die Encoderscheibe auf der Motorwelle oder am Rad. Achten Sie darauf, dass die Zähne durch den Schlitz laufen, ohne den Sensor zu berühren.
- Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein.
- Klicken Sie auf die Schaltfläche Upload, um den Code auf den Arduino Mega hochzuladen.
- Öffnen Sie den Serial Monitor mit 9600 Baud.
- Drehen Sie die Scheibe von Hand oder schalten Sie den Motor ein. Wie man den Motor mit dem Arduino Mega ansteuert, sehen Sie im Tutorial Arduino Mega - Gleichstrommotor.
- Prüfen Sie das Ergebnis im Serial Monitor.
In der Ausgabe oben dreht sich der Motor mit etwa 300 U/min. Zum Beispiel ergeben 100 Impulse in einer Sekunde 100 x 60 / 20 = 300 U/min. Die erste und die letzte Zeile zeigen 0 U/min, weil sich die Scheibe nicht dreht.
※ Notiz:
- Deklarieren Sie jede Variable, die in der Interrupt-Funktion geändert wird, als volatile.
- Halten Sie die Interrupt-Funktion kurz. Rufen Sie darin nicht Serial.print() oder delay() auf.
- Verwenden Sie FALLING, damit jeder Zahn der Scheibe genau einen Zählschritt ergibt.
Zusätzliches Wissen
Gabellichtschranke vs. IR-Hindernissensor vs. Drehgeber
Diese drei Bauteile geben alle Impulse oder digitale Signale an den Arduino Mega, aber jedes ist für eine andere Aufgabe gemacht.
| IR-Gabellichtschranke | IR-Hindernissensor | Drehgeber | |
|---|---|---|---|
| Wie er erfasst | Ein Objekt unterbricht einen Lichtstrahl in einem Schlitz | IR-Licht wird von einem Objekt davor reflektiert | Drehen eines Knopfes oder einer Welle |
| Erfassungsbereich | Nur im 5.9 mm breiten Schlitz | Freier Raum vor dem Sensor | Kein Objekt, er erfasst die Drehung |
| Ausgang | 1 digitales Signal | 1 digitales Signal | 2 Signale (CLK, DT) + Taster |
| Drehrichtung | Nein | Nein | Ja |
| Am besten für | U/min, Zählen, Positionserkennung | Roboter, die Wänden ausweichen, Annäherungsalarme | Menüs, Lautstärkeregler, manuelle Eingabe |
Es ist offensichtlich, dass die Gabellichtschranke beim Zählen schneller Impulse genauer ist, weil das Objekt immer durch denselben kleinen, festen Spalt läuft. Wählen Sie den Hindernissensor, wenn das Objekt nicht durch einen Schlitz läuft, und wählen Sie den Drehgeber, wenn Sie auch die Richtung kennen müssen.
Die Anzahl der Schlitze pro Umdrehung wählen
Die Anzahl der Schlitze in der Scheibe bestimmt die Auflösung der Messung:
- Mehr Schlitze: mehr Impulse pro Umdrehung, daher können langsame Drehzahlen gleichmäßiger gemessen werden. Der Code liest in Schritten von 60 / SLOTS_PER_TURN U/min. Bei 20 Schlitzen ist jeder Schritt 3 U/min.
- Weniger Schlitze: weniger Impulse pro Sekunde, daher weniger Arbeit für den Arduino Mega bei sehr hohen Drehzahlen.
Eine Scheibe mit 20 Schlitzen ist ein guter Mittelweg für kleine Getriebemotoren. Wenn Sie eine andere Scheibe verwenden, zählen Sie ihre Schlitze und ändern Sie SLOTS_PER_TURN im Code.
Die Strecke aus Radumdrehungen messen
Wenn die Encoderscheibe an einem Roboterrad befestigt ist, geben dieselben Impulse auch die Strecke an, die das Rad gerollt ist:
- Umdrehungen = gesamte Impulse / SLOTS_PER_TURN
- Radumfang = π x Raddurchmesser
- Strecke = Umdrehungen x Radumfang
Zum Beispiel hat ein Rad mit 65 mm Durchmesser einen Umfang von etwa 204 mm. Nach 200 Impulsen mit einer Scheibe mit 20 Schlitzen hat das Rad 10 Umdrehungen gemacht, also ist es etwa 2.04 Meter gerollt.
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.