Der Entfernungssensor

Auch Entfernungen spielen in unserem Alltag eine wichtige Rolle. Es ist immer gut zu wissen, wie weit der Baum vor einem noch entfernt ist, damit man nicht ungehindert gegen ihn donnert. Sicher könnte man die Entfernung einfach abschätzen und einfach rechtzeitig einen Bogen schlagen, aber was wäre das denn für eine unkomplizierte Lösung? So würde das ja gar keinenen Spaß machen.

Der Name des Sensors verrät schon viel über seine Funktionsweise. Ultraschall ist der gesamte Schallbereich, der eine so hohe Frequenz hat, dass wir Menschen den Schall nicht hören können. Fledermäuse benutzen diese Technik, um nicht gegen Hindernisse zu fliegen und sich zu orientieren oder ihre Beute zu orten. Der HC-SR04 benutzt dieselbe Technik und ist sehr einfach aufgebaut. Es gibt vier Pins von denen zwei den Sensor mit Strom und Ground versorgen. Die beiden mittleren Pins werden echo und trigger genannt. Mit dem trigger-Pin können wir selbst eine Schallwelle erzeugen (rot) und können dann mit dem echo-pin messen, wann die reflektierte Schallwelle wieder am Sensor ankommt. Daraus können wir dann die Entfernung von dem Objekt ermitteln, welches die Schallwelle reflektiert hat.

Aufbau

Um das Ganze überhaupt messen zu können, müssen wir den Sensor erst mal an unseren Raspberry Pi anschließen.

Anschlüsse am RaspberryAnschlüsse am Sensor
5vVCC
GPIO 3trigger
GPIO 4echo
GNDGND

Wenn du das ausführst, sollte bei dir im Terminal jetzt eine Entfernung angegeben werden.

import RPi.GPIO as gpio
import time

gpio.setmode(gpio.BCM)

trig = 3
echo = 4

print("Messung startet")

gpio.setup(trig, gpio.OUT)
gpio.setup(echo, gpio.IN)

gpio.output(trig, False)

time.sleep(0.5)

gpio.output(trig, True)
time.sleep(0.00001)
gpio.output(trig, False)

while gpio.input(echo) == 0:
        start = time.time()

while gpio.input(echo) == 1:
        stop = time.time()

vergangeZeit = stop-start

entfernung = round(vergangeZeit*34000/2, 2)

print(entfernung)

Es ist wichtig, dass es auch wirklich ein Hindernis gibt, dessen Abstand gemessen werden kann. Sollte nach einigen Sekunden nichts angezeigt werden, ist etwas falsch angeschlossen oder es ist kein Objekt in der Nähe.

Schritt für Schritt

In Zeile 1-2 binden wir die benötigten Bibliotheken ein.

In Zeile 6 und 7 legen wir fest, welche Pins trigger und echo sein sollen, indem wir als Variablen die GPIO-Pins dafür abspeichern. Wenn ihr andere Pins benutzen wollt, müsst ihr diese Angaben auch ändern. Da wir für den trigger pin GPIO3 und für echo pin GPIO4 benutzen, müssen wir das natürlich auch angeben.

In Zeile 9 lassen wir den Benutzer einfach nur wissen, dass wir jetzt mit der Messung anfangen. Das machen wir, da es die meisten Menschen beruhigt, wenn man ihnen sagt, dass alles seinen Weg geht.

In Zeile 11 und 12 bestimmen wir, welche Funktion die GPIO-Pins haben sollen. Den trigger-Pin müssen wir auf gpio.OUPUT setzen, denn damit teilen wir dem Sensor mit, wann er die erste Schallwelle erzeugen soll. In der nächsten Zeile setzen wir den echo-Pin auf gpio.INPUT. Mit diesem messen wir, wann die reflektierte Schallwelle von dem Objekt zurückkommt.

So weit, so gut! In Zeile 14 gehen wir nochmal sicher, dass der trigger-Pin auf gpio.LOW ist, damit fließt kein Strom. Das müssen wir machen, um wirklich sicher zu gehen, dass der Sensor nicht vorher schon Schallwellen verschickt, die wir nicht gemessen haben. Deswegen halten wir in Zeile 16 das Programm nochmal für eine halbe Sekunde an.

In den Zeilen 18 – 20 fangen wir endlich mit dem Auslesen der Distanz an. Wir schalten den Sensor für 0.00001 Sekunden an und erzeugen in der Zeit das Ultraschallsignal.

Für den nächsten Abschnitt musst du wissen, was ein Unix-Timestamp ist. Wir Menschen sind sehr willkürlich, wenn es um Zeitmessung geht. Viele verschiedene Länder nutzen viele verschiedene Formatierungen für ihre Zeitmessungen. Beim Programmieren kann das zu großen Problemen führen, wenn man zum Beispiel plötzlich mit der falschen Formatierung arbeitet. Um dieses Problem geschickt zu umgehen, haben sich kluge Köpfe einst etwas ausgedacht. Und zwar den Unix Timestamp. Dieser misst seit dem 01.01.1970 die Zeit in Sekunden. Ja genau, er zählt jede einzelne vergangene Sekunde. Das ist kein Job für Jedermann. Rufen wir also den Unix-Timestamp auf, bekommen wir kein formatiertes Datum ausgegeben, sondern die Anzahl der Sekunden, die seit dem 01.01.1970 vergangen sind. Da, wo ich herkomme, nennt man das richtig gutes Klugscheißer-Wissen.

In Zeile 22 haben wir unsere erste while Schleife. Solange nämlich eine Schallwelle gesendet wurde, aber noch keine reflektierte Schallwelle angekommen ist, ist der Input-Pin vom Trigger auf HIGH gesetzt. Es kommt also Strom an. (Das sind alles Vorgaben vom Sensor, mit denen wir leider leben müssen.) Das heißt, um zu messen, wie lange die erzeugte Schallwelle und die reflektierte Schallwelle für den Zeitraum gebraucht haben, müssen wir messen, von wann bis wann der trigger -Pin etwas gemessen hat. Deswegen läuft die erste while-Schleife solange, wie kein Strom gemessen wurde, also noch kein Signal gesendet wurde. Wenn Strom fließt, wurde das Signal gesendet und in der Variablen start wird der aktuelle Unix Timestamp gespeichert.

Die zweite while Schleife in Zeile 25 macht das genau andersherum. Sie speichert in der Variablen stop den aktuellen Unix Timestamp, solange die reflektierende Schallwelle noch nicht zurückgekommen ist. Da jedes mal der alte Wert in der Variablen überschrieben wird, haben wir nach der while Schleife den Endzeitpunkt, also den Zeitpunkt, als die reflektierte Schallwelle wieder beim Sensor angekommen ist.

Diese verstrichene Zeit speichern wir dann in der Variablen vergangeneZeit. Wenn wir einfach stop-start rechnen, bekommen wir die exakte Dauer, die die Schallwellen gebraucht hat.

Die Distanz können wir einfach ausrechnen, denn Schallgeschwindigkeit, bei normaler Raumtemperatur, liegt bei 343,2 m/s. Das Ganze müssen wir dann nochmal durch zwei teilen, die Distanz stammt aus unserer erzeugten Schallwelle und der reflektierten Schallwelle.

In Zeile 32 geben wir das einfach nur noch aus. Et voilá! Fertig ist die Entfernungsmessung!

Jetzt bist du dran: Kannst du diese Werte auch auf dem Display ausgeben?