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()