Raspberry Pi

Raspberry Pi: Ultraschallsensor HC-SR04 ansteuern (Entfernung messen)

Raspberry Pi Ultraschallsensor

Das Messen von Entfernungen und Abständen ist bei Projekten rund um ein Raspberry Pi Car, einem Roboter oder gar einem Tür-System sinnvoll und von Vorteil. Mit Hilfe des Ultraschallsensors HC-SR04 und dem Raspberry Pi können Abstände mit wenig Aufwand gemessen. Wie man mit dem Raspberry Pi Entfernungen messen kann, unter Verwendung des Ultraschallsensors HC-SR04 wird im Folgenden erläutert. Neben dem Schaltungsaufbau ist nachzulesen, wie man mit Python den Ultraschallsensor HC-SR04 ansteuern kann.

Raspberry Pi: Ultraschallsensor HC-SR04

Funktionsweise

Der Ultraschallsensor HC-SR05 dient zum bestimmen von Abständen und Distanzen. Der Sensor verfügt über einen Sender und einen Empfänger. Dabei sendet der Sender ein Ultraschalsignal aus, dass sich durch den Raum beweget. Trifft dieses auf ein Hindernis, wird das Signal reflektiert und vom Empfänger wieder aufgenommen bzw. detektiert. Die Distanz zu dem Objekt an dem das Signal reflektiert wurde bestimmt sich anschließend aus der Zeitdifferenz zwischen Senden und Empfangen des Signals.

Ultraschallsensor Funktionsweise

Ultraschallsensor Funktionsweise

HC-SR04 Schaltungsaufbau

Der Ultraschallsensor HC-SR04 besteht aus einer Platine mit den Abmessungen von etwa 2 cm x 4,5 cm. Neben den elektronischen Bauteilen finden sich dort zwei Ultraschalleinheiten wieder – in der Funktionsweise beschrieben als Sender und Empfänger. Preislich ist der Sensor schon für kanpp 2 Euro zu haben. Weiterhin benötigen wir zwei Widerstände, sowie (optional, je nach Aufbauweise) Jumper Kabel und ein Breadboard

Ultraschallsensor HC-SR04 auf Amazon ansehen
2 Widerstände (330 Ohm, 470 Ohm)
Jumperkabel
Breadboard

Ultraschallsensor HC-SR04

Ultraschallsensor HC-SR04

  • Pin VCC (5 Volt)
  • Pin Trig
  • Pin Echo
  • Pin GND

Der Ultraschallsensor HC-SR04 verfügt über 4 Pins zu Ansteuerung und wird mit einer Spannung von 5 Volt versorgt. Dabei können direkt die 5 Volt des Raspberry Pi genutzt werden – Pin VCC des Sensors wird mit Pin 2 des Raspberry Pi (+5 Volt) und Pin GND des HC-SR04 mit Pin 6 (GND) des Raspberry Pi verbunden. Der Pin Trig (Trigger) dient zum Auslösen um ein Ultraschallsignal für die Entfernungsmessung auszusenden. Pin Trig verbinden wir mit GPIO Pin 23 (Pin 16). Alternativ kann auch ein anderer GPIO Pin der Wahl genutzt werden, wichtig ist dabei nur, dass dies dann in der Software zur Ansteuerung entsprechend auf den neuen GPIO Pin abgeändert wird. Weiterhin ist zu beachten, dass hier die Nummer der GPIO Pins verwendet wird und nicht die hardwaremäßige Durchnummerierung.

Über Pin Echo erhalten wir am Raspberry Pi einen High-Pegel zurück, sobald das ausgesandte und reflektierte Ultraschallsignal wieder empfangen wurde. An dieser Stelle ist ganz wichtig, dass ein Spannungsteiler verwendet wird. Der High-Pegel des HC-SR04 arbeitet mit einer Spannung von 5 Volt – der Raspberry Pi verträgt aber nur 3,3 Volt an den GPIO-Pins. Über einen Spannungsteiler mit 330 Ohm und 470 Ohm Widerständen kann der Pegel mit dem Pi kompatibel gemacht werden. Zeitgleich zieht der 470 Ohm Widerstand den Pin auf Masse wenn keine Spannung anliegt, sodass keine undefinierten Zustände auftreten (Pull-Down). Pin Echo des Ultraschallsensors HC-SR04 wird hier im Tutorial über den Spannungsteiler an GPIO Pin 24 (Pin 18) angeschlossen.

