Mit dem HC-SR04 Ultraschallsensor kann man den Raspberry Pi kostengünstig und einfach zur Messung von Entfernungen einsetzen. Dabei ist die Messung überraschend genau. Nach Angebe der Anbieter können Entfernungen zwischen 2 cm und ca. 3 Metern mit einer Genauigkeit von 0,3cm gemessen werden und es sind bis zu 50 Messungen pro Sekunde möglich.

Eine Messung wird durch eine fallende Flanke am Triggereingang des HC-SR04 gestartet. Danach sendet der Sensor ein Ultraschallsignal aus und wartet auf dessen Reflektion. Für die Zeit zwischen aussenden des Signals und Empfang des Echos wird das Echo Pin des HC-SR04 auf High gesetzt. Aus der Laufzeit des Signals kann man mit dem Rasperry Pi dann die Entfernung zum Objekt berechnen. Dabei ist zu beachten, dass die Schallgeschwindigkeit temperaturabhängig ist. Mehr dazu und eine Tabelle mit der Schallgeschwindigkeit bei verschiedenen Temperaturen findest Du bei Wikipedia.

HC-SR04 Ultraschallsensor – Timing

Da der HC-SR04 mit TTL-Pegeln arbeitet muss zumindest für den ECHO-Pin eine Pegelwandlung vorgenommen werden, um den Raspberry Pi nicht zu beschädigen, da der GPIO Port nur mit max. 3.3V beschaltet werden darf. Die Pegelwandlung kann über einen einfachen Spannungsteiler mit zwei Widerständen realisiert werden.

Für die Anzeige der Entfernung wird in meinem Projekt ein 7-Segment-Display und ein LED-Strip mit 100 LEDs verwendet.

Schaltung mit Ultraschallsensor, 7-Segment Display und LED Strip

Auf meinem Youtube Kanal findest Du ein Einsteiger Tutorial – LED Strip Ansteuerung mit dem Raspberry Pi

Amazon Links

*Werbung! Wenn Du auf einen der Amazon Links klickst und anschließend ein beliebiges Produkt auf Amazon kaufst, unterstützt Du meine Seite mit einem kleinen Anteil. Dir entstehen dadurch KEINE Mehrkosten und Du zahlst den ganz normalen Preis. Danke!

HC-SR04 Ultraschall-Modul – 1 Stück – https://amzn.to/3e7upKH
HC-SR04 Ultraschall-Modul – 5 Stück – https://amzn.to/3dY2Cfo

Source Code

Hier der Source Code mit Polling des Signals: Abstandssensor.py

#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time

# Ultraschall Sensor Konfiguration
US_SENSOR_TRIGGER = 23
US_SENSOR_ECHO = 24

Messung_Max = 1               # in sekunden
Messung_Trigger = 0.00001     # in sekunden
Messung_Pause = 0.2           # in sekunden
Messung_Faktor = (343460 / 2) # Schallgeschwindigkeit durch 2 (hin und zurück) in mm/s
        # Schallgeschwindigkeit gem. https://de.wikipedia.org/wiki/Schallgeschwindigkeit
        # +20°C 343,46m/s
        #   0°C 331,50m/s
        # −20°C 319,09m/s
Abstand_Max = 4000        # Max value in mm
Abstand_Max_Error = Abstand_Max + 1

def US_SENSOR_GetDistance():
    # setze TRIGGER für min 0.01ms
    GPIO.output(US_SENSOR_TRIGGER, True)
    time.sleep(Messung_Trigger)
    GPIO.output(US_SENSOR_TRIGGER, False)
 
    # speichere Startzeit
    StartZeit = time.time()
    MaxZeit = StartZeit + Messung_Max
    # warte aus steigende Flanke von ECHO
    while StartZeit < MaxZeit and GPIO.input(US_SENSOR_ECHO) == 0:
        StartZeit = time.time()
    
    # speichere Stopzeit
    StopZeit = StartZeit
    # warte aus fallende Flanke von ECHO
    while StopZeit < MaxZeit and GPIO.input(US_SENSOR_ECHO) == 1:
        StopZeit = time.time()

    if StopZeit < MaxZeit:
        # berechne Zeitdifferenz zwischen Start und Ankunft im Sekunden
        Zeit = StopZeit - StartZeit
        # berechne Distanz
        Distanz = Zeit * Messung_Faktor
    else:
        # setze Fehlerwert
        Distanz = Abstand_Max_Error
        
    # Distanz als Ganzzahl zurückgeben
    return int(Distanz)
 
