Arduino für Einsteiger: Ampelschaltung

Aufbau der Ampelschaltung auf dem Breadboard

Gerade noch rechtzeitig zum Arduino Day 2016 am 02.04.2016 gibt es heute ein kleines Bastelprojekt für kleine (und evtl. auch große) Arduino-Einsteiger:

Mein 10-jähriger Junior unternimmt gerade seine ersten Gehversuche mit dem Arduino Uno. Da er für das in den Codebeispielen der IDE implementierte Projekt ‚Blink‘ (aus eigentlich nachvollziehbaren Gründen) nur mäßige Begeisterung entwickeln konnte, habe ich die simple Aufgabe, eine LED an- und wieder auszuschalten, in ein für Kinder etwas spannenderes Szenario übertragen: Eine Ampelschaltung für eine Auto- Fußgängerampel.

Aufgabenstellung:
Es soll eine Ampelschaltung mit einer Auto- und einer Fußgängerampel nachgebildet werden. An der Fußgängerampel befindet sich ein Knopf, der die Umschaltung der Ampelphase auslöst.

 

Materialliste:

Stückzahl Bauteil Typ Eigenschaften
1 Arduino Uno (Rev3) Typ Arduino UNO (Rev3)
2 LED rot Farbe Rot (633nm), 5 mm
1 LED gelb Farbe Gelb (595nm), 5 mm
2 LED grün Farbe Grün (555nm), 5 mm
1 LED blau Farbe Blau (525nm), 5 mm
6 220Ω Widerstand Toleranz ±5%, 4-Band, Widerstand 220Ω, Beinchenabstand 400 Millimeter
1 Pushbutton

Der Aufbau der Bauteile auf dem Breadboard:

Aufbau der Ampelschaltung auf dem Breadboard
Aufbau der Ampelschaltung auf dem Breadboard

Der Code im Detail:
In den Zeilen 2-4 werden die Integer-Variablen initialisiert, welche die Pin-Belegungen für die LEDs der KFZ-Ampel beinhalten. Eine entsprechend eindeutige Benamung erleichtert die Zuordnung der LED-Funktionen im weiteren Programmverlauf.
Das gleiche Prozedere wiederholt sich in den Zeilen 7 u. 8 für die LEDs der Fußgängerampel, und selbstverständlich müssen auch noch die Pins von Taster und dessen Aktions-LED in Variablen gepackt werden.

Ab Zeile 14 wird dann die Setup-Funktion abgearbeitet. Das geschieht beim Programmstart genau ein Mal. Hier zeigt sich auch, warum es sinnvoll ist, die Pin-Nummern in Variablen zu packen: Zwar könnte man die Pin-Nummern auch direkt bei der Einstellung des Pin-Modus übergeben, aber wer wüsste bei ‚pinMode(12, OUTPUT)‘ und all den Pins wirklich auf Anhieb, welche LED hier gemeint ist.
Interessant ist in der Funktion Zeile 22. Da der Arduino Uno intern über einen PullUp-Widerstand verfügt, muss dieser nicht in der Schaltung eingebaut werden. Stattdessen wird die Software-seitige Nutzung mit dieser Programmzeile angemeldet.

Ab Zeile 26 geht es dann im Loop-Block, der bis zum Abbruch in einer Endlos-Schleife ausgeführt wird, an die eigentliche Realisierung der einzelnen Signalphasen. Der Grundzustand der Anlage gibt freie Fahrt für die Autos und Rotlicht für die Fußgänger.

In Zeile 36 wird dann der Zustand des Tasters der Fußgängerampel abgefragt. Wurde der Taster betätigt, beginnt die blaue Aktions-LED der Fußgängerampel 5 mal zu blinken um anzuzeigen, dass ein Wechsel der Phase eingeleitet wird.

Zeile 45 läutet eine 2-sekündige Gelb-Phase ein. Dann schaltet die Autoampel auf Rot. Der Delay-Befehl in Zeile 50 gewährleistet eine gewisse zeitliche Pufferzone zur Unfallvermeidung. Erst dann wird in Zeile 53 die 10-sekündige Grün-Phase für die Fußgängerampel geaschaltet.

Ab Zeile 56 wird der bevorstehende Phasenwechsel durch Aktivierung der gelben LED angezeigt, die Fußgängerampel auf rot gestellt und eine 2-sekündige Pufferzeit eingebaut.

Dann kehren die LEDs in ihren ursprünglichen Zustand zurück,… bis der Taster erneut gedrückt wird.

// KFZ-Ampel
int kfz_rot   = 12;
int kfz_gelb  = 11;
int kfz_gruen = 10;

// Fussgaenger-Ampel
int fg_rot    = 9;
int fg_gruen  = 8;

// Taste
int taste     = 2;
int taste_led = 7;

void setup() {
  pinMode(kfz_rot, OUTPUT);
  pinMode(kfz_gelb, OUTPUT);
  pinMode(kfz_gruen, OUTPUT);

  pinMode(fg_rot, OUTPUT);
  pinMode(fg_gruen, OUTPUT);
  
  pinMode(taste, INPUT_PULLUP);
  pinMode(taste_led, OUTPUT);
}

void loop() {
  //KFZ-Ampel auf Gruen schalten
  digitalWrite(kfz_rot, LOW);
  digitalWrite(kfz_gelb, LOW);
  digitalWrite(kfz_gruen, HIGH);
  
  //Fussgaengerampel auf Rot schalten
  digitalWrite(fg_rot, HIGH);
  digitalWrite(fg_gruen, LOW);
    
  if(digitalRead(taste) == LOW){
    //Signalgeber Fussgaengerschaltung aktiviert
    for(int i=0; i<5; i++){
      digitalWrite(taste_led, HIGH);
      delay(500);
      digitalWrite(taste_led, LOW);
      delay(500);
    }
    //KFZ-Ampel auf Rot schalten
    digitalWrite(kfz_gruen, LOW);
    digitalWrite(kfz_gelb, HIGH);
    delay(2000);
    digitalWrite(kfz_gelb, LOW);
    digitalWrite(kfz_rot, HIGH);
    delay(2000);
    //Fussgaengerampel auf Gruen schalten
    digitalWrite(fg_rot, LOW);
    digitalWrite(fg_gruen, HIGH);
    delay(10000);
    //Phasenwechsel ankuendigen
    digitalWrite(kfz_gelb, HIGH);
    digitalWrite(fg_rot, HIGH);
    digitalWrite(fg_gruen, LOW);
    delay(2000);
   }
}

Wer das Beispiel daheim mit dem Nachwuchs ausprobieren möchte, kann sich alle nötigen Dateien hier herunterladen. Natürlich weise ich bei dieser Gelegenheit auch gerne auf die von der FH Potsdam entwickelte Software "Fritzing" hin, die mittlwerweile von der Friends-of-Fritzing-Stiftung weiter gepflegt wird. Damit lassen sich eigene Projekte einfach entwickeln und auch dokumentieren. Das Programm lässt sich gratis hier herunterladen. Die Stiftung freut sich aber auch über eine kleine Spende.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.