Raspberry Pi Pico: Objekterkennung mit TCRT5000
Mit dem Infrarot-LED-Sensor TRCR5000 wollen wir eine einfache Abstandserkennung bzw. Objekterkennung bauen und damit experimentieren. Wobei nicht ein bestimmtes Objekt erkannt wird, sondern irgendein Objekt, zu dem sich der Abstand verringert. Der TCRT5000 dient also als Näherungssensor. Eine Anwendung könnte ein berührungsloser Schalter oder eine optische Bewegungserkennung sein.
Mit dem folgenden Programmcode wollen wir zwei Ding mit dem TCRT5000 tun:
- Im ersten Schritt prüfen wir, ob der Sensor die Annäherung eines Objekts erkennt und detektiert.
- Im zweiten Schritt kalibrieren wir den Sensor mit Hilfe des Potentiometers.
Es empfiehlt sich, wenn man noch keine Erfahrung mit einem TCRT5000 hat, ein paar Grundlagen anzulesen. In der praktischen Anwendungen können diese Sensoren sehr widerspenstig sein.
Aufbau und Bauteile
Raspberry Pi Pico | TCRT5000 | |
---|---|---|
Pin 36 | 3V3 OUT | VCC |
Pin 33 | GND | GND |
Pin 29 | GPIO 22 | DOUT |
Pin 31 | GPIO 26 (ADC0) | AOUT |
Hinweis: Um die folgenden Programmcodes sinnvoll zur Objekterkennung nutzen zu können, muss der Sensor kalibriert werden. Die Vorgehensweise bei der Kalibrierung wird weiter unten beschrieben.
Programmcode zur Auswertung des digitalen Ausgangs
Der digitale Ausgang des TCRT5000, der mit einem digitalen GPIO-Eingang des Picos verbunden ist, wird in einer Endlos-Schleife nach „0“ ausgewertet. In diesem Fall hat der Sensor ein Objekt erkannt und die Onboard-LED leuchtet auf. Man könnte den Sensor natürlich auch nach „1“ auswerten und damit das Entfernen eines Objekts erkennen.
Die Werte „0“ und „1“ werden kontinuierlich auf der Kommandozeile ausgeben.
# Bibliotheken laden from machine import Pin from time import sleep # Initialisierung: Onboard-LED led_onboard = Pin(25, Pin.OUT, value=0) # Initialisierung: GPIO22 als Eingang sensor_d = Pin(22, Pin.IN) # Wiederholung (Endlos-Schleife) while True: value_d = sensor_d.value() print(value_d) if value_d == 0: led_onboard.on() else: led_onboard.off() sleep(0.2)
Im folgenden Programmcode wird statt der Endlosschleife ein Interrupt gesetzt und eine Funktion zur Behandlung eines Ereignisses verwendet. Diese Lösung macht die Auswertung des TCRT5000 vom weiteren Hauptprogramm unabhängig.
# Bibliotheken laden from machine import Pin # Initialisierung der Onboard-LED led_onboard = Pin(25, Pin.OUT, value=0) # Initialisierung von GPIO22 als Eingang sensor_d = Pin(22, Pin.IN) # Funktion: Interrupt-Behandlung def sensor_irq(pin): value_d = not led_onboard.value() led_onboard.value(value_d) print(value_d) # Interrupt-Steuerung sensor_d.irq(trigger=Pin.IRQ_FALLING|Pin.IRQ_RISING, handler=sensor_irq)
Hinweis: So charmant, wie die Interrupt-Lösung scheint, ist sie nicht. Die gute Dame prellt ziemlich heftig, was man mit folgendem Programmcode beobachten kann.
# Bibliotheken laden from machine import Pin # Initialisierung: GPIO22 als Eingang sensor_d = Pin(22, Pin.IN, Pin.PULL_UP) # Zähler count = 0 # Funktion: Interrupt-Behandlung def sensor_irq(pin): global count count += 1 print(count) # Interrupt-Steuerung sensor_d.irq(trigger=Pin.IRQ_RISING, handler=sensor_irq)
Der TCRT5000 wir hier als Zähler verwendet. Bei jeder Objekterkennung zählt der Zähler allerdings sprunghaft hoch, was falsch ist. Gibt es eine Lösung dafür? Ja, indem man die Schleife bei einer Erkennung kurz pausiert.
Programmcode zur Auswertung des digitalen und analogen Ausgangs
Der folgende Programmcode enthält eine Endlos-Schleife, die kontinuierlich den analogen und digitalen Eingang des TCRT5000 auswertet und auf der Kommandozeile ausgibt.
Eine „0“ bedeutet, dass ein Objekt erkannt wurde. Eine „1“ bedeutet, keine Erkennung.
Der analoge Wert ändert sich nur geringfügig. Erst wenn ein Objekt erkannt wurde, ändert sich der Wertebereich erheblich.
# Bibliotheken laden from machine import Pin, ADC from time import sleep # Initialisierung des ADC0 (GPIO26) sensor_a = ADC(0) # Initialisierung von GPIO22 als Eingang sensor_d = Pin(22, Pin.IN) # Wiederholung (Endlos-Schleife) while True: value_a = sensor_a.read_u16() print('ADC:', value_a) value_d = sensor_d.value() print('DIO:', value_d) print() sleep(0.5)
Kalibrierung und Experimente
Der Erkennungsbereich beträgt nur ein paar Zentimeter (cm). Wenn der Abstand zwischen den Sensor-LEDs und dem Objekt zu groß ist, dann funktioniert die Erkennung nicht mehr so gut.
Prinzipiell kann man die Erkennungs-LED auf dem Sensor-Board betrachten. Allerdings kann es zwischen dieser LED und der Software-seitigen Auswertung Unterschiede geben.
- Halte Deine Hand vor die Sensor-LEDs. Erhöhe und verringere den Abstand zu den Sensor-LEDs und versuche herauszufinden, wie groß der Abstand sein muss, dass Deine Hand erkannt wird. Merke Dir ungefähr den Abstand.
- Nehme einen kleinen Schraubendreher und drehe das Potentiometer auf der Sensor-Platine ganz nach links. Halte Deine Hand wieder vor die Sensor-LEDs und erhöhe und verringere den Abstand zu den Sensor-LEDs.
- Drehe das Potentiometer ganz nach rechts und wiederhole die Abstandserkennung mit Deiner Hand.
- Halte Deine Hand vor die Sensor-LEDs und drehe das Potentiometer nach links und nach rechts, bis Deine Hand erkannt wird.
Beobachtungen
- Wird Deine Hand erkannt, leuchtet die Erkennungs-LED auf. Nimmst Du sie weg, dann geht die LED aus. Die Abstandserkennung ist abhängig davon, wie das Potentiometer eingestellt ist. Es kann sein, dass die Erkennungs-LED dauernd oder nie leuchtet.
- Wenn man das Potentiometer ganz nach links dreht, wird der Sensor nicht funktionieren.
- Wenn man das Potentiometer ganz nach rechts dreht, wird der Sensor dauernd detektieren.
- Der Erkennungsbereich, der einstellbar ist, ist nicht besonders groß. Dreht man das Potentiometer nach links, verringert sich der Erkennungsbereich. Nach rechts vergrößert sich der Erkennungsbereich.
Weitere verwandte Themen:
- Raspberry Pi Pico: Abstandsmessung mit TCRT5000
- Raspberry Pi Pico: Abstandsmessung mit Ultraschallsensor HC-SR04
- Raspberry Pi Pico: Bewegungserkennung mit PIR Motion Detector HC-SR501
- Raspberry Pi Pico: Farberkennung mit TCRT5000
- Raspberry Pi Pico: Line-Tracking mit einem TCRT5000 ohne Fahrzeug
- Raspberry Pi Pico: Erschütterung oder Vibration erkennen mit Vibration Sensor KY-002
Teilen:
Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython
Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.
- LED: Einschalten, ausschalten, blinken und Helligkeit steuern
- Taster: Entprellen und Zustände anzeigen
- LED mit Taster einschalten und ausschalten
- Ampel- und Lauflicht-Steuerung
- Elektronischer Würfel
- Eigene Steuerungen programmieren
Online-Workshop
Hardware-nahes Programmieren mit dem Raspberry Pi Pico
Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.
Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)
Elektronik-Set Pico Edition
Raspberry Pi Pico: Hardware-nahes Programmieren mit MicroPython
Leichter Einstieg mit All-in-one-Set zum sofort Loslegen, um eigene Steuerungen programmieren.
Elektronik-Set Pico WLAN Edition
Raspberry Pi Pico W: IoT und Smart Home mit WLAN und MQTT
Betreibe Deinen Raspberry Pi Pico W als drahtloser Sensor in Deinem WLAN, versende E-Mails mit Daten und kommuniziere per MQTT im Internet of Things oder Smart Home.
Elektronik-Set Sensor Edition
Erweiterung zu den Elektronik-Sets Pico Edition und Pico WLAN Edition
Elektronik-Set mit den beliebtesten Sensoren zum Messen von Temperatur, Helligkeit, Bewegung, Lautstärke und Entfernung.
Elektronik-Set Eingabe Ausgabe Edition
Erweiterung zu den Elektronik-Sets Pico Edition und Pico WLAN Edition
Damit kannst Du MP3-Dateien abspielen, eine Stoppuhr bauen, einen Servo-Motor mit Drehschalter oder Joystick steuern, Lichteffekte mit einem WS2812-LED-Lichtstreifen erzeugen, Schalten mit einem Relais und Signalisieren mit einem Vibrationsmotor.