Arduino Nano - IR-Gabellichtschranke (Geschwindigkeitssensor)
Dieses Tutorial zeigt Ihnen, wie Sie mit dem Arduino Nano die IR-Gabellichtschranke auslesen, ein kleines U-förmiges Bauteil, das dem Board meldet, wenn etwas durch seine Lücke geht. Im Detail lernen wir:
- Wie man den Arduino Nano auf einem Breadboard mit der IR-Gabellichtschranke verbindet
- Wie man den Arduino Nano programmiert, um jedes Objekt zu zählen, das durch den Schlitz geht
- Wie man den Arduino Nano programmiert, um die Drehzahl eines Motors in U/min (RPM) zu berechnen, mit einer Encoderscheibe und dem Interrupt-Pin D2
Wir empfehlen:
- Einen Drehgeber zu verwenden, wenn Sie einen von Hand gedrehten Knopf bauen oder wenn Ihr Projekt wissen muss, in welche Richtung sich etwas dreht.
- Einen Infrarot-Hindernissensor zu verwenden, wenn sich das gesuchte Objekt im freien Raum befindet und nicht durch eine kleine Lücke geht.

Erforderliche Hardware
Oder Sie können die folgenden Kits kaufen:
| 1 | × | DIYables Sensor-Kit (18 Sensoren/Displays) |
Über die IR-Gabellichtschranke
Dieses Bauteil hat viele Namen: Schlitzsensor, Photo Interrupter, Opto Interrupter oder U-förmiger IR-Sensor. Alle meinen dasselbe. Es ist eine Lichtschranke. Ein Licht scheint von einer Seite einer Lücke zur anderen Seite, und das Modul meldet, ob dieses Licht durchkommt.
Wie es ein Objekt erkennt

Sehen Sie sich die beiden Arme des "U" an. Der erste Arm enthält eine Infrarot-LED. Der zweite Arm enthält einen NPN-Fototransistor. Sie schauen sich über eine Lücke von 5.9 mm an.
Es gibt nur zwei Fälle:
- Die Lücke ist leer. Der Fototransistor sieht das Infrarotlicht, daher setzt das Modul OUT auf HIGH.
- Etwas Undurchsichtiges befindet sich in der Lücke, zum Beispiel ein Pappstreifen oder ein Zahn einer Encoderscheibe. Das Licht kann nicht durch, daher setzt das Modul OUT auf LOW.
Das Modul hat außerdem einen Schmitt-Trigger an Bord. Seine Aufgabe ist es, den rohen Lichtpegel in ein klares 0 oder 1 umzuwandeln. Weil die Flanken schon sauber sind, braucht Ihr Arduino-Nano-Sketch keinen Entprellcode.
Zwei Dinge sollten Sie beachten:
- Klarer Kunststoff oder Glas kann Infrarotlicht durchlassen. Testen Sie mit etwas, durch das Sie nicht hindurchsehen können.
- Einige Module anderer Marken arbeiten umgekehrt (LOW, wenn leer). Falls Ihres so ist, tauschen Sie LOW und HIGH im ersten Sketch. Der RPM-Sketch zählt eine Flanke pro Schlitz, daher liefert er bei beiden Arten das richtige Ergebnis.
Technische Daten
| 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 freier Lücke |
| Signalaufbereitung | Eingebauter Schmitt-Trigger |
| Montage | M3-Schraubenlöcher an beiden Enden |
| Pins | 3 (VCC, GND, OUT) |
Sie finden diesen Sensor in Projekten wie diesen: ein Drehzahlmesser für einen kleinen Motor, Raddrehzahl-Rückmeldung an einem Roboterauto, ein Zähler für Teile auf einem Band, ein Endanschlag, der einem beweglichen Teil meldet, dass es seine Grenze erreicht hat, und ein einfacher Kilometerzähler, der zählt, wie oft sich ein Rad gedreht hat.
Die Pinbelegung der IR-Gabellichtschranke

