Forum: Mikrocontroller und Digitale Elektronik Arduino - Ampelsteuerung


von Ludwig (Gast)


Lesenswert?

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!

von Cobolt (Gast)


Lesenswert?

https://www.mikrocontroller.net/articles/Statemachine

Hier ist eine Ampelsteuerung sogar als Beispiel.

Also das Stichwort ist StateMachine

von Georg M. (g_m)


Lesenswert?

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

von Ludwig (Gast)


Lesenswert?

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.

von Der Andere (Gast)


Lesenswert?

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.

von THOR (Gast)


Lesenswert?

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.

von Jan L. (ranzcopter)


Lesenswert?

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

von Cyblord -. (cyblord)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Georg M. (g_m)


Lesenswert?


von c-hater (Gast)


Lesenswert?

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...

von Falk B. (falk)


Lesenswert?

@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.

von Georg M. (g_m)


Lesenswert?


von Peter M. (r2d3)


Lesenswert?

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
Noch kein Account? Hier anmelden.