Im ersten Halbjahr der Einführungsphase (E1) des Beruflichen Gymnasiums für den Schwerpunkt Technische Informatik ist ein Einführungsprojekt vorgesehen, das sowohl grundlegende praktische Kenntnisse aus dem Bereich der Elektrotechnik inklusive Löten als auch grundlegende Kenntnisse der Programmierung enthält.

Hierzu eignet sich die Arduino-Plattform hervorragend.

Für dieses Einführungsprojekt habe ich eine einfache Leiterplatte entworfen, die mittels LEDs die Lichtzeichenanlage einer Verkehrskreuzung sowie einen separaten Fußgängerüberweg simuliert.

Video zur Demonstration eines Zyklus

Nachfolgend sind die Unterlagen zu diesem Projekt:

Über den 16-poligen Buchsenstecker kann die Leiterplatte mit einem Arduino verbunden werden. Hierbei werden die +5V ebenfalls vom Arduino bezogen. Diese sind für die Taster des Fußgängerüberwegs notwendig.

Ein Arduino-Programm wäre beispielsweise das folgende:

//Initialisierung der einzelnen Leuchdioden und der Fussgängertaster
int A1_led_Rot=1;
int A1_led_Gelb=2;
int A1_led_Gruen=3;
int A2_led_Rot=4;
int A2_led_Gelb=5;
int A2_led_Gruen=6;
int A3_led_Rot=7;
int A3_led_Gruen=8;
int Taster1=20;
int Taster2=21;
//Statusflag für die Erkennung ob die Fussgängertaster betätigt worden sind
int Status_Taster=0;

void setup() 
{
  // Festlegung der PINS, ob es sich um ein Eingang oder ein Ausgang handelt
   pinMode(A1_led_Rot, OUTPUT);
   pinMode(A1_led_Gelb, OUTPUT);
   pinMode(A1_led_Gruen, OUTPUT);
   pinMode(A2_led_Rot, OUTPUT);
   pinMode(A2_led_Gelb, OUTPUT);
   pinMode(A2_led_Gruen, OUTPUT);
   pinMode(A3_led_Rot, OUTPUT);
   pinMode(A3_led_Gruen, OUTPUT);
   pinMode(Taster1, INPUT);
   pinMode(Taster2, INPUT);
  // Festlegung der Programmunterbrechnung bei Betätigung einer der beiden Fussgängertaster   
   attachInterrupt(2, Setze_Status_Taster, RISING);
   attachInterrupt(3, Setze_Status_Taster, RISING);
   
   // Zuerst einmal alle LEDs testen
   TestBoard();
   
  // Zuerst alle Ampeln auf Rot setzen
  // und 2000 ms warten
  digitalWrite(A1_led_Rot, HIGH);
  digitalWrite(A2_led_Rot, HIGH);
  digitalWrite(A3_led_Rot, HIGH);
  delay(2000); 
}

// loop() ist das immer wieder ausgeführte Hauptprogramm
void loop() 
{
  // Phasenwechsel von Rot nach Rot
  // Rot -- Rot/Gelb -- Grün -- Gelb -- Rot
  
  // Ampel 1 bleibt auf Rot
  // Ampel 2 wird Grün und bleibt 5s Grün
  digitalWrite(A2_led_Rot, HIGH);
  digitalWrite(A2_led_Gelb, HIGH);
  delay(2000);
  digitalWrite(A2_led_Rot, LOW);
  digitalWrite(A2_led_Gelb, LOW);
  digitalWrite(A2_led_Gruen, HIGH);
  delay(5000);
  
  // Ampel 1 wird Grün und bleibt 5s Grün
  // Ampel 2 wird Rot
  digitalWrite(A2_led_Gruen, LOW);
  digitalWrite(A2_led_Gelb, HIGH);
  delay(2000);
  digitalWrite(A2_led_Rot, HIGH);
  digitalWrite(A2_led_Gelb, LOW);
  delay(3000);
  
  digitalWrite(A1_led_Rot, HIGH);
  digitalWrite(A1_led_Gelb, HIGH);
  delay(2000);
  digitalWrite(A1_led_Rot, LOW);
  digitalWrite(A1_led_Gelb, LOW);
  digitalWrite(A1_led_Gruen, HIGH);

  
  // A3 darf nur dann Grün werden, wenn A2 Rot ist
  // Überprüfung ob das Statusflag gesetzt worden ist
  // Durch das setzten des Statusflags wird die Füsgänger Ampel auf Grün geschaltet
  if (Status_Taster == 1)
  {
    digitalWrite(A3_led_Rot, LOW); 
    digitalWrite(A3_led_Gruen, HIGH);
  }

  delay(5000);

  if (Status_Taster == 1)
  {
    digitalWrite(A3_led_Gruen, LOW); 
    digitalWrite(A3_led_Rot, HIGH);
    Status_Taster=0;
  }

  // Ampel 1 wird Rot und bleibt 10s Rot
  // Ampel 2 wird Grün
  digitalWrite(A1_led_Gruen, LOW);
  digitalWrite(A1_led_Gelb, HIGH);
  delay(2000);
  digitalWrite(A1_led_Rot, HIGH);
  digitalWrite(A1_led_Gelb, LOW);
  delay(3000);
  
  digitalWrite(A2_led_Rot, HIGH);
  digitalWrite(A2_led_Gelb, HIGH);
  delay(2000);
  digitalWrite(A2_led_Rot, LOW);
  digitalWrite(A2_led_Gelb, LOW);
  digitalWrite(A2_led_Gruen, HIGH);
  delay(5000);
}
// Beim Auslösen des Interrupts wird das Statusflag gesetzt
void Setze_Status_Taster()
{
  Status_Taster=1;
}

void TestBoard()
{
  testA1(LOW);
  testA2(LOW);
  testA3(LOW);
  
  testA1(HIGH);
  delay(2000);
  testA1(LOW);
  
  testA2(HIGH);
  delay(2000);
  testA2(LOW);
  
  testA3(HIGH);
  delay(2000);
  testA3(LOW);
}

void testA1(bool v)
{
  digitalWrite(A1_led_Rot, v);
  digitalWrite(A1_led_Gelb, v);
  digitalWrite(A1_led_Gruen, v);
}

void testA2(bool v)
{
  digitalWrite(A2_led_Rot, v);
  digitalWrite(A2_led_Gelb, v);
  digitalWrite(A2_led_Gruen, v);
}

void testA3(bool v)
{
  digitalWrite(A3_led_Rot, v);
  digitalWrite(A3_led_Gruen, v);
}