Nur drei Pins führen aus dem Modul heraus:
- VCC-Pin: muss mit dem 5V-Pin des Arduino Nano verbunden werden
- GND-Pin: muss mit GND (0V) verbunden werden
- OUT-Pin: die digitale Signalleitung; er muss mit einem Eingangspin des Arduino Nano verbunden werden (in diesem Tutorial D2)
※ Notiz:
Die Anordnung der Pins kann sich von Hersteller zu Hersteller unterscheiden, und die Reihenfolge kann sich sogar zwischen zwei Chargen desselben Produkts ändern. Orientieren Sie sich bei der Verwendung immer an den auf dem Modul aufgedruckten Beschriftungen. Schauen Sie genau hin!
Impulse in Geschwindigkeit umwandeln
Für sich allein sieht der Sensor nur "etwas" oder "nichts". Um die Geschwindigkeit zu messen, fügen wir eine Encoderscheibe hinzu. Das ist ein dünnes Rad mit Löchern am Rand. Es sitzt auf der Motorwelle, und sein Rand dreht sich durch die Lücke. Jeder Zahn unterbricht den Strahl einmal, daher gibt der OUT-Pin pro Zahn einen LOW-Impuls aus.
Die Scheibe, die bei den meisten TT-Getriebemotoren dabei ist, hat 20 Schlitze. 20 Impulse bedeuten also eine volle Umdrehung. Wenn der Arduino Nano die Impulse eine Sekunde lang zählt, lautet die Rechnung:
RPM = (Impulse in einer Sekunde x 60) / 20
Das "x 60" wandelt Sekunden in Minuten um. Das "/ 20" wandelt Impulse in Umdrehungen um.
Verdrahtungsdiagramm
Setzen Sie den Arduino Nano quer über die Mitte des Breadboards und führen Sie dann drei Jumper-Kabel vom Sensor: VCC an 5V, GND an GND und OUT an D2, wie das Bild unten zeigt.

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
Siehe Der beste Weg, den Arduino Nano und andere Komponenten mit Strom zu versorgen.
Der Nano ist ein 5V-Board, daher nehmen wir die Spannung von seinem 5V-Pin. Das OUT-Signal bewegt sich dann zwischen 0V und 5V, und das passt genau zu den Eingangspins des Nano. Sie brauchen keinen Pegelwandler und keinen zusätzlichen Widerstand.
Wie man den Arduino Nano für die IR-Gabellichtschranke programmiert
Sie müssen keine Bibliothek installieren. Beide Sketches verwenden nur Funktionen, die schon Teil des Arduino-Cores sind.
Teil 1: den Schlitz mit digitalRead() prüfen
- Der erste Schritt ist, den Pin des Arduino Nano festzulegen, der mit OUT verbunden ist:
- In setup() wird dieser Pin als Eingang gesetzt. Das Modul steuert die Leitung selbst, daher genügt ein einfaches INPUT:
- In loop() wird der Pin immer wieder gelesen. Ein LOW-Wert sagt uns, dass der Strahl unterbrochen ist:
- Der Sketch speichert den letzten Wert in lastState. Er gibt aus und zählt nur, wenn der neue Wert nicht mit dem alten übereinstimmt. So ergibt ein Objekt eine Zählung, auch wenn es lange in der Lücke bleibt.
Teil 2: schnelle Impulse mit einem Interrupt erfassen
Der Arduino Nano hat nur zwei Pins, die einen externen Interrupt auslösen können: D2 und D3. Deshalb geht der Sensor an D2. Jeder andere digitale Pin funktioniert für Teil 1, aber nicht für Teil 2.
- Der Impulszähler wird mit dem Schlüsselwort volatile deklariert. Das sagt dem Compiler, dass sich der Wert jederzeit ändern kann, außerhalb des normalen Ablaufs von loop():
- Die Interrupt-Routine hat eine kleine Aufgabe. Sie addiert 1 zum Zähler und kehrt zurück:
- In setup() wird die Routine mit D2 verknüpft. Die Option FALLING startet sie in dem Moment, in dem OUT von HIGH auf LOW fällt. Das ist der Moment, in dem ein Zahn in die Lücke eintritt, daher wird jeder Zahn einmal gezählt:
- Einmal pro Sekunde kopiert der Sketch den Zähler und setzt ihn auf null zurück. Der ATmega328P-Chip des Nano verarbeitet 8 Bit auf einmal, daher braucht das Kopieren einer 4-Byte-Zahl mehrere Schritte. noInterrupts() und interrupts() stellen sicher, dass ein neuer Impuls die Zahl nicht mitten im Kopieren ändern kann:
- Der letzte Schritt verwendet die Formel von oben:
Arduino-Nano-Code zum Zählen von Objekten im Schlitz
Der folgende Sketch fragt D2 in loop() ab. Jedes Mal, wenn ein neues Objekt den Strahl unterbricht, addiert er eins zur Zählung und gibt sie aus. Wenn die Lücke wieder leer ist, gibt er eine kurze Meldung aus.
Schnelle Schritte
- Wenn Sie den Arduino Nano zum ersten Mal verwenden, lesen Sie wie man die Umgebung für den Arduino Nano in der Arduino IDE einrichtet.
- Verdrahten Sie die Bauteile wie im Diagramm gezeigt.
- Verbinden Sie das Arduino-Nano-Board über ein USB-Kabel mit Ihrem Computer.
- Öffnen Sie die Arduino IDE auf Ihrem Computer.
- Wählen Sie das Board Arduino Nano und den verwendeten COM-Port aus. Wenn der Upload später fehlschlägt, versuchen Sie ATmega328P (Old Bootloader) im Menü Processor.
- Fügen Sie den obigen Code in einen neuen Sketch ein.
- Drücken Sie die Schaltfläche Upload und warten Sie auf die Meldung "Done uploading".
- Öffnen Sie den Serial Monitor und wählen Sie 9600 Baud.
- Schieben Sie ein Stück Pappe oder einen Finger in die Lücke und ziehen Sie ihn wieder heraus. Tun Sie das dreimal.
- Beobachten Sie die Meldungen im Serial Monitor.
Sehen Sie "blocked", während die Lücke leer ist? Dann hat Ihr Modul eine umgekehrte Logik. Tauschen Sie die LOW- und HIGH-Prüfungen im Code und laden Sie ihn erneut hoch.
Arduino-Nano-Code zum Messen der Motordrehzahl (RPM)
Ein Motor mit einer 20-Schlitz-Scheibe kann Hunderte von Impulsen pro Sekunde erzeugen. Beim Abfragen können einige davon verpasst werden, zum Beispiel während Serial.print() gerade Text sendet. Mit einem Interrupt unterbricht der Nano seine aktuelle Arbeit für sehr kurze Zeit, zählt den Impuls und macht dann weiter. Jeder Zahn wird gezählt.
Der Sketch gibt die Anzahl der Impulse und die Drehzahl (RPM) einmal pro Sekunde aus. Die Konstante SLOTS_PER_TURN ist 20. Wenn Ihre Scheibe eine andere Anzahl an Löchern hat, zählen Sie sie und tragen Sie diese Zahl in den Code ein.
Schnelle Schritte
- Ändern Sie die Verdrahtung des ersten Sketches nicht. OUT muss an D2 bleiben. D3 ist die einzige andere Möglichkeit am Nano; wenn Sie ihn verwenden, setzen Sie SENSOR_PIN auf 3.
- Montieren Sie die Encoderscheibe auf der Motorwelle oder dem Rad. Richten Sie sie so aus, dass die Zähne durch die Mitte der Lücke laufen und den Kunststoff nicht berühren.
- Fügen Sie den RPM-Code in die Arduino IDE ein und laden Sie ihn auf den Nano hoch.
- Öffnen Sie den Serial Monitor mit 9600 Baud.
- Drehen Sie die Scheibe mit der Hand oder schalten Sie den Motor ein. Das Tutorial Arduino Nano - DC Motor zeigt, wie man einen Motor mit dem Nano ansteuert.
- Lesen Sie die Drehzahl im Serial Monitor ab.
Hier dreht sich der Motor mit etwa 300 U/min (RPM). Nehmen Sie die Zeile mit 98 Impulsen: 98 x 60 = 5880 Impulse pro Minute, und 5880 / 20 = 294 RPM. Die 0-Zeilen oben und unten wurden ausgegeben, bevor der Motor gestartet wurde und nachdem er gestoppt hat.
Gute Gewohnheiten für Interrupt-Code am Nano:
- Markieren Sie jede Variable, die die Interrupt-Routine ändert, als volatile.
- Halten Sie die Routine winzig. Setzen Sie niemals delay() oder Serial.print() hinein.
- Bleiben Sie bei FALLING. CHANGE würde pro Zahn zweimal auslösen und Ihre Drehzahl verdoppeln.
Zusätzliches Wissen
Welchen Sensor sollten Sie wählen?
Eine Gabellichtschranke, ein IR-Hindernissensor und ein Drehgeber können alle Impulse an den Arduino Nano liefern. Dennoch löst jeder ein anderes Problem. Stellen Sie sich diese Fragen:
- Geht das Objekt durch eine kleine, feste Lücke (ein Scheibenzahn, eine Fahne an einem beweglichen Teil)? Wählen Sie die IR-Gabellichtschranke. Sie liefert pro Durchgang ein sauberes digitales Signal.
- Befindet sich das Objekt irgendwo vor dem Sensor, nicht in einer Lücke (eine Wand, eine Hand, eine Kiste auf einem Tisch)? Wählen Sie den IR-Hindernissensor. Er erkennt reflektiertes Licht im freien Raum.
- Dreht eine Person einen Knopf, und braucht der Code die Richtung (links oder rechts)? Wählen Sie den Drehgeber. Er hat zwei Ausgänge (CLK und DT) und einen Taster.
Es ist offensichtlich, dass die Gabellichtschranke die zuverlässigste Zählung für schnell drehende Teile liefert, da das Ziel immer dieselbe 5.9 mm große Lücke an derselben Stelle durchquert. Ihre einzige Grenze ist, dass sie die Drehrichtung nicht erkennen kann.
Zwei Räder, zwei Sensoren
Ein kleines Roboterauto hat oft zwei angetriebene Räder. Der Nano hat genau zwei Interrupt-Pins, daher kann ein Sensor an D2 und ein zweiter Sensor an D3 gehen. Jeder Sensor braucht dann seinen eigenen Zähler und seine eigene Interrupt-Routine. Denken Sie daran, bevor Sie den Rest des Roboters planen: Wenn D2 und D3 schon von anderen Bauteilen belegt sind, verlegen Sie diese Bauteile auf andere Pins, denn kein anderer Nano-Pin kann diese Aufgabe übernehmen.
Fehlerbehebung
| Problem | Was zu prüfen ist |
|---|---|
| Die Zählung ändert sich nie | Prüfen Sie, dass OUT an D2 und VCC an 5V geht. Lesen Sie die Pin-Beschriftungen Ihres Moduls, denn die Reihenfolge ist nicht bei jeder Charge gleich. |
| "Blocked" bei leerer Lücke | Ihr Modul verwendet umgekehrte Logik. Tauschen Sie LOW und HIGH im ersten Sketch. |
| RPM ist immer 0 | Die Scheibenzähne erreichen vielleicht die Lücke nicht. Verschieben Sie den Sensor so, dass die Zähne durch die Mitte des Schlitzes laufen. |
| RPM springt auf und ab | Stellen Sie sicher, dass die Scheibe fest auf der Welle sitzt und nicht wackelt oder den Sensor berührt. |
| RPM ist zu hoch oder zu niedrig | SLOTS_PER_TURN passt nicht zu Ihrer Scheibe. Zählen Sie die Löcher und korrigieren Sie die Konstante. |
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.