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:

  1. Im ersten Schritt prüfen wir, ob der Sensor die Annäherung eines Objekts erkennt und detektiert.
  2. 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: Objekterkennung mit TCRT5000

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.

Schnell und einfach alle Bauteile zusammen bestellen

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.

  1. 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.
  2. 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.
  3. Drehe das Potentiometer ganz nach rechts und wiederhole die Abstandserkennung mit Deiner Hand.
  4. Halte Deine Hand vor die Sensor-LEDs und drehe das Potentiometer nach links und nach rechts, bis Deine Hand erkannt wird.

Beobachtungen

  1. 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.
  2. Wenn man das Potentiometer ganz nach links dreht, wird der Sensor nicht funktionieren.
  3. Wenn man das Potentiometer ganz nach rechts dreht, wird der Sensor dauernd detektieren.
  4. 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:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

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

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

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.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren