Forum: Mikrocontroller und Digitale Elektronik Bester Sensor um Abstand zu (schnell) fallendem Objekt zu messen?


von JanTec (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin Schüler und habe für den Physik Unterricht ein kleines Projekt 
umgesetzt. Wir behandeln das Thema Dynamik, aktuell den freien Fall mit 
Luftwiderstand.
Um da die verschiedenen Einwirkungen von Masse, Fläche usw. zu zeigen, 
habe ich einen Ultraschallsensor (HC-SR04) mit dem Raspi 2 nach oben 
gerichtet und verschiedene Objekte darauf fallen gelassen. Im Anhang 
findet ihr meinen Python (dummerweise Python 2) Code und erste 
Messergebnisse.

Kleine Anmerkung zum Programm: Gnuplot plottet direkt die csv. Datei als 
Zeit-Weg-Diagramm.

Das funktioniert auch alles, allerdings sind die gemessenen Werte zu 
ungenau bzw. es werden zu wenig Messungen währen dem Fall gemacht.

Jetzt zu der eig. Frage:

1. Gibt es einen besseren Sensor für diesen Anwendungszweck?
2. oder kann man evtl. das Programm noch tunen?

Bitte entschuldigt, falls ich mich teils unklar ausgedrückt habe oder 
der Code nicht so gut ist. Ich bin noch am Lernen;)
Bei Rückfragen daher bitte melden - ich freue mich über jeden Tipp!

von Andre (Gast)


Lesenswert?

JanTec schrieb:
> HC-SR04

Kurz gesucht, das soll Modul soll auf maximal 50 Messungen pro Sekunde 
kommen.
Wenn 2m Freifall 0,6 Sekunden dauern, könntest du in der Zeit 30 
Datenpunkte gewinnen. Ob du realistisch auf 30 brauchbare Messungen 
kommst wäre auch noch zu klären. Aber selbst unter Idealbedingungen 
finde ich das etwas wenig?

von g457 (Gast)


Lesenswert?

> 1. Gibt es einen besseren Sensor für diesen Anwendungszweck?

Eine Lichschranke alle x cm fiele mir da ein. Zur Auswertung brauchts 
dann allerdings etwas mehr Echtzeitfähigkeit fürchte ich.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

JanTec schrieb:
> und erste Messergebnisse.
Ein simpler Screenshot im PNG-Format hätte es auch getan, dann könnte 
ich die Daten mit dem Handy auch ansehen...

JanTec schrieb:
> Jetzt zu der eig. Frage:
> 1. Gibt es einen besseren Sensor für diesen Anwendungszweck?
Wir lösen solche Probleme immer mit einer Hochgeschwindigkeitskamera. 
Die kann 2000 Bilder pro Sekunde machen. Ist aber nicht ganz billig. 
Aber die hier kann für kleines Geld schon mal 90 Bilder/s:
http://www.netzmafia.de/skripten/hardware/RasPi/kamera/index.html
Und die hat den Vorteil, dass sie das Timing von sich aus mitbringt, 
denn
JanTec schrieb:
> Raspi 2 ... Python
Das mit der Echtzeitfähigkeit sehe ich hier auch recht spannend. Hast du 
mal gemessen, wie zuverlässig du da z.B. ein 100Hz-Signal einlesen 
kannst. Wieviel Jitter hat dein System?

von Wolfgang (Gast)


Lesenswert?

JanTec schrieb:
> 1. Gibt es einen besseren Sensor für diesen Anwendungszweck?

Dopplerradar

von Jan W. (jantec)


Lesenswert?

so, bin jetzt auch registriert.
Sorry wegen der Tabelle.

Ich habe tatsächlich so eine Pi Cam. Ist eigentlich eine super Idee, die 
ich gar nicht auf dem Schirm hatte. Werde mir das mal genauer anschauen.

Lothar M. schrieb:
> Das mit der Echtzeitfähigkeit sehe ich hier auch recht spannend. Hast du
> mal gemessen, wie zuverlässig du da z.B. ein 100Hz-Signal einlesen
> kannst. Wieviel Jitter hat dein System?

Weiß nicht genau ob ich das richtig verstehe. Ich bin da auf eine 
Messfrequenz von ca. 50Hz gekommen, ohne wirklich große Latenz.

von Hans B. (Gast)


Lesenswert?

...mögliche Alternative:
Ein Foto mit langer Belichtungszeit. Die Beleuchtung erfolgt mit kurzen 
wiederholten Lichtblitzen (Stroboskop) und bildet das fallende Objekt 
mehrfach - in konstanten Zeitabständen auf einem Bild ab.

Wahrscheinlich lässt sich das preiswerter realisieren als eine 
Hochgeschwindigkeitskamera.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jan W. schrieb:
> Weiß nicht genau ob ich das richtig verstehe. Ich bin da auf eine
> Messfrequenz von ca. 50Hz gekommen, ohne wirklich große Latenz.
Das Problem ist das: du hast einen Hardwaretimer, der tatsächlich mit 
10ms Abstand einen Interrupt auslöst:
1
timer      0        10ms        20ms        30ms        40ms ....
2
überlauf            |           |           |           |           |
Normalerweise wird diese Interruptanforderung auch recht zügig 
bearbeitet:
1
timer      0        10ms        20ms        30ms        40ms ....
2
überlauf            |           |           |           |           |  
3
interruptbearb.      #           #           #           #           #
Bis dann das Betriebssystem kommt und noch "wichtigere Dinge" zu tun hat 
oder fertig machen muss (einfach mal im Hintergrund Dateien kopieren, 
Netzwerktraffic aufbauen oder zufällig den USB-Stick einstecken). Dann 
wird auf einmal dein Code mit 5ms Verzögerung bearbeitet. Weil der 
nächste Timerüberlauf wieder pünktlich kommt und der Interrupt wieder 
schnell bearbeitet wird, "stolpert" dein Timing:
1
timer      0        10ms        20ms        30ms        40ms ....
2
überlauf            |           |           |           |           |  
3
interruptbearb.      #                 #     #           #           #
Nun bist du aber bei deinem Messungen von gleichen 10ms Zeitabständen 
ausgegangen und hast aus den 10ms Zeitabständen und dem 
Abstandsdifferenzen die aktuelle Geschwindigkeit ausgerechnet. Klar ist 
das Objekt aber in den realen 15ms und 5ms weiter oder weniger weit 
gefallen und du bekommst dadurch Schwankungen in der Kennlinie.

