Raspberry Pigilt für Raspberry Pi OS Trixie
Wie messe ich mit dem HC-SR04 Entfernungen am Raspberry Pi?
Der Ultraschallsensor HC-SR04 soll am Raspberry Pi den Abstand zu einem Hindernis messen, etwa für einen Füllstand, eine Einparkhilfe oder einen Roboter. Der Sensor läuft mit 5 Volt, die GPIO-Pins des Pi vertragen nur 3,3 Volt. Wie schließe ich ihn sicher an, und wie komme ich in Python an den Messwert?
Lösung
Kurz: VCC an 5 V, GND an Masse, Trig direkt an GPIO 23. Den Echo-Pin nur über einen Spannungsteiler an GPIO 24 legen: 1 kΩ zwischen Echo und GPIO, 2 kΩ zwischen GPIO und Masse. In Python liefert gpiozero.DistanceSensor den Abstand in Metern.
Welche Pins verbinde ich?
| HC-SR04 | Raspberry Pi | Hinweis |
|---|---|---|
| VCC | Pin 2 (5 V) | Sensor braucht 5 V |
| Trig | Pin 16 (GPIO 23) | direkt, 3,3 V vom Pi reichen zum Auslösen |
| Echo | Pin 18 (GPIO 24) | nur über den Spannungsteiler |
| GND | Pin 6 (GND) | gemeinsame Masse |
Wie baue ich den Spannungsteiler?
Die Reihenfolge ist entscheidend: Echo, dann 1 kΩ, dann der Knotenpunkt, dann 2 kΩ zur Masse. Vom Knotenpunkt führt ein Draht zu GPIO 24. Dort liegen dann 5 V × 2 kΩ ÷ 3 kΩ = 3,33 V an, was der Pin verträgt. Vertauscht man die Widerstände, kommen nur rund 1,7 V an, und der Pi erkennt das Echo nicht zuverlässig. Es zählt das Verhältnis 1 zu 2: Wer keinen 2-kΩ-Widerstand hat, nimmt zwei 1-kΩ-Widerstände in Reihe.
Wie lese ich den Abstand in Python aus?
gpiozero ist in Raspberry Pi OS vorinstalliert, auf dem Desktop-Image genauso wie auf Lite. Fehlt es auf einem anderen System, holt es dieser Befehl nach:
sudo apt install python3-gpiozero
Dann das Skript als entfernung.py speichern:
from gpiozero import DistanceSensor
from time import sleep
sensor = DistanceSensor(echo=24, trigger=23, max_distance=4)
while True:
print(f"{sensor.distance * 100:.1f} cm")
sleep(0.5)
Starten mit python3 entfernung.py, beenden mit Strg + C. Wichtig ist
max_distance=4: Ohne diese Angabe begrenzt gpiozero den Messbereich auf einen Meter, und alles
darüber erscheint als 100 cm.
Nachträge
Warum springen die Messwerte um ein paar Zentimeter?
Linux ist kein Echtzeitsystem. Python misst die Laufzeit des Echos, und wenn der Pi in diesem Moment etwas
anderes erledigt, verschiebt sich der Wert. gpiozero sammelt deshalb neun Messungen und gibt deren Median
aus, die Anzahl lässt sich mit queue_len ändern. Den Rest erledigen harte, glatte Flächen:
Stoff, Schaumstoff und schräge Wände schlucken oder lenken den Schall ab.
Funktioniert das auch am Raspberry Pi 5?
Ja, mit gpiozero. Die ursprüngliche Bibliothek RPi.GPIO unterstützt den Pi 5 nicht, weil der
GPIO-Baustein dort ein anderer ist. gpiozero nutzt unter Raspberry Pi OS zuerst lgpio und
funktioniert damit auf allen Modellen gleich. Älterer Code für RPi.GPIO läuft oft mit dem
Ersatzpaket rpi-lgpio weiter.
Wie weit und wie genau misst der HC-SR04?
Laut Datenblatt von 2 cm bis 4 m, mit einem Messwinkel von etwa 15 Grad. gpiozero rechnet mit 343 m/s Schallgeschwindigkeit, das gilt bei 20 °C. Bei 0 °C sind es etwa 331 m/s, der Sensor misst dann rund 3,5 Prozent zu viel. Die Temperatur berücksichtigt gpiozero nicht.
Geht es ohne Spannungsteiler?
Mit dem klassischen HC-SR04 nicht, sein Echo-Pin gibt 5 V aus. Die Variante HC-SR04P ist 3,3-V-tolerant und braucht keinen Spannungsteiler: VCC an Pin 1 (3,3 V), Echo direkt an den GPIO. Weil Händler ähnliche Module unter ähnlichen Namen verkaufen, lohnt ein Blick auf den Aufdruck. Im Zweifel verdrahtet man wie beim klassischen Modul: 5 V und Spannungsteiler.