Raspberry Pi - IR-Gabellichtschranke (Geschwindigkeitssensor)

Dieses Tutorial zeigt Ihnen, wie Sie mit dem Raspberry Pi und einem kurzen Python-Skript die Impulse einer IR-Gabellichtschranke auslesen. Sie kennen dieses Bauteil vielleicht auch als Photo Interrupter oder Opto Interrupter. Es erkennt, wenn etwas durch seinen schmalen Spalt geht. Mit diesem einen Signal kann der Raspberry Pi Objekte zählen oder feststellen, wie schnell sich ein Rad oder eine Motorwelle dreht. Im Detail lernen wir:

Wir empfehlen:

Raspberry Pi and IR slotted optical speed sensor

Erforderliche Hardware

1×Raspberry Pi 5
1×IR Slotted Optical Speed Sensor
1×Verbindungskabel
1×(Optional) Breadboard
1×(Empfohlen) Schraubklemmenblock-Shield für Raspberry Pi
1×(Empfohlen) Raspberry Pi Prototyping-Grundplatte & Breadboard-Kit

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 das Modul von der Seite ansehen, erkennen Sie den Buchstaben U. Die beiden Arme des U liegen sich über einem 5,9 mm breiten Spalt gegenüber. Ein Arm enthält eine Infrarot-LED. Der andere Arm enthält einen NPN-Fototransistor. Die LED strahlt ständig durch den Spalt, und der Fototransistor achtet auf dieses Licht.

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

Dieser Sensor wird für Aufgaben wie diese verwendet:

  • Die Drehzahl (U/min) eines Motors mit Encoderscheibe messen
  • Einen einfachen Drehzahlmesser bauen
  • Objekte oder Impulse zählen
  • Eine Strecke messen, indem man zählt, wie oft sich ein Rad dreht
  • Drehzahl-Rückmeldung für die Räder eines Roboters liefern
  • Eine Endlage oder eine Referenzposition erkennen

Wie es funktioniert

IR slotted optical speed sensor how it works

Der OUT-Pin folgt dem Lichtstrahl:

  • Leerer Spalt: Das Infrarotlicht erreicht den Fototransistor, daher bleibt OUT auf HIGH.
  • Etwas Undurchsichtiges im Spalt (ein Stück Karton oder ein Zahn einer Encoderscheibe): Das Licht kommt nicht hindurch, daher fällt OUT auf LOW.

Auf der Platine befindet sich außerdem ein Schmitt-Trigger. Er macht aus dem Rohsignal eine saubere 0 oder 1 ohne Prellen an den Flanken. Deshalb braucht Ihr Python-Skript keinen Entprellcode.

Zwei Kleinigkeiten, die Sie beachten sollten:

  • Klarer Kunststoff oder Glas kann das IR-Licht durchlassen, daher sieht der Sensor es möglicherweise nicht. Verwenden Sie undurchsichtige Objekte.
  • Einige Module anderer Hersteller arbeiten umgekehrt. Wenn Ihr Modul „blockiert“ meldet, obwohl der Spalt leer ist, tauschen Sie im ersten Skript LOW und HIGH. Das RPM-Skript zählt eine Flanke pro Zahn, es liefert also in beiden Fällen die richtige Drehzahl.

IR-Gabellichtschranke Pinout

IR slotted optical speed sensor pinout

Das Modul hat drei Pins:

  • VCC: Dieser Pin muss mit der Versorgungsspannung (3,3V bis 5V) verbunden werden. Verwenden Sie am Raspberry Pi 3,3V.
  • GND: Dieser Pin muss mit Masse (0V) verbunden werden
  • OUT: Dieser Pin sendet das digitale Signal an einen GPIO-Eingangspin des Raspberry Pi

※ Notiz:

Die Anordnung der Pins auf einem Modul kann sich zwischen Herstellern und sogar zwischen Chargen unterscheiden. Es ist wichtig, bei der Arbeit mit dem Modul immer die aufgedruckten Beschriftungen zu verwenden. Schauen Sie genau hin!