Probiere das einfach mal aus: toggle aus deinem Programm mit 100Hz einen 
EA-Pin. Schließe an diesen Pin ein digitales Oszilloskop an. Und jetzt 
zeige einen vollen Impulszyklus auf dem Oszilloskop an und stelle die 
Nachleuchtzeit auf "unendlich".

Im Idealfall sollte das am nächsten Morgen so aussehen:
1
      Trigger
2
         V
3
4
         .----------------.                .--------------
5
         |                |                |                 
6
         |                |                |                 
7
         |                |                |                 
8
         |                |                |                 
9
  -------'                '----------------'
Wenn dabei dann einmal der oben beschriebene Fehler aufgetreten ist, 
sieht es z.B. so aus:
1
      Trigger
2
         V
3
4
         .----------------.         .-------.------
5
         |                |         |       |                 
6
         |                |         |       |                 
7
         |                |         |       |                 
8
         |                |         |       |                 
9
  -------'                '---------'-------'
Was du aber vermutlich sehen wirst, ist so etwas:
1
      Trigger
2
         V
3
4
         .------------.........         .........------------
5
         |            |||||||||         |||||||||
6
         |            |||||||||         |||||||||
7
         |            |||||||||         |||||||||
8
  -------'            '''''''''---------'''''''''
Das zeugt dann davon, dass ständig solche "Ungenauigkeiten" aka. Jitter 
auftreten. Dann gilt es abzuschätzen, inwiefern das für die Erfassung 
und die zuverlässigkeit der Messwerte schlecht ist.

Und im schlimmsten Fall passiert es, dass die Linien oben und/oder unten 
ganz durchgehen:
1
      Trigger
2
         V
3
4
         .------------.........---------.........------------
5
         |            |||||||||         |||||||||
6
         |            |||||||||         |||||||||
7
         |            |||||||||         |||||||||
8
  -------'            '''''''''---------'''''''''
Dann ist der Interrupt während eines kompletten Zimerzyklus nicht 
bearbeitet worden und ging "verloren". Das "Übersehen" von 
Interruptanforderungen kann in den allermeisten Fällen nicht toleriert 
werden.

War jetzt viel Text, ist aber auch kein ganz einfaches Thema. Es 
bedeutet lediglich: du musst dein System und seine Grenzen kennen, vor 
du ihm über den Weg traust und den gemessenen Werten glaubst.

von Udo S. (urschmitt)


Lesenswert?

Man könnte natürlich auch einfach größere Messreihen machen. Jeder 
Gegenstand wird aus unterschiedlichen Höhen fallengelassen. Ab diesem 
Zeitpunkt läuft ein Timer, der gestoppt wird wenn der Gegenstand auf ein 
Blech oder Karton fällt. Als Sensor dient ein Mikro.
Einzig sehr leichte Objekte, die keinen lauten Aufprall erzeugen müsste 
man "von Hand" stoppen.

von Georg (Gast)


Lesenswert?

Lothar M. schrieb:
> War jetzt viel Text, ist aber auch kein ganz einfaches Thema

Da erhebt sich die Frage, ob man die Messreihe selbst nicht einem 
einfachen System wie Arduino überlassen sollte, das von vornherein keine 
Probleme mit einem zuverlässigen Echtzeit-Ablauf hat.

Georg

von afran (Gast)


Lesenswert?

Um den Jahrtausendwechsel herum gab es an einzelnen Gymnasien die 
"VideoCom", eine einzeilige CCD-Kamera, mit der man recht bequem die 
gängigen Versuche in Mechanik unter die Lupe nehmen konnte:

- https://www.ld-didactic.com/software/vc-exp-d.pdf

Seitdem bietet der Hersteller wohl ein Nachfolgeprodukt an.

Mich hat damals das Konzept zufriedengestellt: berührungslose Messung 
mit der nötigen Genauigkeit und Präzision.

Mein Vorschlag wäre daher anstelle eines Sensors einfach ein Kamerabild 
– wie Lothar es oben bereits angeregt hat.

Das VideoCom-System konnte 80 Messungen pro Sekunde aufnehmen – von max. 
zwei Markierungen auf dem zu beobachtenden Objekt, wenn ich mich richtig 
erinnere, mit retroflektierender Folie markiert.

Eventuell bleibt dann noch die Frage der Verschlusszeit zu klären: kann 
obige Raspberry-Pi-Kamera bei 90 Bildern/Sekunde bewegte Objekte 
ausreichend scharf genug aufnehmen? Wobei man vermutlich in dem Fall – 
kontrastreiche Markierung vorausgesetzt – bei gleichförmigen Bewegungen 
auch den Start-/Endpunkt dieser Markierung nehmen kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.