[table id=30 /]

Der gesamte Schaltungsaufbau zur Ansteuerung des Ultraschallsensors HC-SR04 kann im folgenden Bild betrachtet werden.

HC-SR04 Schaltungsaufbau

HC-SR04 Schaltungsaufbau

Abstandssensor: Entfernung messen mit Python

Zur Ansteuerung des Ultraschallsensors HC-SR04 und zum Entfernungen messen nutzen wir die Programmiersprache Python. Die Umsetzung des Vorhabens mit dem Sensor in anderen Programmiersprachen ist natürlich ebenfalls möglich. Auf Basis der bisherigen Erläuterungen zur Funktionsweise des Sensors lässt sich der Quellcode recht einfach ableiten: Zur Bestimmtung der Entfernung geben wir auf den Trigger Pin einen kurzen High-Pegel. Dadurch wird der Sensor “aktiv” und sendet ein Ultraschallsignal aus. Gleichzeitig merkt man sich den Zeitpunkt, wann man den Pin auf High setzt.

Detektiert der Empfänger das ausgesendete und reflektierte Unltraschallsignal wird der Sensor seinen Echo-Pin auf High setzen. Diesen Pegelwechsel warten wir im Quellcode ab und merken uns den Zeitpunkt des Eintreffens. Dadurch können wir die Zeitdauer ermitteln, die das Ultraschallsignal unterwegs war. Unter Kenntnis der Schallgeschwindigkeit und der Weg-Zeit-Beziehung lässt sich somit die Distanz zum Objekt errechnen.

Um den Quellcode zu testen legen wir zunächst eine neue Datei.

nano hc-sr04.py

In die Datei fügen wir folgenden Code ein. Dieser wird zyklisch die Entfernung messen, solange man den Code nicht abbricht (Strg+C).

#Bibliotheken
import RPi.GPIO as GPIO
import time
 
#GPIO definieren (Modus, Pins, Output)
GPIO.setmode(GPIO.BCM)
GPIO_TRIGGER = 23
GPIO_ECHO = 24
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
 
def entfernung():
    # Trig High setzen
    GPIO.output(GPIO_TRIGGER, True)
 
    # Trig Low setzen (nach 0.01ms)
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)
 
    Startzeit = time.time()
    Endzeit = time.time()
 
    # Start/Stop Zeit ermitteln
    while GPIO.input(GPIO_ECHO) == 0:
        Startzeit = time.time()
 
    while GPIO.input(GPIO_ECHO) == 1:
        Endzeit = time.time()
 
    # Vergangene Zeit
    Zeitdifferenz = Endzeit - Startzeit
	
    # Schallgeschwindigkeit (34300 cm/s) einbeziehen
    entfernung = (Zeitdifferenz * 34300) / 2
 
    return entfernung
 
if __name__ == '__main__':
    try:
        while True:
            distanz = entfernung()
            print ("Distanz = %.1f cm" % distanz)
            time.sleep(1)
 
        # Programm beenden
    except KeyboardInterrupt:
        print("Programm abgebrochen")
        GPIO.cleanup()

Hinterlasse eine Antwort

