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.

Ultraschallsensor HC-SR04

Ultraschallsensor HC-SR04

 

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.

Ultraschallsensor HC-SR04 Schaltplan

Ultraschallsensor HC-SR04 Schaltplan

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.