Raspberry Pi Pico: Abstandsmessung mit Ultraschallsensor HC-SR04

Ein Ultraschallsensor ist ein Abstands- und Entfernungsmesser auf Basis von Ultraschall. Ultraschallsensoren sind oft in den Stoßstangen von Autos eingebaut, um die nahende Gefahr eines Zusammenstoßes mit anderen Fahrzeugen oder Objekten per Piepton anzuzeigen.

Die Idee ist jetzt, den Ultraschallsensor vom Typ HC-SR04 (3,3/5,0V) mit dem Raspberry Pi Pico zu verbinden und einfach mal auszuprobieren. Im zweiten Schritt wollen wir mit dem Aufbau ein wenig experimentieren.

Die Logik der Abstandsmessung muss im Programmcode realisiert werden. Dazu muss gemessen werden, wie viel Zeit zwischen dem Senden und Empfangen der Schallwellen vergangen ist. Danach kann der Abstand zwischen dem Sensor und dem Objekt berechnet werden.

Die Formel sieht wie folgt aus:

Formel zur Berechnung der Schallgeschwindigkeit

Aufbau und Bauteile

Raspberry Pi Pico: Abstandsmessung mit Ultraschallsensor (HC-SR04)

Raspberry Pi Pico HC-SR04
Pin 36 3V3 OUT VCC
Pin 38 GND GND
Pin 22 GPIO 17 Echo
Pin 21 GPIO 16 Trigger

Es gibt sehr viele unterschiedliche HC-SR04-Typen mit ähnlichen Typenbezeichnungen, aber unterschiedlichen elektrischen Parametern.
Normalerweise wird man einen Sensor vom Typ HC-SR04 verwenden. Der ist in der Regel nur TTL-kompatibel und somit nur an Arduinos ohne zusätzliche Schaltungsmaßnahmen einsetzbar.
Für den Einsatz mit Raspberry Pi und Raspberry Pi Pico, die mit +3,3-Volt-Signalen arbeiten, eignet sich der Sensor vom Typ HC-SR04P (mit P) besser. Es gibt aber auch einen HC-SR04-Typ, der wahlweise für 3,3 Volt und 5 Volt geeignet ist.

Programmcode für MicroPython

Im Programmcode wird ein GPIO-Ausgang für das Trigger-Signal zum Sensor und ein GPIO-Eingang für das Echo-Signal vom Sensor initialisiert. Anschließend wird in einer Endlos-Schleife die Signallaufzeit gemessen. Innerhalb der Schleife wird aus der Startzeit und Endzeit die Differenz berechnet und mit der Schallgeschwindigkeit multipliziert. Am Ende der Schleife wird der Abstand ausgegeben.

# Bibliotheken laden
from machine import Pin
from utime import sleep, sleep_us, ticks_us

# Initialisierung GPIO-Ausgang für Trigger-Signal
trigger = Pin(16, Pin.OUT)

# Initialisierung GPIO-Eingang für Echo-Signal
echo = Pin(17, Pin.IN)

# Wiederholung (Endlos-Schleife)
while True:
    # Abstand messen
    trigger.low()
    sleep_us(2)
    trigger.high()
    sleep_us(5)
    trigger.low()
    # Zeitmessungen
    while echo.value() == 0:
       signaloff = ticks_us()
    while echo.value() == 1:         
       signalon = ticks_us()
    # Vergangene Zeit ermitteln
    timepassed = signalon - signaloff
    # Abstand/Entfernung ermitteln
    # Entfernung über die Schallgeschwindigkeit (34320 cm/s bei 20 °C) berechnen
    # Durch 2 teilen, wegen Hin- und Rückweg
    abstand = timepassed * 0.03432 / 2
    # Ergebnis ausgeben
    print('    Off:', signaloff)
    print('     On:', signalon)
    print('   Zeit:', timepassed)
    print('Abstand:', str("%.2f" % abstand), 'cm')
    print()
    # 3 Sekunde warten
    sleep(3)

Troubleshooting

Das Programm sollte alle paar Sekunden eine Abstandsmessung durchführen und den Abstand anzeigen. Wenn keine Textausgabe stattfindet, dann stimmt irgendetwas nicht.

Keine Textausgabe

Wenn nach der Programmausführung keine Textausgabe erfolgt, dann solltest Du als erstes die Verkabelung prüfen. Es reicht nicht aus, dass die Verbindungen richtig geschaltet sind, sondern die elektrische Verbindung zwischen Sensor und Kabel muss auch noch gut sein.
Steckverbindungen können zu schlechten elektrischen Verbindungen oder Wackelkontakten führen.
Sollte nach mehrmaligem Prüfen hier kein Fehler festzustellen sein, dann könnte auch der Sensor defekt sein.

Der Abstand wird falsch angezeigt

Wenn aufgrund von Verkabelungsproblemen falsche Signallaufzeiten gemessen werden, dann kann der angezeigte Abstand natürlich nicht stimmen.

Fehlermeldung: NameError: local variable referenced before assignment

In der Kommandozeile/Shell erscheint die Fehlermeldung „NameError: local variable referenced before assignment“. Im ersten Moment deutet das auf einen Fehler im Programmcode hin. In diesem Fall aber nicht. Es kann sich auch um einen Verkabelungsfehler handeln, der dazu führt, dass der Programmcode nicht richtig funktionieren kann.

Tipp: Bibliothek/Treiber für HCSR04/HCSR04P

Die Komplexität der Abstandsmessung mit dem Ultraschallsensor HCSR04 lässt sich reduzieren, wenn Du einen fertigen Treiber verwendest, dessen Programmcode sich bei Github herunterladen und auf dem Pico mit dem Namen „hcsr04.py“ speichern lässt.

Die Einbindung in den eigenen Programmcode ist in nur 4 Zeilen ganz einfach gelöst.

# Bibliotheken laden
from hcsr04 import HCSR04

# Sensor initialisieren
sensor = HCSR04(trigger_pin=16, echo_pin=17)

# Abstandsmessung
distance = sensor.distance_cm()

# Ausgabe des Ergebnisses
print('Abstand:', distance, 'cm')

Programmcode für MMBasic

DO
  abstand = DISTANCE(GP16, GP17)
  PRINT "Abstand: " FORMAT$(abstand, "%.2f") " cm"
  PAUSE 5000
LOOP

Tipp: Temperaturabhängigkeit beachten

Leider ist die Schallgeschwindigkeit temperaturabhängig. Wenn man die Zeit mit einer festen Schallgeschwindigkeit umrechnet, dann gilt der errechnete Abstand nur bei einer bestimmten Temperatur. Wenn die tatsächliche Temperatur von dieser Temperatur abweicht, dann stimmt der berechnete Abstand nicht.
Ob die Abweichung in einem konkreten Anwendungsfall ein Problem darstellt, hängt davon ab, wie viel die aktuelle Temperatur von 20°C abweicht und ob die Abweichung akzeptabel ist.
Eventuell muss bei der Berechnung mit der Schallgeschwindigkeit die Temperatur berücksichtigt werden.

Weitere Ideen

  • Stadiometer: Größe einer Person messen
  • Anwesenheitserkennung
  • Abstandswarner in Fahrzeugen

Darf es etwas mehr sein?

Damit die Abstandsmessung auch ohne Text-Ausgabe auf einem Host-Computer autark erfolgen kann, verwenden wir ein Ultraschallsensor-Modul, um den Abstand vor dem Sensor zu messen auf auf einem LCD-1602-Display anzuzeigen.

Weitere verwandte Themen:

Teilen:

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

Online-Workshop Mehr Informationen Elektronik-Set jetzt bestellen

Programmieren mit dem Raspberry Pi Pico
Online-Workshop

Programmieren mit dem Raspberry Pi Pico

Online-Workshop mit einer Einführung ins Physical Computing mit Leuchtdioden, Taster und Temperatursensor.

  • Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython ohne Vorkenntnisse
  • Optimaler Einstieg, um eigene Ideen zu verwirklichen und Steuerungen zu programmieren
  • Inklusive Elektronik-Set mit einem Raspberry Pi Pico, Zubehör und elektronischen Bauteilen

Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)

Zum PicoTalk Mehr Informationen Am Online-Workshop teilnehmen

Elektronik-Set Pico Edition
Elektronik-Set Pico Edition

Hardware-nahes Programmieren mit dem Raspberry Pi Pico

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 Mehr Informationen Elektronik-Set jetzt bestellen