Kampis Elektroecke

Ultraschallmodul

Raspberry Pi

Hier zeige ich, wie ein preiswertes Ultraschallmodul an den Raspberry Pi angeschlossen werden kann, sodass eine einfache Entfernungsmessung mit dem Raspberry Pi umgesetzt werden kann.

Die Schaltung:

Die Beschaltung des Ultraschallmoduls sieht folgendermaßen aus:

Das Modul kann auch mit 3,3 V betrieben werden. Dadurch spart man sich zwar den Spannungsteiler, büßt aber einiges an Reichweite ein (sie beträgt dann nur noch etwa 40 cm). Der Spannungsteiler dient dazu um die 5 V Pegel des Ultraschallmoduls auf 2,5 V herunter zu teilen, da das Raspberry Pi nur maximal 3,3 V als Eingangsspannung verträgt.

Das Programm:

Um eine Messung auszulösen muss die Triggerleitung 10 µs ein High-Signal führen. Anschließend sendet das Modul acht 40 kHz Impulse aus und wenn sie reflektiert werden wird der Echo-Pin auf High gezogen. Aus der High-Level Zeit vom Echo Pin kann anschließend die Entfernung berechnet werden:

s = \frac{v}{2} \cdot t
Einheit Formelzeichen
Entfernung [cm]: s
Pulsdauer [s]: t
Schallgeschwindigkeit [m/s] v

Als erstes löst das Programm mit folgenden Zeilen eine Messung aus:

GPIO.output(TRIGGER, False)
time.sleep(0.5)
GPIO.output(TRIGGER, True)
time.sleep(0.00001)
GPIO.output(TRIGGER, False)

Dazu wird der Trigger Pin als erstes auf Low gezogen und kurz gewartet. Dies stellt sicher das der Pin einen Low-Pegel führt und das Modul dies auch richtig erkennt. Anschließend wird er auf High gezogen und es wird 10 µs gewartet. Die sleep-Funktion ist bei kleinen Zeitintervallen nicht sonderlich genau, aber für diese Anwendung ist das unwichtig, da es sich bei den 10 µs nur um eine Mindestzeit handelt und Abweichungen nach oben die Funktion nicht beeinträchtigen.

Nach 10 µs wird der Pin wieder auf High gezogen und jetzt fängt das Programm an die Zeit zu messen. Dafür wird erst gewartet bis der Echo Pin einen High-Pegel führt:

while GPIO.input(ECHO) == 0:
    pass

Sobald ein High-Pegel anliegt, wird mittels

Start = time.time()

die Startzeit in der Variable Start gespeichert. Anschließend wird gewartet bis der Echo-Pin einen Low-Pegel führt:

while GPIO.input(ECHO) == 1:
    pass

Sobald dies eintritt, wird mit Stop = time.time() die Stopzeit gespeichert.

Jetzt kann das Programm die Zeit des High-Signals berechnen. Dafür muss zuerst die verstrichene Zeit berechnet werden:

Zeit = Stop - Start

Mit dieser Zeit kann das Programm nach der oben gegebenen Formel den Abstand berechnen.

Entfernung = Zeit * (Schallgeschwindigkeit/2)
Entfernung = Entfernung * 100
Entfernung = round(Entfernung, 2)

Mit der letzte Zeile wird das Ergebnis auf zwei Nachkommastellen gerundet und anschließend wird die Entfernung in der Konsole ausgegeben:

Das Python-Skript gibt es in meinem GitHub-Repository zum Download.

Zurück zu GPIO

