Forum

Einloggen | Registrieren | RSS  

Arduino oder was? (Elektronik)

verfasst von bastelix(R), 18.12.2018, 22:53 Uhr
(editiert von bastelix am 18.12.2018 um 22:54)

» 50km/h sind etwa 35 ms/halber meter, Faktor 10 schneller wäre gut für die Genauigkeit. Kann der so schnell?
Die Berechnung locker, das sind nur eine Long-Subtraktion und eine Long-Division. Das Speichern auf der SD dauert dagegen realtiev lange, IO ist halt immer teuer.

Das braucht dich bei dem von mir vorgeschlagenen Programm aber nicht zu interessieren, da du mit Interrupts arbeiten kannst ( https://www.arduino.cc/reference/de/language/functions/external-interrupts/attachinterrupt/ ).

Die Lichtschranken hängst du an die Interrupt-Pins des Arduino und schreibst dafür je einen Interrupt-Handler (Interrupt-Service-Routine). Dein Programm läuft ganz normal, berechnet, schreibt auf die SD oder langweilt sich. Dann ändert sich der Pegel am Interrupt-Pin, der normale Programmfluss wird unterbrochen und der Interrupt-Handler für den Pin wird ausgeführt. Danach wird das Programm dort fortgesetzt wo es unterbrochen wurde. Damit geht dir keine Änderung der Lichtschranken verloren, das berechnen der Geschwindigkeit und speichern auf der SD erfolgt dann Zeit-Unkritisch im Hauptprogramm.

In deinem Interrupt-Handler prüfst du nur ob die Lichtschranke unterbrochen wurde oder wieder geschlossen ist und schreibst die aktuelle Systemzeit (in millisekunden) in das Array unterbrechung_begin[schreib_index] bzw. unterbrechung_ende[schreib_index] und zählst den schreib_index für die Lichtschranke hoch und macht das ganze module Array-Länge um beim Überlauf wieder beim ersten Array-Element anzufangen (schreib_index = schreib_index + 1 modulo ARRAY_LAENGE). Fertig. Dauert nur ein paar CPU-Zyklen.

In deinem Hauptprogramm prüfst du ob der schreib_index gleich dem berechnen_index ist. Falls nicht:
1. geschwindigkeit = ( unterbrechung_ende[berechnen_index] - unterbrechung_begin[berechnen_index] ) / strecke_in_mm
2. berechnen_index = (berechnen_index + 1) modulo ARRAY_LAENGE
3. speichere_wert_auf_sd(geschwindigkeit)

Ich hoffe du kannst mir folgen. Falls nicht einfach nachfragen und am besten dazu schreiben wie gut du dich mit Programmieren auskennst und was genau du nicht verstehst.

Mit dem Ansatz, sofern deine Arrays groß genug sind, solltest du sogar die illegalen Autorennen in der Nacht erfassen können (vorausgesetzt die überholen sich nicht grad auf Höhe der Lichtschranken oder bleiben dran hängen ;) )

Wenn der Code nachweislich nicht schnell genug ist, kann man immer noch die kritischen Stellen optimieren. Da geht mit Arduino auch noch einiges. Aber damit sollte man sich erst befassen, wenn es wirklich, und durch Messungen belegt, notwendig ist!
"Premature optimization is the root of all evil" - Donald Knuth



Gesamter Thread:

Arduino oder was? - RR, 17.12.2018, 18:37 (Elektronik)
Arduino oder was? - Hartwig(R), 17.12.2018, 21:20
Arduino oder was? - RR, 17.12.2018, 22:09
Arduino oder was? - Hartwig(R), 19.12.2018, 13:29
Arduino oder was? - bastelix(R), 18.12.2018, 01:23
Arduino oder was? - RR, 18.12.2018, 14:48
Arduino oder was? - bastelix(R), 18.12.2018, 22:53
Arduino oder was? - RR, 18.12.2018, 23:45