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:
Aufbau und Bauteile
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:
- Raspberry Pi Pico: Abstandswarner mit Summer und Ultraschallsensor HC-SR04
- Raspberry Pi Pico: Bewegungserkennung mit PIR Motion Detector HC-SR501
- Raspberry Pi Pico: Temperatur mit dem integrierten Temperatursensor messen und anzeigen
- Raspberry Pi Pico: Relais-Board steuern (ohne ULN2003A)
- Raspberry Pi Pico: Lichtsteuerung für Lichteffekte mit LEDs programmieren
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: 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)