Ich hab einen RPi3b und versuche eine Entfernungsmesserung durchführen zu können. Dafür hab ich den folgenden Ultraschallsensor gekauft:
HC-SR04. Der funktioniert so, dass der TRIGGER-Pin kurz ein High bekommt und man dann beim ECHO-Pin die Dauer des highs misst. Diesen Wert muss man mit der Schallgeschwindigkeit multiplizieren und halbieren, das sollte dann die Distanz sein.
Das Ganze klappt insofern nicht, dass die Distanzen zw. 4 und 250 cm schwanken, unabhängig ob der Sensor ins 'leere' zielt oder ich etwas unmittelbar davor stelle.
Aus dem Datenblatt geht hervor:
Mir ist klar, dass das sehr günstiges Zeugs ist, ich erwarte keine mm Genauigkeit, aber schon halbwegs realistische Werte. Ich kann auch 30 mal messen und dann den Median Wert nehmen, das wäre kein Problem, ich will eig. nur die Wassertankhöhe meiner Kaffeemaschine messen.berührungslose Messungen in einem Bereich von 20 bis 4000 Millimeter mit einer Genauigkeit von 3 Millimetern durchführen.
Weil man laut Datenblatt 5V braucht hab ich einen Spannungswandler, dessen Pins wie folgt belegt sind: Seite 3 oben
Dementsprechend ist die Verdrahtung wie folgt:
- Pin 1,4,7 kriegen Ground (vom Level shifter), 14 kriegt 5V (pin 2 vom RPi).
- Der GPIO4 geht in Pin 2 (1A) der Output 1Y davon geht zum Trigger Pin des Sensors.
- GPIO17 (ECHO-Pin, als Input definiert) geht in Pin5 (2A) und Output 2Y ist mit dem ECHO-Pin vom Sensor verbunden.
Ich bin mir nicht 100% sicher, ob das mit dem ECHO richtig ist: Muss das 5V High vom Sensor in den 'Output 2Y' vom Wandler, der dann das ganze in 3,3V in 2A ausspuckt?
Hoffe das ganze war halbwegs verständlich.
Nun noch zum Code:
Code: Alles auswählen
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
TRIG = 4
ECHO = 17
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.output(TRIG, False)
time.sleep(2)
try: # Main program loop
while True:
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
while GPIO.input(ECHO) == 0:
...
pulse_start = time.time()
while GPIO.input(ECHO) == 1:
...
pulse_end = time.time()
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 17150
distance = round(distance, 2)
print("Distance is {} cm".format(distance))
time.sleep(2)
# Scavenging work after the end of the program
except KeyboardInterrupt:
...
finally:
GPIO.cleanup()
Vielen Dank!