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.
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.
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()
Guten Tag
Ich würde gerne deinen Code in meinem Projekt an der Fachhochschule Nordwestschweiz Windisch verwenden. Ist das möglich?
Freundliche Grüsse
Andrea Notaro
Hallo Andrea,
Du kannst den Code gerne verwenden wo immer Du willst.
Gruß
Joe
Hallo Joe 703,
ich hab eine Frage und zwar, Ich möchte eine LED dazuschalten sobald die Entfernung unter 100 mm ist. Wie wäre es zu realisieren, wäre für deine Hilfe dankbar!
Gruß Oleg