Good to Know Database

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?

Von 4 Min. Lesezeit

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?

Verdrahtung HC-SR04 mit dem Raspberry Pi (Pinnummern der 40-poligen Leiste)
HC-SR04Raspberry PiHinweis
VCCPin 2 (5 V)Sensor braucht 5 V
TrigPin 16 (GPIO 23)direkt, 3,3 V vom Pi reichen zum Auslösen
EchoPin 18 (GPIO 24)nur über den Spannungsteiler
GNDPin 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.

Quellen