Verdrahtungsdiagramm

Raspberry Pi IR slotted optical speed sensor wiring diagram

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

Um Ihren Verdrahtungsaufbau zu vereinfachen und zu organisieren, empfehlen wir die Verwendung eines Schraubklemmenblock-Shields für Raspberry Pi. Dieses Shield gewährleistet sicherere und besser verwaltbare Verbindungen, wie unten gezeigt:

Raspberry Pi Schraubklemmenblock-Shield
  • VCC-Pin des Sensors an 3,3V des Raspberry Pi (Pin 1)
  • GND-Pin des Sensors an GND des Raspberry Pi (Pin 6 oder ein anderer GND-Pin)
  • OUT-Pin des Sensors an GPIO17 des Raspberry Pi (Pin 11)

WARNING

Versorgen Sie diesen Sensor nicht über den 5V-Pin des Raspberry Pi. Der OUT-Pin geht bis zur VCC-Spannung hoch. Mit 5V an VCC würde OUT 5V auf GPIO17 geben, aber die GPIO-Pins des Raspberry Pi vertragen nur 3,3V. Wenn Sie den Sensor mit 3,3V versorgen, bleibt das OUT-Signal sicher.

Aufbau der Encoderscheibe für die Drehzahlmessung

Das zweite Skript braucht eine Encoderscheibe. Das ist eine runde Scheibe mit Schlitzen am Rand.

  • Befestigen Sie die Scheibe auf der Motorwelle oder am Rad.
  • Montieren Sie den Sensor mit seinen M3-Schraubenlöchern so, dass der Rand der Scheibe im Spalt läuft.
  • Prüfen Sie, dass die Zähne der Scheibe durch den Schlitz laufen, ohne die Arme des Sensors zu berühren.

Sie können die Scheibe von Hand drehen oder den Motor laufen lassen. Die Verdrahtung des Motors gehört nicht zu dieser Seite. Wie man einen Motor mit dem Raspberry Pi ansteuert, sehen Sie im Tutorial Raspberry Pi - DC Motor.

Wie man den Raspberry Pi programmiert, um Objekte mit der IR-Gabellichtschranke zu erkennen und zu zählen

Dieses erste Skript prüft GPIO17 in einer Schleife immer wieder. Es gibt nur dann eine Zeile aus, wenn sich der Zustand des Pins ändert. Jedes Mal, wenn der Spalt blockiert wird, steigt der Zähler um eins.

Schnelle Schritte

  • Stellen Sie sicher, dass auf Ihrem Pi Raspbian oder ein anderes mit dem Raspberry Pi kompatibles Betriebssystem installiert ist.
  • Stellen Sie sicher, dass Ihr Raspberry Pi mit demselben lokalen Netzwerk wie Ihr PC verbunden ist.
  • Stellen Sie sicher, dass Ihr Raspberry Pi mit dem Internet verbunden ist, falls Sie einige Bibliotheken installieren müssen.
  • Wenn Sie den Raspberry Pi zum ersten Mal verwenden, lesen Sie wie man den Raspberry Pi einrichtet
  • Verbinden Sie Ihren PC per SSH mit dem Raspberry Pi, entweder mit dem eingebauten SSH-Client unter Linux und macOS oder mit PuTTY unter Windows.
  • Stellen Sie sicher, dass die Bibliothek RPi.GPIO installiert ist. Falls sie fehlt, installieren Sie sie mit diesen Befehlen:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Verdrahten Sie den Sensor mit dem Raspberry Pi wie im obigen Schaltplan gezeigt.
  • Erstellen Sie eine Python-Skriptdatei OpticalSpeedSensor.py und fügen Sie den folgenden Code hinzu:
# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi 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/raspberry-pi/raspberry-pi-ir-slotted-optical-speed-sensor import RPi.GPIO as GPIO import time SENSOR_PIN = 17 # GPIO17 (pin 11) connected to the OUT pin of the speed sensor GPIO.setmode(GPIO.BCM) GPIO.setup(SENSOR_PIN, GPIO.IN) last_state = GPIO.input(SENSOR_PIN) object_count = 0 # how many times the slot was blocked try: while True: state = GPIO.input(SENSOR_PIN) if state != last_state: # the state has changed if state == GPIO.LOW: # LOW = something is in the slot object_count += 1 print("The slot is blocked - count: {}".format(object_count)) else: # HIGH = the slot is clear print("The slot is clear") last_state = state time.sleep(0.001) except KeyboardInterrupt: pass finally: GPIO.cleanup()
  • Speichern Sie die Datei und starten Sie das Skript mit diesem Befehl:
python3 OpticalSpeedSensor.py
  • Schieben Sie ein Stück Karton oder Ihren Finger in den Spalt und ziehen Sie ihn wieder heraus. Tun Sie das einige Male.
  • Prüfen Sie die Ergebnisse im Terminal.
PuTTY - Raspberry Pi
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

Das Terminal bleibt ruhig, solange sich nichts ändert. Eine neue Zeile erscheint nur in dem Moment, in dem der Spalt blockiert wird oder wieder frei ist. Das Skript beobachtet weiter, bis Sie die Tasten Ctrl + C im Terminal drücken. Danach räumt es den GPIO-Pin auf, bevor es beendet wird.

Wie man den Raspberry Pi programmiert, um die Motordrehzahl (U/min) mit der IR-Gabellichtschranke zu messen

Wenn sich eine Scheibe schnell dreht, kommen die Impulse sehr schnell. Eine einfache Schleife wie die oben könnte einige davon verpassen. Dieses Skript lässt RPi.GPIO den Pin deshalb mit GPIO.add_event_detect() im Hintergrund überwachen. Jede FALLING-Flanke (der Moment, in dem ein Zahn den Spalt blockiert) ruft eine kleine Funktion auf, die einen Zähler um eins erhöht. So ergibt jeder Zahn genau einen Zählschritt.

Einmal pro Sekunde liest das Skript den Zähler, setzt ihn auf null zurück und berechnet die Drehzahl:

  • Eine volle Umdrehung einer Scheibe mit 20 Schlitzen ergibt 20 Impulse.
  • Impulse in 1 Sekunde × 60 = Impulse in 1 Minute.
  • Impulse in 1 Minute ÷ 20 = Umdrehungen in 1 Minute, das sind die U/min (RPM).

Der Wert 20 steht in SLOTS_PER_TURN. Das ist die Schlitzzahl der üblichen Encoderscheibe, die mit TT-Getriebemotoren verkauft wird. Wenn Ihre Scheibe eine andere Anzahl von Schlitzen hat, ändern Sie diese Konstante.

Schnelle Schritte

  • Führen Sie dieselbe Vorbereitung wie im ersten Beispiel durch: Per SSH auf den Raspberry Pi gehen, RPi.GPIO installieren und dieselbe Verdrahtung behalten.
  • Setzen Sie die Encoderscheibe ein, wie oben im Aufbau der Encoderscheibe gezeigt.
  • Erstellen Sie eine Python-Skriptdatei OpticalSpeedSensorRPM.py und fügen Sie den folgenden Code hinzu:
# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi 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/raspberry-pi/raspberry-pi-ir-slotted-optical-speed-sensor import RPi.GPIO as GPIO import time SENSOR_PIN = 17 # GPIO17 (pin 11) connected to the OUT pin of the speed sensor SLOTS_PER_TURN = 20 # number of slots (holes) in the encoder disc pulse_count = 0 # runs every time a tooth of the disc blocks the slot def count_pulse(channel): global pulse_count pulse_count += 1 GPIO.setmode(GPIO.BCM) GPIO.setup(SENSOR_PIN, GPIO.IN) GPIO.add_event_detect(SENSOR_PIN, GPIO.FALLING, callback=count_pulse) try: while True: time.sleep(1) # count pulses for 1 second pulses = pulse_count # read and reset the counter pulse_count = 0 rpm = pulses * 60 / SLOTS_PER_TURN # pulses per second -> turns per minute print("Pulses: {} | Speed: {:.2f} RPM".format(pulses, rpm)) except KeyboardInterrupt: pass finally: GPIO.cleanup()
  • Speichern Sie die Datei und starten Sie das Skript mit diesem Befehl:
