Hallo Zusammen,
ich hab da mal ein kleines Problem mit den HC-SR04 Sensoren.
Ich hab 5 Stück davon am Raspberry Pi B+ angeschlossen.
ein GPIO Pin gibt den Trigger und 5 weitere sind Echo
Wenn ich jetzt das Script starte, dann läuft es problemlos eine Weile durch, doch dann bleibt es urplötzlich an irgendeinem Sensor stehen und der Python Task hängt sich dabei auf und jagd die CPU auf 100 % hoch.
Ich hab den Time.sleep unten in der Ablaufschleife mal variiert.
am saubersten läuft er mit 1 sec. Da läuft er durch ohne sich aufzuhängen. (für die Anwendung jedoch viel zu langsam)
Aber setze ich die Zeit runter auf (0.5) hängt er sich erst nach ein paar Minuten auf und bleibt bei irgendeinem Sensor stehen.
Anfangs dachte ich es liegt am Kabel bis ich dazu übergegangen bin geschirmtes Kabel (Cat 7) zu benutzen.
Jedoch hat dies keine Auswirkung auf das Aufhängen gehabt.
Dann hab ich mal mir die CPU Auslastung angeschaut.
bei (1) hat er 0,3 % CPU Auslastung läuft stabil durch
bei (0.5) hat er 0,6 % CPU Auslastung hängt sich nach ca 5 min auf
bei (0.02) hat er 14,6 % CPU Auslastung hängt sich sporadisch zwischen 30-60 Sekunden auf
Verständlicherweise je schneller der Messen soll desto mehr CPU Last entsteht.
Jedoch sollte bei 14,6 % sich das Ganze nicht unbedingt aufhängen, sondern stabil durchlaufen, geschweige denn bei 0,6 %.
Da es aber wichtig ist das er zügig seine Messungen durchführt und sich dabei nicht aufhängen darf, bin ich jetzt mal hier auf Rat angewiesen, was kann ich machen damit es zu keinem Sensorstop mehr kommt. Und sich der Task dabei aufhängt und dann bei 85 - 100 % die CPU hoch jagd.
Die Anwendung warum die Sensoren zügig messen sollen, ist ein Roboter der mit 5 Sensoren in einem Halbkreis von 180 Grad seine Umgebung abtasten soll, damit er nirgendwo gegen fährt.
hier mal das Script zur Analyse ob ich da was verkehrt gemacht habe.
Ist jetzt nur rein die Sensoren Abtastung.....
#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time
#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BOARD)
#GPIO Pins zuweisen
GPIO_TRIGGER = 18
GPIO_ECHO_lv = 10
GPIO_ECHO_l = 26
GPIO_ECHO_m = 13
GPIO_ECHO_r = 24
GPIO_ECHO_rv = 8
#Richtung der GPIO-Pins festlegen (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO_lv, GPIO.IN)
GPIO.setup(GPIO_ECHO_l, GPIO.IN)
GPIO.setup(GPIO_ECHO_m, GPIO.IN)
GPIO.setup(GPIO_ECHO_r, GPIO.IN)
GPIO.setup(GPIO_ECHO_rv, GPIO.IN)
def distanz_lv():
# 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_lv) == 0:
StartZeit = time.time()
# speichere Ankunftszeit
while GPIO.input(GPIO_ECHO_lv) == 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_lv = (TimeElapsed * 34300) / 2
return distanz_lv
def distanz_l():
# 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_l) == 0:
StartZeit = time.time()
# speichere Ankunftszeit
while GPIO.input(GPIO_ECHO_l) == 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_l = (TimeElapsed * 34300) / 2
return distanz_l
def distanz_m():
# 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_m) == 0:
StartZeit = time.time()
# speichere Ankunftszeit
while GPIO.input(GPIO_ECHO_m) == 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_m = (TimeElapsed * 34300) / 2
return distanz_m
def distanz_r():
# 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_r) == 0:
StartZeit = time.time()
# speichere Ankunftszeit
while GPIO.input(GPIO_ECHO_r) == 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_r = (TimeElapsed * 34300) / 2
return distanz_r
def distanz_rv():
# 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_rv) == 0:
StartZeit = time.time()
# speichere Ankunftszeit
while GPIO.input(GPIO_ECHO_rv) == 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_rv = (TimeElapsed * 34300) / 2
return distanz_rv
if __name__ == '__main__':
try:
while True:
abstand = distanz_lv()
print ("Gemessene Entfernung links voll = %.1f cm" % abstand)
time.sleep(0.5)
abstand = distanz_l()
print ("Gemessene Entfernung links = %.1f cm" % abstand)
time.sleep(0.5)
abstand = distanz_m()
print ("Gemessene Entfernung mitte = %.1f cm" % abstand)
time.sleep(0.5)
abstand = distanz_r()
print ("Gemessene Entfernung rechts = %.1f cm" % abstand)
time.sleep(0.5)
abstand = distanz_rv()
print ("Gemessene Entfernung rechts voll = %.1f cm" % abstand)
time.sleep(0.5)
# Beim Abbruch durch STRG+C resetten
except KeyboardInterrupt:
print("Messung vom User gestoppt")
GPIO.cleanup()
Alles anzeigen
Bitte jetzt nicht pep8 oder sowas kommen, das ist ein reines Testscript was ich kurz erstellt habe um herauszufinden warum sich die Sensoren immer wieder aufhängen.
Ziel ist es eigentlich die Sensoren zwischen (0.02 - 0.2) Sekunden laufen zu lassen. Je schneller desto besser für die Abtastrate.
Natürlich gehe ich auch einen Kompromiss ein, wenn es garnicht anders geht. Jedoch sollte es nicht mehr als (0.25) werden, sonst
ist es zu langsam für die Fahrt.
Ich hoffe die Profis unter Euch, wissen da Rat und können mir hierbei gezielt helfen um das Problem in den Griff zu bekommen.
Denn mein Latein ist aktuell am Ende.........
MFG
Zappelmann