Projekt Laser Maze – Phase 1

Mein kleines Laser Maze Projekt für Kindergeburtstage und andere Events, wie zum Beispiel Halloween nimmt Gestalt an.

Ziel ist es, verschiedene Laserhindernisse im Raum zu verteilen. Wie bei den Professionellen Laser Maze Spielen, sollen die Laser nach einer Unterbrechung auch abgeschaltet werden. So wird verhindert, dass jemand dauerhaft in den Laser schaut.

Das Spiel soll durch das drücken eines Schalters gestartet werden. Wenn 3 Laser gerührt werden, soll das Spiel zu ende sein. Gewonnen ist, wenn ein Buzzer an Ende des Parcours gedrückt wird.

In der erweiterten Stufe sollen auch parallel einige Scheinwerfer das Spielgeschehen unterstützen. Dafür nutze ich dann eine DMX Erweiterung.

Das ganze Realisiere ich mit einem Arduino. In meinem Fall einem Mega 2560, da dieser ausreichend Anschlussmöglichkeiten verfügt. Die Einkaufsliste ist am Ende.

Lasern und PTC

In der Prototypenphase nutze ich auf dem Breadboard normale LEDs und Taster. Da ich genug Speicher frei habe, ist der Code so klar wie möglich gehalten und möglichst ohne Schleifen.

erster Prototyp

Die erste Prototypenphase wurde nun erfolgreich beendet.
Damit später das DMX Shield auf den Arduino passt, habe ich nur die weiteren Ports des Mega genutzt.

Die LEDs, die ich zum Testen nehme, brauchen noch einen Vorwiderstand. Die Laserdioden haben den gleich mit dabei und können direkt mit 5V betrieben werden. Anstelle der PTCs habe ich hier noch Taster, welche ich mit Pull Up Widerständen hochziehe.

Im Code sieht das ganze dann so aus:

/*
 * Laser Maze Project 2020
 * 
 * Taget 10 Laser should hit the PTC
 * if PTC is hit, Laser will be deactivated
 * if 3 PTC are hit, game over
 * if buzzer is hit, game win
 * 
 * Code on Mega 2560
 * 
 */

/* Initialisierung 10 Laser */
int laser0 = 31;
int laser1 = 33;
int laser2 = 35;
int laser3 = 37;
int laser4 = 39;
int laser5 = 41;
int laser6 = 43;
int laser7 = 45;
int laser8 = 47;
int laser9 = 49;

/* Initialisierung 10 PTCs */
int ptc0 = 30;
int ptc1 = 32;
int ptc2 = 34;
int ptc3 = 36;
int ptc4 = 38;
int ptc5 = 40;
int ptc6 = 42;
int ptc7 = 44;
int ptc8 = 46;
int ptc9 = 48;

/* Initalisierung Starter und Buzzer */
int gstart = 22;
int buzzer = 24;

// variable to store the read value
int r_ptc0 = 0;
int r_ptc1 = 0;
int r_ptc2 = 0;
int r_ptc3 = 0;
int r_ptc4 = 0;
int r_ptc5 = 0;
int r_ptc6 = 0;
int r_ptc7 = 0;
int r_ptc8 = 0;
int r_ptc9 = 0;
int r_gstart = 0;
int r_buzzer = 0;

// Game variable
int gcount = 0;
int l0count = 0;
int l1count = 0;
int l2count = 0;
int l3count = 0;
int l4count = 0;
int l5count = 0;
int l6count = 0;
int l7count = 0;
int l8count = 0;
int l9count = 0;
int game_limit = 3; // game is lost after x hits

void setup() {
  // setup
  // sets the digital pin as output
  pinMode(laser0, OUTPUT);
  pinMode(laser1, OUTPUT);
  pinMode(laser2, OUTPUT);
  pinMode(laser3, OUTPUT);
  pinMode(laser4, OUTPUT);
  pinMode(laser5, OUTPUT);
  pinMode(laser6, OUTPUT);
  pinMode(laser7, OUTPUT);
  pinMode(laser8, OUTPUT);
  pinMode(laser9, OUTPUT);

  // sets the digital pin as input
  pinMode(ptc0, INPUT);
  pinMode(ptc1, INPUT);
  pinMode(ptc2, INPUT);
  pinMode(ptc3, INPUT);
  pinMode(ptc4, INPUT);
  pinMode(ptc5, INPUT);
  pinMode(ptc6, INPUT);
  pinMode(ptc7, INPUT);
  pinMode(ptc8, INPUT);
  pinMode(ptc9, INPUT);

  // set Input for Gamecontroll
  pinMode(gstart, INPUT);
  pinMode(buzzer, INPUT);
}