python3 OpticalSpeedSensorRPM.py
  • Drehen Sie die Scheibe von Hand oder schalten Sie den Motor ein.
  • Prüfen Sie die Ergebnisse im Terminal. Die folgenden Zeilen stammen von einem Motor, der sich mit etwa 300 U/min dreht:
PuTTY - Raspberry Pi
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

Anders als das erste Skript gibt dieses jede Sekunde eine Zeile aus (durch die Zeile mit time.sleep(1)), auch wenn sich die Scheibe nicht bewegt. In diesem Fall zeigt es 0 Impulse und 0.00 RPM. Die Messwerte kommen weiter, bis Sie die Tasten Ctrl + C im Terminal drücken. Danach räumt das Skript den GPIO-Pin auf und stoppt.

Zusätzliches Wissen

Gabellichtschranke vs. Hindernissensor vs. Rotary Encoder

Alle drei Bauteile senden Impulse oder EIN/AUS-Signale an den Raspberry Pi, daher kann man sie leicht verwechseln. Vergleichen wir, wofür jedes gedacht ist:

IR-Gabellichtschranke IR-Hindernissensor Rotary Encoder
Was er erfasst ein Objekt in einem 5,9 mm breiten Spalt ein Objekt vor ihm, einige Zentimeter entfernt wie weit und in welche Richtung ein Knopf gedreht wird
Wie er erfasst Lichtstrahl über den Spalt wird blockiert reflektiertes Infrarotlicht zwei zueinander versetzte Signale
Beste Verwendung U/min, Zählen, Raddrehungen, Referenzposition Hindernisse für Roboter erkennen Eingabeknopf für Benutzer
Erkennt die Richtung nein nein ja

Die gabelförmige Lichtschranke ist offensichtlich die richtige Wahl, wenn das bewegte Teil durch ihren Spalt passt und Sie die Drehzahl oder eine genaue Zählung brauchen. Wenn das Objekt außerhalb bleibt, verwenden Sie den Hindernissensor. Wenn eine Person einen Knopf dreht und die Richtung wichtig ist, verwenden Sie den Rotary Encoder.

Die Schlitzzahl der Encoderscheibe wählen

Vergleichen wir eine Scheibe mit wenigen Schlitzen und eine Scheibe mit vielen Schlitzen:

  • Mehr Schlitze ergeben mehr Impulse pro Umdrehung. Der U/min-Wert hat feinere Schritte und reagiert bei niedriger Drehzahl besser. Mit 20 Schlitzen und einem 1-Sekunden-Fenster ändert jeder zusätzliche Impuls das Ergebnis um 3 U/min (60 ÷ 20).
  • Weniger Schlitze ergeben weniger Impulse pro Sekunde. Das kann der Raspberry Pi bei einem sehr schnellen Motor leichter verfolgen, aber das Ergebnis springt in größeren Schritten.

Welche Scheibe Sie auch verwenden, tragen Sie ihre echte Schlitzzahl in SLOTS_PER_TURN ein. Sonst ist der U/min-Wert falsch.

Eine Strecke aus Raddrehungen messen

Wenn sich die Encoderscheibe zusammen mit einem Rad dreht, können Sie auch herausfinden, wie weit das Rad gerollt ist:

  • Radumfang = π × Raddurchmesser
  • Strecke = Anzahl der Umdrehungen × Radumfang
  • Anzahl der Umdrehungen = Impulse insgesamt ÷ SLOTS_PER_TURN

Ein Rad mit 65 mm Durchmesser rollt zum Beispiel in einer Umdrehung etwa 204 mm. Nach 10 Umdrehungen hat es sich also etwa 2 Meter bewegt.

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.

Verwandte Tutorials

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