Um Entfernungen mit dem Raspberry Pi zu Messen eigenet sich der Ultraschallsensor HC-SR04. Er ist für ein paar Euro zu erhalten und misst Entfernungen bis ca. 4 Meter relativ genau. Er kann so zum Beispiel genutzt werden, um Wasserstände in Fässern oder Brunnen zu kontrollieren, oder um zu überprüfen, ob eine Tür offen oder geschlossen ist.
Schaltplan
Der Sensor wird mit einer Betriebsspannung von 5V betrieben und soll von 2 cm bis zu 4 Metern millimetergenaue Werte liefern. Die Daten, die er liefert sind in digitaler Form. Er wird folgendermaßen mit dem Raspberry Pi verbunden.
Der Trig PIN wird mit dem GPIO 8 des Raspberry Pi verbunden. Der Echo PIN wird über einen 470 Ohm Wiederstand mit dem GPIO 11 verbunden. Zusärzlich wird er noch mit einem zweiten 470 Ohm Wiederstand auf GRND verbunden. Welche Werte die Wiederstände haben sollen, ist von Tutorial zu Tutorial unterschiedlich. Es wird von 1 kΩ (Ohm) / 2.2 kΩ (Ohm) Widerstand oder 330 Ω (Ohm) / 470 Ω (Ohm) Widerstand gesprochen. Es geht aber auch wie hier mit 2 470 Ω (Ohm) Wiederständen.
Programm
Nun braucht mann noch ein Programm, welches die Daten ausließt. Hierfür reicht ein einfaches Python Programm
#Bibliotheken einbinden import RPi.GPIO as GPIO import time #GPIO Modus (BOARD / BCM) GPIO.setmode(GPIO.BCM) #GPIO Pins zuweisen GPIO_TRIGGER = 8 GPIO_ECHO = 11 #Richtung der GPIO-Pins festlegen (IN / OUT) GPIO.setup(GPIO_TRIGGER, GPIO.OUT) GPIO.setup(GPIO_ECHO, GPIO.IN) def distanz(): # setze Trigger auf HIGH GPIO.output(GPIO_TRIGGER, True) # setze Trigger nach 0.01ms aus LOW time.sleep(0.00001) GPIO.output(GPIO_TRIGGER, False) StartZeit = time.time() StopZeit = time.time() # speichere Startzeit while GPIO.input(GPIO_ECHO) == 0: StartZeit = time.time() # speichere Ankunftszeit while GPIO.input(GPIO_ECHO) == 1: StopZeit = time.time() # Zeit Differenz zwischen Start und Ankunft TimeElapsed = StopZeit - StartZeit # mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren # und durch 2 teilen, da hin und zurueck distanz = (TimeElapsed * 34300) / 2 return distanz if __name__ == '__main__': try: while True: abstand = distanz() print ("Gemessene Entfernung = %.1f cm" % abstand) time.sleep(1) # Beim Abbruch durch STRG+C resetten except KeyboardInterrupt: print("Messung vom User gestoppt") GPIO.cleanup()
In diesem Script wird die Zeit gemessen, wiel lange es dauert dass der GPIO 8 (Echo) von 0 auf 1 schaltet. Die vergangene Zeit wird mit der Schallgeschwindigkeit multipliziert und durch 2 geteilt. Dieser Vorgang wird jede Sekunde wiederholt.
Datenausgabe
Die Ausgabe sollte dann im Idealfall etwa so aussehen:
Gemessene Entfernung = 13,8 cm
Gemessene Entfernung = 13,8 cm
Gemessene Entfernung = 13,8 cm
Gemessene Entfernung = 13,8 cm
Gemessene Entfernung = 13,8 cm
Gemessene Entfernung = 13,8 cm
Gemessene Entfernung = 13,8 cm
…..
Das ist aber nicht der Fall und auch nicht zu erwarten. Die gemessen Werte variieren, mal von einzelnen Außreisern abgesehen, um ca. 5mm. Auch der Auftreffwinkel und die Art der Fläche, auf die die Ultraschallwellen treffen, lässt die Werte mehr oder weniger variieren. Auf eine gerade Fläche, die im Abstand von ca. 14 cm (mit Zollstock gemessen) vor dem Sensor steht, erhält man z.B. folgende Werte:
Gemessene Entfernung = 13,3 cm
Gemessene Entfernung = 13,7 cm
Gemessene Entfernung = 13,8 cm
Gemessene Entfernung = 13,3 cm
Gemessene Entfernung = 13,4 cm
Gemessene Entfernung = 13,4 cm
Gemessene Entfernung = 13,7 cm
…
Auch ist die Frage, von wo aus man bei dem Sensor messen soll. Am Ultaschallempfänger oder am Ende der Ultraschallsender? Mann sollte also nicht erwarten, dass man millimetergenaue Ergebnisse erhält. Aber für einen Wasserstandsanzeiger oder einen Sensor für eine Tür sollte es ausreichend sein. Achten sie beim Bau eines Wasserstandsanzeigers aber darauf, dass Sie hier mit Strom arbeiten. Sie müssen eine Möglichkeit finden, dass die Schaltung nicht mit dem Wasser in Kontakt kommt.
Datenverarbeitung
Wenn Sie die Daten weiterverarbeiten woll, empfielt es sich 5-10 Messungen zu machen, die Ausreisser zu eleminieren und über die restlichen Daten einen Mittelwert zu bilden. So kann man das Script z.B. so modifizieren, dass es bei Aufruf 10 Werte abfragt und diese dann zur Weiterverarbeitung ohne zusätzlichen Text in eine Datei schreibt.
Zum Beispiel:
20.10.2018 17:00:01;13,3;13,7;13,5;22,4;13,2;13,7;13,4;15,0;13,5;13,6
Diese Datei können Sie dann einlesen und für ein bestimmtes Datum eine Entfernung ermitteln. Der Fantasie sind hier keine Grenzen gesetzt.