Forum

Einloggen | Registrieren | RSS  

RR

E-Mail

17.12.2018,
18:37
 

Arduino oder was? (Elektronik)

Hallo!
Vor einiger Zeit habe ich mal versucht, die Geschwindigkeit der Fahrzeuge in unserer 30 kmh-Zone zu überprüfen, und zwar mit zwei Reflexlichtschranken (Abst. 50 cm), 2 Zählern 16 bit und einer ISEL IO-Karte, Auswertung mit Basic. Das geht auch, aber nur für langsam Fahrzeuge, weil Basic einfach auch zu langsam ist. Was nehme ich da am Besten? Arduino? Kann der Dateien schreiben? Und wie finde ich passende Programmteile in all diesem Libary Gewusel?
Gruß RR

Hartwig(R)

17.12.2018,
21:20

@ RR

Arduino oder was?

Hallo,
bei 2 Lichtschranken liefert eine das Startsignal, die andere das Stoppsignal für einen Zähler. Dann hat selbst Basic alle Zeit, um den Wert auszulesen, umzurechnen und anzuzeigen. Für einigermaßen aussagekräftige Messungen sollte die Verarbeitungszeit keinen oder nur sehr geringen Einfluß auf die Messung haben, also hier deutlich unter 5ms. Also wohl auch der falsche Ansatz.

RR

E-Mail

17.12.2018,
22:09

@ Hartwig

Arduino oder was?

» Hallo,
» bei 2 Lichtschranken liefert eine das Startsignal, die andere das
» Stoppsignal für einen Zähler. Dann hat selbst Basic alle Zeit, um den Wert
» auszulesen, umzurechnen und anzuzeigen. Für einigermaßen aussagekräftige
» Messungen sollte die Verarbeitungszeit keinen oder nur sehr geringen
» Einfluß auf die Messung haben, also hier deutlich unter 5ms. Also wohl auch
» der falsche Ansatz.
Hallo Hartwig, ich hatte Start-Stop Front und Start-Stop Heck mit einem Zeitstempel versehen, um vernünftige Werte vom fehlerbehafteten zu unterscheiden.
Zwischen Front und Heck bleibt da nicht genug Zeit. Mit nur einer Messung geht es, das weiß ich. Du mußt aber dann die zweite unterdrücken, ist auch nicht so einfach.
Einfach ne Pausenzeit ist zu unsauber. Und es sollte in beiden Richtungen funktionieren.
Gruß RR

bastelix(R)

18.12.2018,
01:23

@ RR

Arduino oder was?

Servus,
» Was nehme ich da am Besten? Arduino?
Es gibt da ja ein paar Arduinos, ein Arduino Uno ist ein ATMega328p (8bit 16MHz) ein Arduino Due ist ein SAM3X8E ARM Cortex-M3 (32bit 84MHz), da liegen schon Welten dazwischen.

Nehmen wir mal den Uno (ist günstiger und sollte für deine Anforderungen reichen), ein Mini würde es auch tun, ist der gleiche µC, nur kompaktere Platine. Vorausgesetzt, dein Aufbau mit den Lichtschranken funktioniert prinzipiell und es liegt nur am Basic-Code oder der aktuell verwendeten Hardware.

» Kann der Dateien schreiben?
Du kannst ein Shield oder ein Breakout-Board mit einem SD-Karten-Slot verwenden um die Daten zu speichern. Alternativ könntest du auch etwas mit LAN oder WLAN verwenden, was aber teuer wird.
Ich würde ein SD-Breakout-Board empfehlen (z.B. https://www.adafruit.com/product/254 gibt auch günstigere Alternativen). Die Lib für das SD-Karten-Modul gehört zu den Standard-Libs https://www.arduino.cc/en/Reference/SD (müsste eigentlich mit der Arduino IDE ausgeliefert werden).

Dann verwendest du für jede Lichtschranke einen eigenen Interrupt-Handler der bei jedem Auslösen die aktuelle Systemzeit ( https://www.arduino.cc/reference/en/language/functions/time/millis/ ) im RAM speichert. Wenn das Fahrzeug beide Lichtschranken passiert hat berechnest du anhand der gespeicherten Zeitstempel die Dauer der Unterbrechung pro Lichtschranke. Ich denke das ist dir soweit von deinem Basic-Programm bekannt. Wichtig ist nur, dass du die Berechnung nicht im Interrupt-Handler machst, sondern in der Main-Loop und dabei auch berücksichtigst, dass unter Umständen während der Berechnung schon ein weiterer Interrupt ausgelöst werden kann. Spontan würde ich eine Round-Robin-Datenstruktur zum speichern der Triggerzeigen je Lichtschranke verwenden. Die berechneten Werte kannst du dann auf der SD-Karte speichern (das ist der Zeitaufwändigste Teil pro Messung).

Falls du Lust hast, kannst du auch noch ein RTC-Breakout verwenden um die Messwerte mit Datum und Uhrzeit zu speichern. Für die ersten Versuche würde ich das aber weglassen (vor allem weil Arduino für dich ein neues Thema zu sein scheint)

RR

E-Mail

18.12.2018,
14:48

@ bastelix

Arduino oder was?

Danke für die ausführliche Antwort, ich denk mal drüber nach. Eine Frage noch: 50km/h sind etwa 35 ms/halber meter, Faktor 10 schneller wäre gut für die Genauigkeit. Kann der so schnell? Gruß RR

bastelix(R)

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


@ RR

Arduino oder was?

» 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

RR

E-Mail

18.12.2018,
23:45

@ bastelix

Arduino oder was?

Also nochmal vielen Dank für Deine Ausführungen. Wenn ich das Projekt weiter verfolge, muß ich noch viel lernen, programmiermäßig,
erst mal klein anfangen, Überholen können sie sich nicht in unserer Straße, das fällt schon mal weg. Auf Deine anderen Hinweise
komme ich vielleicht mal zurück, wenn ich so weit bin.
Gruß RR

Hartwig(R)

19.12.2018,
13:29

@ RR

Arduino oder was?

Hallo,
wenn auch etwas verzögert, antworte ich nochmal. Zur Softwarelösung hat Bastelix eigentlich alles gesagt - durch Nutzung der Interrupts werden durch den Programmablauf bedingte Verzögerungen weitgehend eliminiert. Dann könnte Dein Projekt evtl. auch mit Basic umsetzbar sein. Da wir Deine Hardware nicht kennen, ist das aber schwer zu sagen.
Die andere Lösung bestünde darin, die grundlegende Messung mit hinter den Sensoren liegender Hardware umzusetzen und den Messwert in Form von Rohdaten an den µC zu geben und dort auszuwerten, umzurechnen und zu speichern. Wahrscheinlich müsstest Du Dich dafür auch noch in die Elektronik tiefer einarbeiten, also wird für Dich der von Bastelix vorgeschlagene Lösungsweg eher zum Ziel führen.
Grüße
Hartwig