Kommentare

  • Hallo Tony,
    ich habe auf Github dein rpi-hc-sr04 Projekt gesehen,
    deshalb wollte ich dich fragen ob man in dem Quellcode noch den Variablen ECHO und TRIGGER
    die GPIO-Pin Nummern zuweisen muss.
    Danke schon mal!!!

    • Hallo :)

      Nein und Ja! Du benötigst grundlegend die Dateien rpi-hc-sr04.c und rpi-hc-sr04.h. Wenn du die Header Datei in dein Projekt includest kannst du die Funktion distance() nutzen. Dieser Funktion übergibst du einfach deine Pinnummern, beispielsweise distance(4,5) für WiringPi Pin 4 für TRIG und WiringPi Pin 5 für ECHO. Beachte hierbei die unterschiedlichen Pinbezeichnung zwichen WiringPi und GPIO. In der Beispieldatei rpi-hc-sr04-tool.c mach ich das dann so. Nimm also die 3 Dateien und ruf die rpi-hc-sr04-tool.c nach dem kompilieren aus :)

  • Hallo Tony,
    ich versuche mein Glück mit deinem Python Script mit meinem Raspi 3 B. Die Messwerte scheinen aber eher aus dem Zufallsgenerator zu kommen. Sensor liegt ohne Bewegung da!
    Distanz = 129.1 cm
    Distanz = 0.7 cm
    Distanz = 125.7 cm
    Distanz = 1.3 cm
    Distanz = 128.2 cm
    Distanz = 130.4 cm
    Distanz = 129.5 cm
    Distanz = 129.5 cm
    Distanz = 129.3 cm
    Distanz = 125.9 cm
    Distanz = 1.4 cm
    Distanz = 127.4 cm
    Distanz = 3.3 cm
    Distanz = 129.6 cm
    Distanz = 2.8 cm
    Distanz = 128.9 cm
    Distanz = 4.8 cm
    Distanz = 126.9 cm
    Distanz = 6.3 cm
    Distanz = 128.8 cm
    Distanz = 5.9 cm
    Distanz = 126.6 cm
    Distanz = 0.4 cm
    Distanz = 130.0 cm
    Distanz = 5.8 cm
    Was muss ich beim elektronischen Aufbau beachten? Abgeschirmtes Kabel zum Sensor nötig? Kabellänge 1m, o.k?
    Freu mich auf eine Antwort :-)
    Gruß, Robert

    • Hallo Robert,

      verwendest du den gleichen Code wie ich? Theoretisch hat der Sensor einen Messbereich von 2 bis 400 cm, meine ich. Eine Kabellänge von 1 Meter habe ich noch nicht probiert. Bei mir lag die Länge bei um die 20 cm bisher. Versuch zunächst mal kürzere Kabelstrecken zu nutzen (testweise) und achte darauf das die Kabel richtig und stabil angeschlossen sind um Wackler zu vermeiden.

  • Hallo
    Super Beitrag .
    Funktioniert bei mir super .
    Da ich aber gpio auch für pilight nutze
    Wäre interessant die Auswertung in pilight anzuzeigen .
    Ist für mich als unerfahrene die Konfiguration zu erweitern zu schwierig

  • Hallo Tony,

    ein Raspberry Pi ist ja nicht Echtzeitverarbeitend. Kann man das auch so lösen, dass dieses Problem umgangen wird? (Eventuell mit Interrupts?)

    Vielen Dank schon einmal!

    • Hallo Philipp,

      hier muss ich erstmal nachfragen wie du das meinst? Den Trigger für den Sensor musst du ja immer bedienen, wenn du beginnen willst mit messen. Das Echo-Signal kann man dann mittels Interrupt auswerten.

    • Hallo Thorben,

      die Widerstände bilden einen Spannungsswandler, um das Signal von 5V auf 3,3V zu teilen, da der Raspberry Pi nur mit 3,3V umgehen kann. Im Tutorial verwende ich 330Ohm und 470Ohm. Ähnliche Werte im kOhm Bereich gehen auch.

  • Ich habe einen JSN-SR04 direkt an 3 V am Raspi angeschlossen, also ohne Spannungsteiler.
    Allerdings messe ich nur zwischen 18,7 cm und 18,9 cm. Der Abstand zur Wasseroberfläche beträgt aber ca. 80 cm.
    Um Streuungen in der Zisterne zu vermeiden, ist der Sensor in einem KG100 Rohr montiert. Allerdings sind es zwischen Sensor und Raspi ca. 15 m. Hierfür ist ein 4 adriges Telefonkabel verwendet, die Schirmung ist mit auf GND aufgelegt.

    Bekomme ich realistische Werte, wenn ich 5 V verwende und den Spannungsteiler mit 330/470 Ohm aufbaue?