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