void loop() {
  // read all input pins
  r_ptc0 = digitalRead(ptc0);
  r_ptc1 = digitalRead(ptc1);
  r_ptc2 = digitalRead(ptc2);
  r_ptc3 = digitalRead(ptc3);
  r_ptc4 = digitalRead(ptc4);
  r_ptc5 = digitalRead(ptc5);
  r_ptc6 = digitalRead(ptc6);
  r_ptc7 = digitalRead(ptc7);
  r_ptc8 = digitalRead(ptc8);
  r_ptc9 = digitalRead(ptc9);
  r_gstart = digitalRead(gstart);
  r_buzzer = digitalRead(buzzer);

  // (re-)start the game
  if(r_gstart == HIGH){
    // Game start code is in a function
    game_start();
  }
  // check if buzzer is hit
  if(r_buzzer == HIGH){
    // Game Win code is in a function
    game_win();
  }
  // Check if Laser is hit
  if(r_ptc0 == LOW){
    // if laser is hit, turn off for safty and gameplay
    digitalWrite(laser0, LOW);
    // Store the information, that the laser is hit
    l0count = 1;
  } 
  if(r_ptc1 == LOW){
    digitalWrite(laser1, LOW);
    l1count = 1;
  } 
  if(r_ptc2 == LOW){
    digitalWrite(laser2, LOW);
    l2count = 1;
  }
  if(r_ptc3 == LOW){
    digitalWrite(laser3, LOW);
    l3count = 1;
  }
  if(r_ptc4 == LOW){
    digitalWrite(laser4, LOW);
    l4count = 1;
  }
  if(r_ptc5 == LOW){
    digitalWrite(laser5, LOW);
    l5count = 1;
  }
  if(r_ptc6 == LOW){
    digitalWrite(laser6, LOW);
    l6count = 1;
  }
  if(r_ptc7 == LOW){
    digitalWrite(laser7, LOW);
    l7count = 1;
  }
  if(r_ptc8 == LOW){
    digitalWrite(laser8, LOW);
    l8count = 1;
  }
  if(r_ptc9 == LOW){
    digitalWrite(laser9, LOW);
    l9count = 1;
  }

  // check how many lasers are hit
  gcount = l0count + l1count + l2count + l3count + l4count + l5count + l6count + l7count + l8count + l9count;
  if(gcount >= game_limit) {
    // game lost action is in a function
    game_lost();
  }
}

void game_start() {
  // reset game
  gcount = 0;
  l0count = 0;
  l1count = 0;
  l2count = 0;
  l3count = 0;
  l4count = 0;
  l5count = 0;
  l6count = 0;
  l7count = 0;
  l8count = 0;
  l9count = 0;
  
  // DMX start
  // later filled with Code to flash DMX lights
  // flash all laser 2 times
  digitalWrite(laser0, HIGH);
  digitalWrite(laser1, HIGH);
  digitalWrite(laser2, HIGH);
  digitalWrite(laser3, HIGH);
  digitalWrite(laser4, HIGH);
  digitalWrite(laser5, HIGH);
  digitalWrite(laser6, HIGH);
  digitalWrite(laser7, HIGH);
  digitalWrite(laser8, HIGH);
  digitalWrite(laser9, HIGH);
  delay(400);
  digitalWrite(laser0, LOW);
  digitalWrite(laser1, LOW);
  digitalWrite(laser2, LOW);
  digitalWrite(laser3, LOW);
  digitalWrite(laser4, LOW);
  digitalWrite(laser5, LOW);
  digitalWrite(laser6, LOW);
  digitalWrite(laser7, LOW);
  digitalWrite(laser8, LOW);
  digitalWrite(laser9, LOW);
  delay(400);
  digitalWrite(laser0, HIGH);
  digitalWrite(laser1, HIGH);
  digitalWrite(laser2, HIGH);
  digitalWrite(laser3, HIGH);
  digitalWrite(laser4, HIGH);
  digitalWrite(laser5, HIGH);
  digitalWrite(laser6, HIGH);
  digitalWrite(laser7, HIGH);
  digitalWrite(laser8, HIGH);
  digitalWrite(laser9, HIGH);
  delay(400);
  digitalWrite(laser0, LOW);
  digitalWrite(laser1, LOW);
  digitalWrite(laser2, LOW);
  digitalWrite(laser3, LOW);
  digitalWrite(laser4, LOW);
  digitalWrite(laser5, LOW);
  digitalWrite(laser6, LOW);
  digitalWrite(laser7, LOW);
  digitalWrite(laser8, LOW);
  digitalWrite(laser9, LOW);
  delay(600);
  
  // start the game all laser on
  digitalWrite(laser0, HIGH);
  digitalWrite(laser1, HIGH);
  digitalWrite(laser2, HIGH);
  digitalWrite(laser3, HIGH);
  digitalWrite(laser4, HIGH);
  digitalWrite(laser5, HIGH);
  digitalWrite(laser6, HIGH);
  digitalWrite(laser7, HIGH);
  digitalWrite(laser8, HIGH);
  digitalWrite(laser9, HIGH);
}

void game_win() {
  // gewonnen
  // all laser off
  digitalWrite(laser0, LOW);
  digitalWrite(laser1, LOW);
  digitalWrite(laser2, LOW);
  digitalWrite(laser3, LOW);
  digitalWrite(laser4, LOW);
  digitalWrite(laser5, LOW);
  digitalWrite(laser6, LOW);
  digitalWrite(laser7, LOW);
  digitalWrite(laser8, LOW);
  digitalWrite(laser9, LOW);
  // DMX win
  // later filled with Code to flash DMX lights
}

void game_lost() {
  // verloren
  // all laser off
  digitalWrite(laser0, LOW);
  digitalWrite(laser1, LOW);
  digitalWrite(laser2, LOW);
  digitalWrite(laser3, LOW);
  digitalWrite(laser4, LOW);
  digitalWrite(laser5, LOW);
  digitalWrite(laser6, LOW);
  digitalWrite(laser7, LOW);
  digitalWrite(laser8, LOW);
  digitalWrite(laser9, LOW);
  // DMX lost
  // later filled with Code to flash DMX lights
}

Als nächstes steht nun der DMX Shield an und anschließend die Umsetzung ins Reallife.

Einkaufsliste: