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 (3,3V)
Pin 36 3V3 OUT VCC
Pin 38 GND GND
Pin 22 GPIO 17 Echo
Pin 21 GPIO 16 Trigger

Hinweis: Wenn man einen Sensor-Typ HC-SR04 (+5V-Typ) hat, dann darf der Echo-Ausgang nicht einfach so auf einen GPIO-Eingang des Raspberry Pi Pico geschaltet werden. Zwischen dem Echo-Ausgang des Sensors und dem GPIO-Eingang des Picos muss ein Spannungsteiler geschaltet sein.

Schnell und einfach alle Bauteile zusammen bestellen

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 time 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.

Programmcode für MicroPython mit picozero

„picozero“ ist eine Einsteiger-freundliche MicroPython-Bibliothek, um elektronische Bauteile, wie LEDs, Taster und Sensoren einfacher zu programmieren und zu steuern.

from picozero import DistanceSensor
from time import sleep
ds = DistanceSensor(echo=16, trigger=17)
while True:
    value = ds.distance * 100
    print('Entfernung:', value, 'cm')
    sleep(3)

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:

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