ich möchte den HC-SR04 Sensor benutzen um Abstände zu messen (das ist wohl der Sinn des Sensors). Er soll später mal an einem autonom fahrenden Roboter installiert werden.
Nun habe ich im Internet dieses Beispielskript gefunden und wollte es ausprobieren, allerdings gibt der Sensor komische Werte wieder. Das Skript ist minimal angeglichen (ein print-Kommando mehr, eins weniger und natürilch die GPIOs angeglichen). Das Problem habe ich inzwischen etwas eingrenzen können: Es liegt daran, dass quasi "start" = 0 gesetzt wird und beim Aufruf der Defintion "measure" dann der else-Fall eintritt, weil scheinbar GPIO.input(ECHO) != 1.
Wisst Ihr, woran das liegen könnte?
LG
Michi
Skript:
Code: Alles auswählen
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import datetime
# GPIOs fuer den US-Sensor
TRIG = 37
ECHO = 38
# Dauer Trigger-Impuls
PULSE = 0.00001
# Anzahl Messwerte fuer Mittelwertbildung
BURST = 25
# Schallgeschwindigkeit/2
SPEED_2 = 17015
# BCM GPIO-Referenen verwenden (anstelle der Pin-Nummern)
# und GPIO-Eingang definieren
GPIO.setmode(GPIO.BOARD)
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.remove_event_detect(ECHO)
GPIO.output(TRIG, False)
time.sleep(1) # Setup-Zeit fuer Sensor
stopp = 0 # Variableninit
start = 0
distance = 0
def pulse(): # Funktion zum Starten der Messung
global start
global stopp
global distance
GPIO.output(TRIG, True) # Triggerimpuls erzeugen
time.sleep(PULSE)
GPIO.output(TRIG, False)
stopp = 0 # Werte auf 0 setzen
start = 0
distance = 0 # und Event starten
def measure(x): # Callback-Funktion fuer ECHO
global start
global stopp
global distance
if GPIO.input(ECHO) == 1: # steigende Flanke, Startzeit speichern
start = time.time()
else: # fallende Flanke, Endezeit speichern
stopp = time.time()
delta = stopp - start # Zeitdifferenz und Entfernung berechnen
distance = delta * SPEED_2
print "delta: " + str(delta)
def measure_range(): # Bildet Mittelwert von BURST Messungen
values = []
sum = 0
for i in range(0, BURST):
pulse() # Messung starten
time.sleep(0.040) # Warten, bis Messung zuende
values.append(distance) # Wert im Array speichern und aufsummieren
sum = sum + values[i]
#print("Messwert: %1.1f" % distance) # Kontrollausgabe
time.sleep(0.1)
return sum/BURST; # Mittelwert zurueckgeben
# do it
try:
GPIO.add_event_detect(ECHO, GPIO.BOTH, callback=measure)
while True:
Dist = measure_range()
print("Range = %1.1f cm" % Dist)
time.sleep(1)
# reset GPIO settings if user pressed Ctrl+C
except KeyboardInterrupt:
print("Bye!")
GPIO.cleanup()
Code: Alles auswählen
delta: 1588870572.82
delta: 1588870572.82
delta: 0.000179052352905
delta: 0.000204086303711
delta: 0.000200033187866
delta: 0.000202178955078
delta: 1588870573.52
delta: 1588870573.52
delta: 0.000200033187866
delta: 0.000203847885132
delta: 0.000202894210815
delta: 0.000200986862183
delta: 0.000197172164917
delta: 0.00026798248291
delta: 0.000114917755127
delta: 0.000204086303711
delta: 0.000200033187866
delta: 0.000210046768188
delta: 0.000209093093872
delta: 1588870575.21
delta: 1588870575.21
delta: 0.000121116638184
delta: 0.000200033187866
delta: 0.000202894210815
delta: 0.000204086303711
delta: 0.000290155410767
delta: 0.000201940536499
delta: 0.000203132629395
Range = 3244155937697.6 cm
^CBye!