Hinweis: Wie die einzelnen Hardware Komponenten so wie die benötigten evtl. weiteren elektronischen Zusatzteile (Widerstände, Transistoren, Stromversorgung) angeschlossen werden, ist in der Rubrik Elektronik nachzuschlagen. In dieser Rubrik wird ausschließlich die Software-Entwicklung betrachtet.
Mit dem Ultraschallsensor HC-SR04 können Abstände gemessen werden. Dieses Modul reicht für die meisten DIY Projekte aus und kostet grob 1-2€ pro Stück.
Technische Details:
- kleinster Abstand: ca. 3-4 cm
- maximaler Abstand: ca. 3-4 meter
- Genauigkeit: ca. 4-5 mm
Funktionsweise
Der Sensor sendet ein Ultraschallsignal aus und der Ausgang des Sensors wird auf 0/false gesetzt. Nun wartet der Sensor bis er das echo des Signals wieder empfängt. Sobald das Signal erkannt wurde wird der Ausgang des Sensors auf 1/true gesetzt. Dies bedeutet, dass der Sensor letzendlich nicht direkt die Entfernung misst, sondern lediglich ein Signal aussendet und wieder das Echo empfangen kann.
Was muss gemacht werden
- Der Sensor muss getriggert werden wann er ein Signal aussenden soll
- Es muss die Zeit zwischen senden des Signals (Trigger) und dem Empfang des Echos gemessen werden.
- Berechnung von Zeit zu Abstand gemäß der alten Schulformeln (die ja alle Wissen ;-))
Der Sensor wird wie folgt an den RaspberryPi angeschlossen:
- TRIGGER an GPIO23
- ECHO an GPIO 24
Hinweis: In diesen Code-Beispiel wird der hintere Abstandssensor implementiert. Analog muss auch der vordere Abstandssensor implementiert werden. Der Unterschied sind lediglich andere GPIO Pins sowie ein andere Name im Websocket Client.
#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time
#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BCM)
#GPIO Pins zuweisen
GPIO_TRIGGER = 23
GPIO_ECHO = 24
#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 round(distanz, 2)
if __name__ == '__main__':
try:
while True:
abstand = distanz()
print ("Gemessene Entfernung = %.3f cm" % abstand)
time.sleep(1)
# Beim Abbruch durch STRG+C resetten
except KeyboardInterrupt:
print("Messung vom User gestoppt")
GPIO.cleanup()
Auch für den Sensor muss ein Websocket Client geschrieben werden. Dieser soll zyklisch (jede 0.5 sec.) den gemessenen Wert an die Java-Applikation senden. Auch hier muss der Sensor sich zu Beginn mit seinem Namen beim Websocker-Server melden, so dass später eine Zuodnung der Sensorwerte zu dem Sensor möglich ist.
import asyncio
import websockets
import ultrasonic
import time
async def wsclient():
async with websockets.connect('ws://localhost:9000') as websocket:
#FirstMessaging - Name
await websocket.send('Name:'+'ultrasonicBack')
while True:
dis = ultrasonic.distanz()
#dis=1234
await websocket.send('ultrasonicBack:'+str(dis))
#print ('sending')
time.sleep(0.5)
#This have to be the last line!
asyncio.get_event_loop().run_until_complete(wsclient())