Hallo zusammen. Ich habe einen Arduino gekauft um in die Mikrocontrollertechnik einzusteigen, da mich das Thema fasziniert. Nach dem Ansteuern von LEDs, die erfolgreich geblinkt haben und Versuchen mit dem A/D-Wandler (Einlesen einer Spannung eines Potis) was auch geklappt hat, möchte ich mich an ein kleines Projekt wagen, was Ampeln auf meiner Eisenbahn steuern soll. Es gibt auf der Modelleisenbahn drei Verkehrsampeln (mit jeweils 3 LEDs), die ich an die GPIOs des Arduinos (mit vorgeschalteten Transistoren) angeschlossen habe. Diese leuchten auch entsprechend, wenn man sie einzeln ansteuert. ABER: Es sollen die drei Ampeln unterschiedliche Ampelphasen gleichzeitig durchlaufen. Das heißt, dass Ampel-1 z.B. 5 Sek Grünphase, Ampel-2: 10 Sek Grünphase usw. haben soll. Leider ist mir diese "Gleichzeitigkeit" neu und ich weiß nicht, wie ich das realisieren kann, um das Ganze in die arduino-typische loop()-Funktion zu packen. Denn dort werden ja schließlich alle Befehle von "oben nach unten" abgearbeitet und nicht parallel. Benötige ich da so etwas wie mehrere parallel laufende Threads? Könnt ihr mir einen Gedankenanstoß geben, wie ich das Ganze realisieren kann? Bei wiegesagt einer Ampel ist es ja kein Problem, dass sie entsprechend der vorgegebenen Zeiten schaltet. Wie aber sieht es bei mehreren Ampeln aus, die gleichzeitig arbeiten sollen? Danke!
https://www.mikrocontroller.net/articles/Statemachine Hier ist eine Ampelsteuerung sogar als Beispiel. Also das Stichwort ist StateMachine
Ludwig schrieb: > Leider ist mir diese "Gleichzeitigkeit" neu und ich weiß nicht, wie ich > das realisieren kann, um das Ganze in die arduino-typische > loop()-Funktion zu packen. Denn dort werden ja schließlich alle Befehle > von "oben nach unten" abgearbeitet und nicht parallel. Ja, aber sehr schnell, und Mikrosekunden spielen bei Ampeln keine Rolle. If you can't use delay(): https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Ok... jetzt müsste ich nur noch erkennen, wie ich das Ganze "Gelernte" auf mein Problem reflektiere. Anders gesagt: Irgendwie hilft mir das auch nicht weiter.
Ludwig schrieb: > jetzt müsste ich nur noch erkennen, wie ich das Ganze "Gelernte" auf > mein Problem reflektiere. > > Anders gesagt: Irgendwie hilft mir das auch nicht weiter. Ach, du hast also in weniger als eineinhalb Stunden die beiden dir genannten Tutorials durchgearbeitet? Dann solltest du es noch mal etwas langsamer und gründlicher tun.
Da hilft nur Bildung: https://de.wikipedia.org/wiki/Zeitschlitz Statemachine wurde schon erwähnt. Funktionspointer sind praktisch, aber didaktisch erstmal wenig sinnvoll: http://playground.arduino.cc/Deutsch/HalloWeltMitInterruptUndTimerlibrary Lieber einfach erstmal States definieren und in der main-loop() jeweils LEDs an- oder abschalten je nachdem was der aktuelle State (bzw. die states) grade sagt. Also sowas wie Ampel1.state = LEDStates.green; und dann in der main sowas wie LEDGreen.enable(Ampel1.state == LEDStates.green); wobei LEDGreen in Wirklichkeit einfach ein #define für den GPIO ist an dem die LED dranhängt. Und obs .enable wirklich gibt weiss ich nicht, programmiere kein Arduino.
Ludwig schrieb: > Ok... > > jetzt müsste ich nur noch erkennen, wie ich das Ganze "Gelernte" auf > mein Problem reflektiere. > > Anders gesagt: Irgendwie hilft mir das auch nicht weiter. ...hier eigentlich recht anschaulich und mit "flacherer Lernkurve" und mit Beispielen: https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview
Ludwig schrieb: > Ok... > > jetzt müsste ich nur noch erkennen, wie ich das Ganze "Gelernte" auf > mein Problem reflektiere. Erkläre mal in deinen Worten was eine Statemachine ist und dann überlege dir wie man diese auf eine Ampel anwendet.
Ludwig schrieb: > Anders gesagt: Irgendwie hilft mir das auch nicht weiter. Aber in dem Artikel, den Cobolt verlinkt hat, ist die Ampel doch schon drin. Das einzige, was du noch hinzufügen musst, ist die Funktion 'Ampel1(FARBE)' und 'Ampel2(FARBE)', das löst du mit DigitalWrite() in der Arduino Welt. Du solltest lediglich daran denken, das du die anderen LED löschst, die gerade nicht dran sind, das wird im Artikel nicht explizit erwähnt.
:
Bearbeitet durch User
Ludwig schrieb: > jetzt müsste ich nur noch erkennen, wie ich das Ganze "Gelernte" auf > mein Problem reflektiere. > > Anders gesagt: Irgendwie hilft mir das auch nicht weiter. Dann bist du wohl einfach intellektuell oder von der Motivation her nicht hinreichend ausgestattet zum Programmieren. ->Gib' es besser auf. Es wird dir nur Frust bereiten, denn du wirst gezungen, deine Grenzen zu erkennen und zu akzeptieren. Oder wirklich mal zu LERNEN. Beides ist offensichtlich ein wenig aus der Mode...
@Georg M. (g_m)
>Youtube-Video "Ampelsteuerung mit einem AtMega16"
Eines der Millionen schlechten Youtube-Videos, auch aus Amateursicht.
Er erkläert zwar WAS die Steuerung macht, aber nicht WIE sie es macht.
Und damit ist der Information- und Lehrinhalt nahe Null. Es gibt auch
keine Links auf den Quelltext, Schaltplan etc.
Ich habe zwar einen Arduino, habe ihn aber bisher noch nie programmiert - leider! > Leider ist mir diese "Gleichzeitigkeit" neu und ich weiß nicht, wie ich > das realisieren kann, um das Ganze in die arduino-typische > loop()-Funktion zu packen. Denn dort werden ja schließlich alle Befehle > von "oben nach unten" abgearbeitet und nicht parallel. > > Benötige ich da so etwas wie mehrere parallel laufende Threads? Das wäre eine Möglichkeit. Die Fehlersuche bei mehreren Threads ist aber aufwendiger. Ich würde diese Lösung vermeiden wollen. > Könnt ihr mir einen Gedankenanstoß geben, wie ich das Ganze realisieren > kann? Ja, per Terminkalender. Du brauchst dafür einen fortlaufenden Zeitgeber. Du verwaltest Deine Modellbahnampeln mit einer Tabelle. Jede Zeile enthält folgende Information (Alle Zeiten in Sekunden) 1 Dauer der Rotphase 2 Dauer der Gelbphase 3 Dauer der Grünphase 4 Dauer der Gelbphase 5 Startzustand beim Neustart der Modellbahnanlage :) (1,2,3 oder 4) 6 aktueller Phasenstatus: (1,2,3 oder 4) 7 nächster Umschaltzeitpunkt (Beim Neustart alles Null) Du durchläufst Deine Tabelle immer wieder von oben nach unten. Im ersten Durchlauf berechnest Du Punkt 7, basierend auf Punkt 5. Dann vergleichst Du, ob Dein "Sekundentimer" größer oder gleich dem Umschaltzeitpunkt (Spalte 7) ist. Wenn ja, schaltest Du die Ampelfarbe um in die nächste Phase (nach 4 kommt 0, als (x+1) MOD 5 rechnen) und rechnest den nächsten Umschaltzeitpunkt aus und schreibst ihn in Spalte 7. Du durchläufst die Tabelle immer wieder von oben nach unten. Der Arduino sollte so schnell sein, dass das Auge das sequentiellen Umschalten der Ampeln nicht wahrnehmen kann. Sollte das doch der Fall sein, packst Du zusammenhängende Ampeln, z.B. von einer Kreuzung in der Liste untereinander. > > Bei wiegesagt einer Ampel ist es ja kein Problem, dass sie entsprechend > der vorgegebenen Zeiten schaltet. Wie aber sieht es bei mehreren Ampeln > aus, die gleichzeitig arbeiten sollen? Vergiss die absolute Gleichzeitigkeit, das wurde auch oben schon gesagt.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.