Hier ein Anwendungsbeispiel für den Abstandsmessung mit Ultraschall – Der HC-SR04 Ultraschallsensorsensor. In diesem Beispiel wird der Abstand auf einem 7-Segment Display und auf einem LED Strip ausgegeben. Der LED Strip hat dabei einen gelben und einen roten Bereich.

Disclaimer
Bitte beachte, dass ich das Programm nur als Beispiel geschrieben habe. Du solltest Dich beim Einparken nicht auf eine derart einfache Einparkhilfe verlassen. Einparkhilfe für Autos haben mehrere Sensoren und für solche Systeme gelten in der Automobilindustrie bei der Entwicklung noch strengere Prozesse und Qualitätskriterien als für andere Software (Entwicklung nach ISO 26262 – Funktionale Sicherheit für Straßenfahrzeuge).
Personen oder Gegenstände, die nicht im Bereich des Sensors sind, werden von diesem nicht erfasst. Auch wenn der Sensor zum Beispiel gegen die Heckklappe gerichtet ist, die einige Zentimeter hinter der Stoßstange liegt, kann es leicht dazu kommen:
Das Video mit der Erklärung des Programms folgt hoffentlich bald auf meinem YouTube-Kanal.
Für die Ansteuerung des 7-Segment Displays verwende ich die folgende Bibliothek: https://github.com/depklyon/raspberrypi-tm1637.
Installiert wird die mit:
sudo pip3 install raspberrypi-tm1637
Die erforderlichen Installationen für den LED Strip werden im Youtube Video zum LED Strip erklärt:
Source Code
Hier der Source Code mit Polling des Signals: Abstand.py
#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time
import tm1637
from rpi_ws281x import *
# LED-Strip Konfiguration
LED_COUNT = 100 # Number of LED pixels.
LED_PIN = 18 # GPIO pin connected to the pixels (18 uses PWM!).
#LED_PIN = 10 # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 20 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
LED_Gelb = 20
LED_Ziel = 35
LED_Gruen = 50
LED_Min_in_mm = 100
LED_Max_in_mm = 2100
LED_mm_per_LED = (LED_Max_in_mm-LED_Min_in_mm) / LED_COUNT
# 7-Segment Display Konfiguration
SEVEN_SEGMENT_CLK = 21
SEVEN_SEGMENT_DIO = 20
# Ultraschall Sensor Konfiguration
US_SENSOR_TRIGGER = 23
US_SENSOR_ECHO = 24
Messung_Max = 1 # in sekunden
Messung_Trigger = 0.00001 # in sekunden
Messung_Pause = 0.2 # in sekunden
Messung_Faktor = (343460 / 2) # Schallgeschwindigketi durch 2 (hin und zurück) in mm/s
# Schallgeschwindigkeit gem. https://de.wikipedia.org/wiki/Schallgeschwindigkeit
# +20°C 343,46m/s
# 0°C 331,50m/s
# −20°C 319,09m/s
Abstand_Max = 4000 # Max value in mm
Abstand_Max_Error = Abstand_Max + 1
def LED_GetColor(pos):
if pos < LED_Gelb:
return Color(255,0,0) # rot
elif pos < LED_Gruen:
return Color(150,100,0) # gelb
else:
return Color(0,255,0) # gruen
def LED_Show(abstand):
# Ausgabe auf LED strip
if abstand > LED_Max_in_mm:
# LED Strip aus
for i in range(strip.numPixels()):
strip.setPixelColor(i, Color(0,0,0)) # aus
else:
# LED Strip anzeigen
for i in range(strip.numPixels()):
abstand_i = LED_Min_in_mm + (i * LED_mm_per_LED)
if i < LED_Ziel:
if abstand < abstand_i:
strip.setPixelColor(i, LED_GetColor(i)) # ein
else:
strip.setPixelColor(i, Color(0,0,0)) # aus
elif i > LED_Ziel:
if abstand > abstand_i:
strip.setPixelColor(i, LED_GetColor(i)) # ein
else:
strip.setPixelColor(i, Color(0,0,0)) # aus
else:
strip.setPixelColor(i, LED_GetColor(i)) # Ziel LED immer ein
strip.show()
def US_SENSOR_GetDistance():
# setze TRIGGER für min 0.01ms
GPIO.output(US_SENSOR_TRIGGER, True)
time.sleep(Messung_Trigger)
GPIO.output(US_SENSOR_TRIGGER, False)
# speichere Startzeit
StartZeit = time.time()
MaxZeit = StartZeit + Messung_Max
# warte aus steigende Flanke von ECHO
while StartZeit < MaxZeit and GPIO.input(US_SENSOR_ECHO) == 0:
StartZeit = time.time()
# speichere Stopzeit
StopZeit = StartZeit
# warte aus fallende Flanke von ECHO
while StopZeit < MaxZeit and GPIO.input(US_SENSOR_ECHO) == 1:
StopZeit = time.time()
if StopZeit < MaxZeit:
# berechne Zeitdifferenz zwischen Start und Ankunft im Sekunden
Zeit = StopZeit - StartZeit
# berechne Distanz
Distanz = Zeit * Messung_Faktor
else:
# setze Fehlerwert
Distanz = Abstand_Max_Error
# Distanz als Ganzzahl zurückgeben
return int(Distanz)
if __name__ == '__main__':
# Ultraschall Sensor Initialisierung GPIO-Pins
GPIO.setmode(GPIO.BCM) # GPIO Modus (BOARD / BCM)
GPIO.setup(US_SENSOR_TRIGGER, GPIO.OUT) # Trigger-Pin = Raspberry Pi Output
GPIO.setup(US_SENSOR_ECHO, GPIO.IN) # Echo-Pin = raspberry Pi Input
# 7-Segment Display Initialisierung
tm = tm1637.TM1637(clk=SEVEN_SEGMENT_CLK, dio=SEVEN_SEGMENT_DIO)
# LED-Strip Initialisierung
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
try:
while True:
Abstand = US_SENSOR_GetDistance()
if Abstand >= Abstand_Max:
# Ausgabe Text
print ("Kein Objekt gefunden")
# Ausgabe 7-Segment Display
tm.show(' -- ')
else:
# Ausgabe Text
print ("Gemessene Entfernung = %i mm" % Abstand)
# Ausgabe 7-Segment Display
tm.number(Abstand)
LED_Show(Abstand)
time.sleep(Messung_Pause)
# Beim Abbruch durch STRG+C resetten
except KeyboardInterrupt:
print("Messung vom User gestoppt")
tm.show(' -- ')
for i in range(strip.numPixels()):
strip.setPixelColor(i, Color(0,0,0))
strip.show()
GPIO.cleanup()