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