if __name__ == '__main__':
    # Ultraschall Sensor Initialisierung GPIO-Pins
    GPIO.setmode(GPIO.BCM)                    # GPIO Modus (BOARD / BCM)
    GPIO.setup(US_SENSOR_TRIGGER, GPIO.OUT)   # Trigger-Pin = Raspberry Pi Output
    GPIO.setup(US_SENSOR_ECHO, GPIO.IN)       # Echo-Pin = raspberry Pi Input

    try:
        while True:
            Abstand = US_SENSOR_GetDistance()
            
            if Abstand >= Abstand_Max:
                # Ausgabe Text
                print ("Kein Objekt gefunden")
            else:
                # Ausgabe Text
                print ("Gemessene Entfernung = %i mm" % Abstand)
            
            time.sleep(Messung_Pause)
 
    # Beim Abbruch durch STRG+C: GPIO Port freigeben
    except KeyboardInterrupt:
        print("Messung vom User gestoppt")
        GPIO.cleanup()

oder mit Verwendung einer Interrupt-Routine: Abstandssensor_Interrupt.py

#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time

# Ultraschall Sensor Konfiguration
US_SENSOR_TRIGGER = 23
US_SENSOR_ECHO = 24

Messung_Max = 0.1             # in sekunden
Messung_Trigger = 0.00001     # in sekunden
Messung_Pause = 0.2           # in sekunden
Messung_Faktor = (343460 / 2) # Schallgeschwindigkeit durch 2 (hin und zurück) in mm/s
        # Schallgeschwindigkeit gem. https://de.wikipedia.org/wiki/Schallgeschwindigkeit
        # +20°C 343,46m/s
        #   0°C 331,50m/s
        # −20°C 319,09m/s
Abstand_Max = 4000            # Max value in mm
Abstand_Max_Error = Abstand_Max + 1

def US_SENSOR_EchoInterrupt(US_SENSOR_ECHO):
    global StartZeit, StopZeit

    # Speichere Zeit
    Zeit = time.time()
    if GPIO.input(US_SENSOR_ECHO) == 1:
        # steigende Flanke
        StartZeit = Zeit
    else:
        # fallende Flanke
        StopZeit = Zeit
        
def US_SENSOR_GetDistance():
    global StartZeit, StopZeit
    
    # setze TRIGGER für min 0.01ms
    GPIO.output(US_SENSOR_TRIGGER, True)
    time.sleep(Messung_Trigger)
    GPIO.output(US_SENSOR_TRIGGER, False)

    # setzte Defaultwerte
    StartZeit = 0
    StopZeit = 0
    # warte Messzeit auf Interrupts
    time.sleep(Messung_Max)
        
    if StartZeit < StopZeit:
        # berechne Zeitdifferenz zwischen Start und Ankunft im Sekunden
        Zeit = StopZeit - StartZeit
        # berechne Distanz
        Distanz = Zeit * Messung_Faktor
    else:
        # setze Fehlerwert
        Distanz = Abstand_Max_Error

    # Distanz als Ganzzahl zurückgeben
    return int(Distanz)


if __name__ == '__main__':
    # Ultraschall Sensor Initialisierung GPIO-Pins
    GPIO.setmode(GPIO.BCM)                    # GPIO Modus (BOARD / BCM)
    GPIO.setup(US_SENSOR_TRIGGER, GPIO.OUT)   # Trigger-Pin = Raspberry Pi Output
    GPIO.setup(US_SENSOR_ECHO, GPIO.IN)       # Echo-Pin = raspberry Pi Input

    GPIO.add_event_detect(US_SENSOR_ECHO, GPIO.BOTH, callback = US_SENSOR_EchoInterrupt)
                      
    try:
        while True:
            Abstand = US_SENSOR_GetDistance()
            
            if Abstand >= Abstand_Max:
                # Ausgabe Text
                print ("Kein Objekt gefunden")
            else:
                # Ausgabe Text
                print ("Gemessene Entfernung = %i mm" % Abstand)
            
            time.sleep(Messung_Pause)
 
    # Beim Abbruch durch STRG+C: GPIO Port freigeben
    except KeyboardInterrupt:
        print("Messung vom User gestoppt")
        GPIO.cleanup()