Go Down

Topic: Zeitmessung - Konzeptphase (Read 164 times) previous topic - next topic

speerwerfer

Moin zusammen,

ich möchte nach längerer Pause mal wieder ein Projekt mit dem Arduino angehen. Ich habe hier einen Arduino Nano liegen.

Ziel: Ein Freund hat eine Software geschrieben, mit der er Zeitnahmen an der Carrerabahn machen kann. Bisher hat er für den Anschluss an den PC eine fremde Bastellösung genutzt, die nicht weiter zur Verfügung steht. Ich habe Ihm angeboten das mal mit einem Arduino umzusetzen.

Mit dem Arduino soll also eine Startampel nach dem F1 Prinzip geschaltet werden (5 LEDs).
Über 6 Pins des Nano sollen 6 Rundensignale für 6 Spuren erfasst werden (können z.B. Lichtschranken werden) und bei jeder Durchfahrt mit einem Zeitstempel versehen werden (Messgenauigkeit hundertstel Sekunden).

Die Idee ist, den Start in der PC Software auszulösen und per serieller Verbindung an den Nano zu übergeben. Dieser wechselt dann in den Startmodus und schaltet die Startampel durch. Sollte ein Wagen vor der Startfreigabe über die Startlinie gefahren sein, dann wird dies ebenfalls vermerkt. Beim ersten überfahren der Startlinie würde man also für Runde 0 einen Zeitstempel speichern, wenn es ein Frühstart war, dann wird der Zeitstempel negativ sein. Die Daten sollen dann zur weiteren Verarbeitung wieder an den PC zurückgegeben werden.

Soweit kein Hexenwerk. Da es sich um eine Zeitmessung handelt, will ich aber das Timing im Auge behalten. Daher bin ich mir nicht sicher, wie ich das am besten realisiere. Der Nano soll später möglichst noch weitere Schaltungsaufgaben dazubekommen.

Ich würde nun in der Loop nur auf Befehle des PC warten (im Moment ja nur der Start und Rennabbruch bzw. Ende). Die 6 Pins für die Lichtschranke würde ich per PinChangeInterrupt überwachen und entsprechend auswerten. Prellen der Eingänge könnte man in der Software abfangen oder extern in der Schaltung - was meint Ihr? Bei der Rückmeldung an den PC könnte man jetzt auf Anforderung des PC die Daten übermitteln oder immer wenn eine neue Runde gezählt wurde die Daten aktiv an den PC senden -was wäre da besser?

Wie würdet Ihr das ganze angehen? digitalRead() & digitalWrite() sind schon auf der Streichliste :-)

Falls Ihr noch Infos braucht, meldet Euch ...

Martin

michael_x

Quote
Messgenauigkeit hundertstel Sekunden
... dann kannst du problemlos digitalRead nehmen ;)

Wüsste nicht, dass eine Lichtschranke "prellt", aber eine komplette Fehlmeldung sollte mindestens so erfasst werden, dass sie später am PC rausgefiltert werden kann.

Quote
wenn es ein Frühstart war, dann wird der Zeitstempel negativ sein
Das stelle ich mir relativ kompliziert vor. Eine Fehlstart-Kennung (-1) wäre einfacher...

Ansonsten kannst du einfach jede Lichtschranken-Auslösung als Spur+Zeit - Kombination senden.
Deine ISR setzt die Zeit in eine Merkzelle je Spur, und loop hat eine Renn-Runde Zeit, den Eintrag zu senden und die Zelle als gesendet zu markieren.

speerwerfer

Danke für dein Feedback.

Es kann durchaus sein, das es keine Lichtschranke ist, sondern irgendwas anderes. Das könnte durchaus prellen. Aber ich tendiere hier zu einer externen Lösung in der Schaltung.

Bei dem negativen Zeitstempel hab ich mich vielleicht unglücklich ausgedrückt. Der Arduino übermittelt immer  den timestamp einer Messung. Zusätzlich auch den Zeitstempel des Starts. Sollte nun ein Zeitstempel einer Messung vor dem Zeitstempel des Starts liegen, kann die PC Software daraus eine Frühstartzeit errechnen - und die wäre negativ.

Was meinst du mit Merkzelle - ein Array in dem die Zeiten gespeichert sind?

Martin

pylon

Quote
Über 6 Pins des Nano sollen 6 Rundensignale für 6 Spuren erfasst werden (können z.B. Lichtschranken werden) und bei jeder Durchfahrt mit einem Zeitstempel versehen werden (Messgenauigkeit hundertstel Sekunden).
Wenn Du eine Stoppuhr bauen willst, solltest Du einen Arduino mit Quartz verwenden. Der Nano hat einen Resonator, welche typische Abweichungen von ca. einem halben Prozent haben. Bei einer dreiminütigen Fahrt summiert sich das bis zu einer Sekunde hoch. Wenn Du nicht mehrere Runden vergleichen willst, sondern nur die Zeitunterschiede bei gleichzeitigen Fahrten erfassen willst, dann sollte der Nano taugen, ansonsten empfehle ich einen Duemillanove oder einen Mini, um beim gleichen Grössenfaktor zu bleiben.

michael_x

Tja, die Genauigkeit...

Wenn man seinen 50 - Rundenrekord nie wieder hinkriegt, sondern immer mindestens eine Viertelsekunde langsamer ist als damals als man nur 4:59.876 gebraucht hat, dann kann man das gerne auf den inzwischen gealterten Resonator im Nano schieben ;)

Egal ob der Resonator nun einen Fehler von 0,1%  ( 999 ... 1001 millis / sec )  oder 0,5% (995 ... 1005 millis/sec) haben sollte, das schnellere Auto hat immer die kürzere Zeit. Und der "Fehler" sollte relativ konstant sein, bei halbwegs gleichbleibender Zimmertemperatur.


Quote
Was meinst du mit Merkzelle - ein Array in dem die Zeiten gespeichert sind?
Ja, wenn du mit Interrupt arbeiten willst, kannst du das Übertragen zum PC auf keinen Fall in der ISR machen. Dann notiert die ISR nur die Zeit und loop erkennt, dass eine neue Rundenzeit da ist und überträgt sie.

Wenn du das PC-Protokoll einigermassen knapp hältst ( <= 10 Zeichen je Ereignis) sollten alle 6 Spuren "gleichzeitig" in den 64 byte Sendepuffer passen. Dann sind loop-Zeiten stets unter 1 ms. Da müssten deine Autos verdammt schnell sein, damit du einen Lichtschranken-Impuls verpasst ( auch ohne ISR )

Meine Befürchtung, dass die Zeitmessung vor dem Start ( Fehlstart ) kompliziert sei, war übrigens Quatsch.
Sobald die Sartsequenz losgeht, sind die Zeiten ja fest. Das kompliziertere ist höchstens, dass die Zeiten nicht wie sonst üblich unsigned sind, sondern bei -x sec losgehen, und erst später bei 0 die Startfreigabe erfolgt. 

speerwerfer

Danke für die Rückmeldungen!

Ja, es geht im Prinzip nur um die Zeitvergleiche während eines Rennens. In Renncentern und bei festen Bahnen gibts sicher auch Bahnrekorde. Dafür ist das aber nicht in erster Linie gedacht. Davon abgesehen kann man den Sketch ja so machen, das er auch auf einem Mini läuft.

Die Sache mit dem Protokoll und der ISR schau ich mir morgen mal an ...

Martin

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy