Ultraschall Sensor Software
Im letzten Teil habe ich nur kurz die Ultraschall Sensor Software erwähnt. Diese fehlt uns noch um mit dem Raspberry Pi Abstandsmessungen durchzuführen. Ich habe dazu ein Python Skript erstellt, dass beim Aufruf die Messung durchführt und das Ergebnis auf der Konsole ausgibt. Das Skript kann auch automatisiert von einer Roboter KI verwendet werden um im Raum zu navigieren, aber dazu in einigen Wochen mehr.
Ultraschall Sensor Software
Der HC-SR04 Sensor ist recht interessant. Neben der Spannung und der Masse benötigt er nur 2 Datensignale:
- Trig
Liegt an diesem Pin Spannung an, dann sendet der Sensor einen Ultraschall Impuls aus. Für unsere Zwecke schalten wir diesen Impuls nur für einen Bruchteil einer Sekunde an. Wir wollen nur einen kurzen Ping absetzen und dann auf das Echo des Pings warten, dass auftritt, wenn die Schallwellen auf ein Objekt treffen und von diesem zurückgeworfen/reflektiert werden. - Echo
Der Empfänger horcht. Ist also passiv und sendet erst ein Signal aus, wenn er ein Ultraschall Signal empfängt.
Das Datenblatt des Sensors für weitere Informationen ist unter dem Link zu finden.
Theorie
Die Theorie der Ultraschall Sensor Software ist recht einfach. Wir initialisieren die nötigen GPIO Pins und benennen diese mit trig oder echo. Danach initialisieren wir den Sender, so dass dieser kein Signal aussendet. Nach kurzer Wartezeit schicken wir einen Ping, das heißt wir legen für einen Bruchteil einer Sekunde Spannung an. Dieser Impuls kommt zum Empfänger zurück, nachdem er von einem Objekt reflektiert wurde. Sobald dieser eintrifft starten wir den timer und warten bis der Impuls vorbei ist. Aus der Impulsdauer kann die doppelte Entfernung des Wegs errechnet werden (Weg vom Sender zum Objekt und der Weg vom Objekt zum Empfänger). Von diesem Wert ist die tatsächliche Entfernung sehr einfach zu bekommen.
Source Code
Der vollständige Source Code für den Sensor sieht wie folgt aus:
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) trig_pin = 23 echo_pin = 24 GPIO.setup(trig_pin,GPIO.OUT) GPIO.setup(echo_pin,GPIO.IN) GPIO.output(trig_pin, False) print "Waiting to settle" time.sleep(1) GPIO.output(trig_pin,True) time.sleep(0.00001) GPIO.output(trig_pin,False) while GPIO.input(echo_pin)==0: start = time.time() while GPIO.input(echo_pin)==1: end = time.time() duration = end - start distance = duration * 17150 distance = round(distance, 2) print "Distance:",distance,"cm" GPIO.cleanup()
Wir binden die Bibliotheken für die GPIO Schnittstelle GPIO und für den Zeitberechnung time ein. Danach dir übliche Initialisierung der Schnittstelle und der verwendeten Pins. Wir benötigen die Pins 23 und 24 und setzen diese jeweils als Ausgabe oder Eingabe Pin.
Die Ultraschall Sensor Software beginnt damit, den Sender auf 0 zu setzen, es wird somit kein Signal gesendet. Danach setzen wir den Impuls ab in dem wir den Pin für 0.00001 Sekunden auf 1 setzen und danach sofort wieder auf 0. Beim Empfänger horchen wir nun bis das Signal ankommt, nehmen die Zeit und warten dann ab bis das Signal vollständig empfangen wurde und am Empfänger nichts mehr ankommt. Diese Differenz ist nun die doppelte Wegstrecke, wir multiplizieren diese mit der halben Schallgeschwindigkeit (Luft: 343 m/s) = 17150. Nun haben wir den gemessenen Abstand in Zentimeter. Diesen geben wir aus.
Genauigkeit
Die Genauigkeit der Messung ist ausschließlich von der präzisen Zeitdifferenz abhängig. Da Linux kein Echtzeit Betriebssystem ist werden zwei aufeinander folgende Messungen nie exakt die selbe Entfernung anzeigen. Die Rechenzeit wird auf alle Prozesse aufgeteilt und somit ist nicht vorhersagbar wann das Python Skript immer Prozessorzeit bekommt. Die Genauigkeit liegt aber im Millimeterbereich und ist für fast alle Anwendungsfälle ausreichend.
Fazit
Mit der Ultraschall Sensor Software lässt sich in Verbindung mit dem HC-SR04 Sensor so einiges realisieren. Man kann kleinere Räume vermessen, eine Einparkautomatik für das Auto realisieren oder einfach einen Roboter auf Basis des Raspberry Pis bauen. In jedem Fall liefert der Ultraschall Sensor präzise Messwerte und das Skript ist in vielen Projekten gut einsetzbar.
Welche Verbesserungen würdet ihr an der Software machen? Wo setzt ihr den Sensor ein?
Teil 1 | Teil 2 | Teil 3 | Teil 4 | Teil 5
Hallo,
kann man auch die Entfernung in einem Rohr messen?
Mal angenommen, ich hätte ein 50mm Rohr und in diesem ist ein zu messender Wasserspiegel. Kann man mit Ultraschall oder Infrarot diesen bestimmen?
Liebe Grüße
Michael
Müsste man einfach testen, habe dazu keine Erfahrungswerte.
Hallo Werner,
Wärst du in der Lage das zu testen?
Danke für das Skript. Kurz und knapp, habe ich gesucht. Python2 ist aber nicht mehr der letzte Schrei.
Ein „pip3 install modernize“und anschließendes „python-modernize -w das-skript.py“ brachten Abhilfe:
—– schnipp —–
from __future__ import absolute_import
from __future__ import print_function
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
trig_pin = 23
echo_pin = 24
GPIO.setup(trig_pin,GPIO.OUT)
GPIO.setup(echo_pin,GPIO.IN)
GPIO.output(trig_pin, False)
print („Waiting to settle“)
time.sleep(1)
GPIO.output(trig_pin,True)
time.sleep(0.00001)
GPIO.output(trig_pin,False)
while GPIO.input(echo_pin)==0:
start = time.time()
while GPIO.input(echo_pin)==1:
end = time.time()
duration = end – start
distance = duration * 17150
distance = round(distance, 2)
print((„Distance:“),distance,(„cm“))
GPIO.cleanup()
—– schnapp —-