Hallo zusammen,
dies ist mein erster Beitrag hier, und daher möchte ich mich und mein Projekt kurz vorstellen. Ich bin von Haus aus Luftfahrtingenieur und nutze den Raspberry Pi 3B V1.2 mit Python um einige Messwerte für meine Masterarbeit zu ermitteln. Ich habe grundlegende Kenntnisse im Programmieren, was man aus dem Studium und kleineren Progrämmchen nebenher halt kennt. Python ist da ja sehr dankbar und leicht verständlich. Mein Kerninteresse gilt also nicht der Elektrotechnik oder dem Rechner an sich, sondern ich interessiere mich für die kleinen Computer als kosteneffizientes Werkzeug vor allem zum Messen und Regeln von Daten und Geräten. Im Rahmen meiner Masterarbeit habe ich vor, die Wasserlasten auf ein kleines Flugboot zu bestimmen. Für die Validierung der Berechnung möchte ich einige Messungen machen, wofür sich der Pi (ggfs. unterstützt von ein paar Arduinos als I/O-Erweiterung) eigentlich ganz gut eignen sollte. Insbesondere, weil man ihn sehr gut im Flugzeug mitnehmen kann und einfach an allen möglichen Stellen unterbringen. Die Wasserlasten möchte ich durch DMS an der Struktur ermitteln, die ich über eine Viertelbrückenschaltung "auslesen" gedenke. Nun muß ich allerdings auch die Eindringtiefe ermitteln, was ich über den HC-SR04 versuchen wollte. Der Abstand zur Wasseroberfläche ließe mich sehr einfach die Eindringtiefe des Flugbootrumpfes berechnen.
Dazu habe ich einem der unzähligen Tutorien folgend einen derartigen Sensor auf einem Breadboard verdrahtet und mit einem Spannungsteiler (1k zwischen Echo und Pin 21, und 2k zwischen Pin 21 und GND) angeschlossen. Das ganze hat auch soweit zufriedenstellend funktioniert, in einem Test im KFZ lieferte mir der unverkleidete Sensor noch bis 160 km/h akzeptable Werte - zwar etwas verrauscht, aber ich habe noch keinen Filter eingebaut.
Da ich bei den höheren Geschwindigkeiten und auch variierenden Distanzen die Temperaturkorrektur als sinnig erachte, habe ich einen 18B20 angeschlossen, der auch tadellos funktioniert. Nach dem Test habe ich das Breadboard auf einer kleinen Lochrasterplatine nachgebaut. Der 18B20 funktioniert auch immernoch tadellos, der HC-SR04 macht allerdings unsinn, und zwar jenseits jeglichen Rauschens.
Zum Vergleich: Der Log vom ersten Test mit Messwerten im Abstand von etwa einer Sekunde in cm angegeben, bei ca. 150 km/h:
80,54682016
82,05561638
80,74308634
79,945755
81,63446188
82,02290535
81,08655214
82,81205893
81,02930784
79,72086668
78,8744688
83,51534605
82,08423853
78,77633572
83,59712362
80,62859774
81,29099607
80,15428782
80,86166382
80,93526363
80,48957586
80,88619709
81,65490627
81,73259497
83,20459127
83,17596912
83,60939026
83,56032372
83,59712362
83,95694494
82,64032602
84,00192261
83,62574577
83,98556709
83,56032372
83,95694494
83,11463594
83,59303474
82,32957125
83,08601379
83,53579044
83,54805708
81,41366243
83,62574577
82,15374947
80,44868708
72,40177393
90,97754955
81,54450655
80,53864241
82,64850378
80,79215288
81,12744093
80,89028597
81,85117245
82,48494864
80,45686483
81,90023899
80,16655445
79,99073267
79,60637808
81,24601841
82,32139349
81,46272898
83,71161222
80,72264194
82,49312639
81,97383881
80,87393045
79,50415611
79,45100069
80,77170849
79,27517891
79,68815565
80,81668615
82,02290535
81,47499561
81,61810637
81,09881878
81,18059635
81,10290766
82,21917152
80,922997
82,77525902
80,8085084
80,54273129
82,09241629
80,45277596
80,73490858
79,75766659
80,09295464
80,53455353
79,83535528
80,72264194
80,23606539
79,83944416
79,92939949
80,91481924
80,44868708
81,63855076
Alles anzeigen
Nach dem Neuverdrahten und der Temperaturkorrektur bekomme ich allerdings so etwas aus einer statischen Messung:
0,830762609
1,025339104
0,550852686
1,29754132
0,624974713
1,627864957
1,852452561
1,320012897
0,46468316
0,53286688
0,37159273
0,833584428
0,197630256
0,335279346
1,308392614
1,392255172
0,70802556
2,054397702
2,125486493
0,512873158
0,852381945
0,67000331
0,377445593
0,839779064
0,251117736
1,157328933
1,239867121
0,49091424
1,515763402
1,686479032
0,714305639
0,453062877
1,371834233
0,403164014
0,787996793
0,169049487
0,209976807
Alles anzeigen
Die Einheit sind diesmal Meter, der Sensor "sieht" in einem Kegel von rund 90° Öffnungswinkel (also 45° zu jeder Seite) nur eine Wand in 28 cm Abstand.
Hier der Code, den ich verwende:
#!/usr/bin/python
#encoding:utf-8
import os, sys, time
import matplotlib.pyplot as plt
import RPi.GPIO as GPIO
logname = "log_2017-07-19.csv"
GPIO.setmode(GPIO.BOARD)
trig = 40
echo = 38
plt.ion()
x=[]
y=[]
GPIO.setup(echo, GPIO.IN)
GPIO.setup(trig, GPIO.OUT)
def measure_temperature():
file= open('/sys/bus/w1/devices/28-0114659262ff/w1_slave')
filecontent = file.read()
file.close()
stringvalue = filecontent.split("\n")[1].split(" ")[9]
temperature = float(stringvalue[2:])/1000
return(temperature)
def measure_distance(temperature):
GPIO.output(trig, True)
time.sleep(0.0001)
GPIO.output(trig, False)
while GPIO.input(echo) == 0: pass
start = time.time()
while GPIO.input(echo) == 1: pass
end = time.time()
distance = (((end - start)/2 * (343 + (temperature * 0.6))))
#distance = (end - start)
return distance
def log_distance(distance, temperature, logname):
with open(logname, "a") as log:
log.write("{0},{1}\n".format(time.strftime("%Y-%m-%d %H:%M:%S"), str(distance)," m ", str(temperature)
))
def graph(distance):
y.append(distance)
x.append(time.time())
plt.clf()
plt.scatter(x,y)
plt.plot(x,y)
plt.draw()
if __name__ == '__main__':
try:
while True:
temperature = measure_temperature()
distance = measure_distance(temperature)
log_distance(distance, temperature, logname)
print("time: ", distance)
time.sleep(0.02)
finally:
GPIO.cleanup()
Alles anzeigen
Hier ist mein Verdrahtungsplan:
https://www.dropbox.com/s/yh8ecs7by9q3…001949.jpg?dl=0
Und hier mein letzter Versuchsaufbau:
https://www.dropbox.com/s/7qf4r2wonzvz…001958.jpg?dl=0
Weitere Informationen:
* Der Spannungsteiler ist bei beiden Messungen identisch, die Widerstände und Verbindungen habe ich alle bis zum Pi-Ende des Flachbandkabels gemessen, die stimmen mit dem Plan überein.
* Es macht keinen Unterschied, ob der HC-SR04 vom GPIO oder von einem Labornetzgerät mit Strom versorgt wird.
* Ich habe 5 Sensoren mit gleichem Ergebnis eingesteckt.
* Mit kurzem oder langem (für die Messungen vorgesehenen) Kabel angeschlossen, der Fehler bleibt der gleiche.
* Die Berechnung der Entfernung aus der Zeit stimmt, der Fehler ist auch bei direkter Ausgabe der Zeit identisch.
* Ein kompletter Neuaufbau des Lochraster-Breakouts brachte keinen Unterschied
* Eine Reduktion des Scripts auf die reine Messung des Ultraschallabstands, also ohne die 1Wire-Temperatur auszulesen, liefert das gleiche Bild der Messdaten.
Da ich ja prinzipiell ein Signal bekomme, ist meine Überlegung, daß meine Hardware gerade nicht das Problem ist. Auch sind wohl die richtigen GPIO-Ports angesteuert, sonst hätte ich sicher garkeine Daten, und ich nehme an, daß nicht gleich 5 Sensoren einen gleichen Baufehler haben. Meine Überlegungen gingen gerade in die Richtung, daß mir mein Python-Skript (oder ggfs etwas anderes) mein Timing versaut, also so dazwischenfunkt, so daß zwar noch die Zeit vom Schalten des ECHO auf high, aber die Zeit beim Schalten des ECHO auf low nicht mehr korrekt genommen wird.
Das ist jetzt etwas mehr Text geworden als ich dachte --- (aber wenn ich schon eine Frage stelle, muß ich mir ja nicht alle Informationen aus der Nase ziehen lassen ). Mir gehen langsam die Ideen aus. Wie gesagt, ich bin hier eher interessierter Laie und kann daher schnell etwas offensichtliches übersehen.
Während ich schreibe kommt mir noch die Idee, daß ggfs der 1Wire selber recht langsam sein kann? Ich lese ja nur eine "Datei" aus, und triggere keine Messung an sich mit meinem Python-Skript, oder? Auch ist mir aufgefallen, daß der Prozessorlast-Monitor schon bei 70% steht, obwohl zu dem Zeitpunkt gerade kein Programm läuft.
Also für Denkansätze oder Hinweise, wie ich mein Problem weiter angehen kann, wäre ich sehr dankbar.
Beste Grüße,
Malte