24 Kommentare

    1. Hey,

      wenn du das Modul mit 5V betreibst, kann es gut hinkommen das es 4m weit reicht. Hab es bisher nur immer bis etwa 3m beobachten können, da in der Entfernung meist immer was stand :)

      Gruß
      Daniel

  1. Danke, für die Antwort.
    Habe mir so ein Modul mal bestellt.
    Ich kann das ganze ja auch als Erkennungsgerät verwenden?
    Möchte mit dem Modul nur feststellen ob sich jemand über eine bestimmte Stelle bewegt und dann eine Funktion ausführen, danach soll wieder gewartet werden bis jemand die Stelle überquert und die Funktion erneut ausgeführt wird.
    Gruß

  2. Hallo Daniel, mein Modul ist jetzt da. Funktioniert soweit auch super. Nur mit deinem Skript löst es ja alle Sekunde aus und gibt die Entfernung des nächsten Gegenstand an. Hast du einen Tipp wie ich das ganze als „Lichtschranke“ verwenden kann? Sprich nur auslöst wenn eine Große Abweichung ist bzw. wenn jemand durchläuft?
    Gruß

    1. Das Auslösen habe ich jetzt so hin bekommen, das wenn unter einer Wert unter einer bestimmten Entfernung ist dieser auslöst.
      Klappt soweit super.
      Nur alle ca. 15-30 Sekunden kommt ein „falscher Wert“.
      Vielleicht wäre für mein Vorhaben doch eine Lichtschranke besser geeignet, da muss ich noch ein bisschen spielen.

      1. Hey,

        schön das es klappt.
        Das mit dem falschen Wert kann ich mir nicht erklären…. . Betreibst du das Modul mit 5V?
        Generell hast du recht, für so ein Vorhaben ist eine Lichtschranke praktischer.

        Gruß
        Daniel

        1. Ja betreibe es mit 5 V und habe leider immer mal wieder ein paar falsche Werte.
          Hast du schon mal was mit einer Lichtschranke gemacht, bzw. kannst du das eine Hardware empfehlen?
          Gruß

          1. Hey,

            nein mit einer Lichtschranke habe ich noch nicht gearbeitet. Aber das ist eigentlich nicht mehr als die Abfrage nach einem Taster. Dafür nimmst du dann die Interrupts und fertig :)

            Gruß
            Daniel

  3. Hallo Daniel, vielen Dank für deine ausführliche Erklärung zum Thema Ultraschallsensor. Weißt du vielleicht wie ich den Abstandswert aus der Variablen „Entfernung“ entnehmen kann, eventuell in eine DB schreiben oder Datei und diese an meinen Webserver senden kann.

    Ich würde die Ausgabe aus dem Pythonscript gerne auf meiner Homepage anzeigen lassen.

    Danke dir

  4. Hi,
    vielen Dank für deinen Artikel ich möchte den Ultraschallsensor ebenfalls nutzen, jedoch würden mir die 40 cm vollkommen ausreichen. Ich habe den ganzen Spaß jetzt mit 3,3Volt betrieben und habe lediglich einmal ganz kurz eine Entfernung ausgegeben bekommen, mag das am falschen Voltparameter liegen oder könnte das eine andere Ursache haben?
    mfg
    Andy

    1. Hey,

      das kann gut sein, dass der Chip bei 3,3V Mist macht.
      Betreibe ihn einfach mit 5V und benutz einen Spannungsteiler für den IO und dann sollte alles funktionieren :)

      Gruß
      Daniel

  5. Vielen Dank für die Anleitung und das Python Skript, hat mir eine Menge Arbeit abgenommen. Jedoch kann ich sehr empfehlen die Schallgeschwindigkeit auf die entsprechende Temperatur anzupassen, diese hier für 0°C liefert bei 20°C auf 20 cm schon um fast 1 cm verfälschte Werte.

    1. Hey Dustin,

      danke für den Hinweis.
      Ja da hast du recht. Wenn man die Möglichkeit hat die Schallgeschwindigkeit korrekt zu erfassen (z.B. mit einem Temperatursensor) sollte man dies tun :)

      Gruß
      Daniel

  6. Hey,

    das schaut ja relativ leicht aus. Habe allerdings eine Frage: Kann man auch mehrere Ultraschall Sensoren am Pi betreiben? Beispielsweise 4?

    Das Problem dabei wäre ja, dass nur 2x 5V Pins am Pi sind – wenn man allerdings alle Sensoren nacheinander prüfen lässt, könnte man doch alle Sensoren an einem Pin mit 5V anschließen, oder?

    1. Hallo Alex,

      du kannst alle vier Sensoren über die 5V versorgen, das sollte kein Problem darstellen.
      Den Trigger und den Signalpin eines jeden Sensors musst du dann aber an einen anderen IO legen.
      Prinzipiell sollte der Betrieb von vier Sensoren somit möglich sein.

      Gruß
      Daniel

  7. Hallo Kampi,
    danke für die Anleitung. Ich hab das genau so nachgebaut, und es funktioniert hervorragend bis zu einem Abstand von etwa 80-90 cm. Danach passt es gar nicht mehr. Ich bekomme für Abstände oberhalb 1 m maximal 110 cm ausgewertet.
    ‚Ne Idee, woran das liegen könnte?
    Grüße
    Halli

    1. Hallo Halli,

      betreibst du das Modul mit 3,3V? Weil dann ist es stark eingeschränkt.
      Für die „volle“ Reichweite (auch im Nahbereich) solltest du das Modul mit 5V betreiben und die Pins die VOM Modul ZUM Raspberry Pi gehen durch einen Spannungsteiler aus zwei gleich großen Widerstände auf einen 2,5V Pegel runter teilen.

      Gruß
      Daniel

      1. Hallo Kampi,
        ja, mit 5 Volt (Pin 2 vom Raspi). Ich hab’s exakt nach der Schaltung im Bild oben aufgebaut, also Spannungsteiler mit zwei 10k-Widerständen, Echo von zwischen den Widerständen zu einem GPIO, Trigger direkt auf einen zweiten GPIO.
        Vielleicht ein „Montags“-Sensor?

        1. mmh was natürlich auch sein kann, dass die Zeiten, die der Raspberry Pi für die Berechnung verwendet, ungenau sind und dadurch die Berechnung falsch ist.

    1. Hallo Klaus,

      das weiß ich nicht, da ich nicht weiß wie der Triggereingang des Moduls intern aufgebaut ist.
      Ich würde aber einfach mal nein sagen bzw. probier es aus ;)

      Gruß
      Daniel

  8. Hallo Kampi,
    bin auf diese Seite gestoßen. Tolle Darstellung – Kompliment!
    Habe ein Problem mit dem Sensor DYP-ME007Y. Er sollte an sich gleich verdrahtet werden wie der HC-SR04. Nichts funktioniert. Offensichtlich bin ich hier an eine Ausführung (TX) mit seriellem Anschluss geraten.
    Hast Du diesbezüglich Erfahrung und könntest mir vielleicht ein paar Tips geben, wie ich hier weiter kommen kann?
    Für Deine Mühen im voraus Danke
    Gruß
    Bernhard

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert