Ampelsteuerung mit Arduino Uno

Das selbst entwickelte Ampelmodell besteht aus einer zweispurigen Hauptstraße und einer Nebenstraße. Die Ampel wurde realisiert durch 26 LEDs, 3 Taster und einen Tag-Nacht-Kippschalter. Das Anfahren eines Autos an die Ampel wird mithilfe von Tastern simuliert. So hat man für die linke Spur, für die Nebenstraße und für die Fußgängerampel jeweils einen Taster.

Die LEDs, die sich auf der Platte befinden, werden unterhalb der Platte mittels eines Arduino Uno (Mikrocontroller) angesteuert. Der Arduino selber wird über eine 5V USB-Schnittstelle versorgt, somit könnte man das Modell z.B. an einen PC oder an eine Powerbank anschließen. Da der Arduino UNO allerdings nicht genug PINs besitzt, wurden mit einem Schieberegisterbaustein (Typ 74HC595) zusätzliche Ausgänge bereitgestellt (8 Ausgänge bei 3 Eingängen), somit lassen sich mit einem einzigen Arduino alle LEDs ansteuern. Eine kleine Steckplatte oder Platine wäre empfehlenswert, damit die Bauteile ordentlich verkabelt werden können.

Zum Programmieren braucht man die Arduino-Software, die man online kostenlos herunterladen kann: https://www.arduino.cc/en/Main/Software. Die Programmiersprache unterscheidet sich kaum von Java oder C++, sodass man relativ schnell einsteigen kann. Eine Liste der einzelnen Anweisungen findet man hier: https://www.arduino.cc/en/Reference/HomePage.

Beim Programm hat man anfangs einen void setup() und einen void loop(). Im void setup() müssen die PINs des Arduino definiert werden als Ein- oder Ausgang. Dieser Block wird zu Beginn ein einziges Mal durchgeführt. Der eigentliche Ablauf findet im void loop() statt. Bei einer Ampelsteuerung wird man hauptsächlich mit digitalWrite(PIN,state) und delay(time) arbeiten. Es wäre möglich, allein mit diesen 2 Anweisungen eine automatische Ampelsteuerung zu programmieren. Da allerdings Schieberegister, Taster und ein Tag-Nacht-Schalter verwendet werden, muss das Programm ein wenig umfangreicher aufgestellt sein.

Für den Tag-Nacht-Modus wurde das Programm in 2 verschiedene Blöcke mittels if (state_tag_nacht == HIGH){} und else{}unterteilt. Die Erkennung von state_tag_nacht erfolgt über digitalRead(PIN). Somit hat man einen Block für den Tag-Modus und einen für den Nacht-Modus.

Für das Schieberegister benötigt man eine for-Schleife mit 8 Durchgängen, damit jeder Ausgang im Schieberegister belegt werden kann (serial in, parallel out). Das Ganze sieht dann ungefähr so aus:

int phase_1_13[8] =    {0,0,1,0,0,1,0,1};     //0=LED aus; 1=LED an

digitalWrite(storePin,LOW);

  for (int i=0; i<8; i++) {

  digitalWrite(shiftPin, LOW);

  digitalWrite(dataPin, phase_1_13[i]);

  digitalWrite(shiftPin, HIGH);

}

 digitalWrite(storePin, HIGH);

 

Die Abfrage, ob ein Auto an einer Ampel steht, kann bei diesem Modell mit Tastern erfolgen. Es gibt allerdings ein Problem beim Programm, wenn man einfach nur digitalRead(PIN) für die Abfrage verwendet, da das Programm nur in Schritten durchlaufen wird. Das Programm soll aber sofort erkennen, ob der Taster gedrückt wurde oder nicht und sich dabei den Zustand beim nächsten Umschalten merkt. Deswegen wird die delay(time)-Anweisung durch eine for-Schleife mit einem sehr kleinen Delay (etwa 50ms) ersetzt, da man dann alle 50ms „nachfragen“ kann, ob nun der Taster gedrückt wurde oder nicht. Da der Zustand auch noch gemerkt werden muss, muss mit einer if-Anweisung nachgefragt werden, ob der Taster nun gedrückt wurde oder nicht. Wurde er gedrückt, wird im if-Block ein Boolean auf true gesetzt. Diesen Boolean kann man jetzt an beliebiger Stelle verwenden, um nachzufragen, ob der Taster vorhin nun gedrückt wurde oder nicht. Man darf bloß nicht vergessen, den Wert wieder mit einem false zurückzusetzen, ansonsten wird das Programm immer wieder angeben, dass der Taster gedrückt wurde.

Das Programm für die Ampelschaltung kann man hier finden: https://pastebin.com/cp6B8Q8b

Ampelsteuerung mit Speicherprogrammierbarer Steuerung