Instructables

Simon Game - Xylophone Version

Picture of Simon Game - Xylophone Version
2012-11-08 21.56.14.jpg
A little game interface I'm making..in essence, it will be the simon game....except much harder and xylophone style :)

(For those who don't know, simon game is the following:
http://www.youtube.com/watch?v=4YhVyt4q5HI)

Materials / tools are pretty straight forward...

I used a laser cutter but you can do it manually
Plywood
Acrylic
Arduino UNO
8 Piezo Sensors
8 LEDS

Temporary code has been implemented, missing sound but that will come soon enough

Quick video, day and night 
http://www.youtube.com/watch?v=ZcibT5wFgy4&feature=youtu.be

NOTE: Unless you feel comfortably with coding and playing around with different resistor, I would avise to make this in a larger scale!
Great example: http://www.instructables.com/id/Arduino-Xylophone/ by @audreyobscura


[code]
const int buttonSensor = A5;

int led1 = 5; //LED pins
int led2 = 4;
int led3 = 3;
int led4 = 2;
int turn = 0;
int inputRead = 0;
/*int input2 = LOW;
int input3 = LOW;
int input4 = LOW;*/

int randomArray[50]; //Intentionally long to store up to 100 inputs (doubtful anyone will get this far)
int inputArray[50];


void setup() {

  Serial.begin(9600);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);


  randomSeed(analogRead(0)); //Added to generate "more randomness" with the randomArray for the output function

for (int y=0; y<=99; y++){ //For statement to loop through the output and input functions
   output();
   input();
}

   }
  
void loop() { //Unused void loop(), though for some reason it doesn't compile without this /shrug

}
  
void output() { //function for generating the array to be matched by the player
   
   for (int y=turn; y <= turn; y++){ //Limited by the turn variable
    Serial.println(""); //Some serial output to follow along
    Serial.print("Turn: ");
    Serial.print(y);
    Serial.println("");
    randomArray[y] = random(1, 5); //Assigning a random number (1-4) to the randomArray[y], y being the turn count
    for (int x=0; x <= turn; x++){

      Serial.print(randomArray[x]);

      if (randomArray[x]
== 1) {  //if statements to display the stored values in the array
       digitalWrite(led1, HIGH);
        delay(500);
        digitalWrite(led1, LOW);
        delay(100);
      }

      if (randomArray[x]
== 2) {
       digitalWrite(led2, HIGH);
        delay(500);
        digitalWrite(led2, LOW);
        delay(100);
      }

      if (randomArray[x]
== 3) {
       digitalWrite(led3, HIGH);
        delay(500);
        digitalWrite(led3, LOW);
        delay(100);
      }

      if (randomArray[x]
== 4) {
       digitalWrite(led4, HIGH);
        delay(500);
        digitalWrite(led4, LOW);
        delay(100);
      }
     }
    }
   }
 
 
 
void input() { //Function for allowing user input and checking input against the generated array

   
  
  for (int x=0; x <= turn;){ //Statement controlled by turn count
    /*input1 = digitalRead(switch1);
    input2 = digitalRead(switch2);
    input3 = digitalRead(switch3);
    input4 = digitalRead(switch4);*/

    inputRead = analogRead(buttonSensor);
    //Serial.println(inputRead);
    delay(100);

   
    if (inputRead > 685){ //Checking for button push
      digitalWrite(led1, HIGH);
      //playTone(1915, 200);//Passes tone value and duration of the tone to the playTone function
      delay(200);
      digitalWrite(led1, LOW);
      inputArray[x] = 1;
      delay(50);
      Serial.print(" ");
      Serial.print(1);
      if (inputArray[x] != randomArray[x]) { //Checks value input by user and checks it against
        fail();                              //the value in the same spot on the generated array
      }                                      //The fail function is called if it does not match
      x++;
    }
   
    if ((inputRead > 600) && (inputRead <680)){
      digitalWrite(led2, HIGH);
      delay(200);
      digitalWrite(led2, LOW);
      inputArray[x]
= 2;
     delay(50);
      Serial.print(" ");
      Serial.print(2);
      if (inputArray[x]
!= randomArray[x]
) {
       fail();
      }
      x++;

    }

    if ((inputRead > 535) && (inputRead <590)){
      digitalWrite(led3, HIGH);
      delay(200);
      digitalWrite(led3, LOW);
      inputArray[x]
= 3;
     delay(50);
      Serial.print(" ");
      Serial.print(3);
      if (inputArray[x]
!= randomArray[x]
) {
       fail();
      }
      x++;

    }

    if ((inputRead > 400) && (inputRead <525)){

      digitalWrite(led4, HIGH);
      delay(200);
      digitalWrite(led4, LOW);
      inputArray[x]
= 4;
     delay(50);
      Serial.print(" ");
      Serial.print(4);
      if (inputArray[x]
!= randomArray[x]
) {
       fail();
      
       Serial.print("failed");
      }
      x++;

    }

   }
  delay(500);
  turn++; //Increments the turn count, also the last action before starting the output function over again
}

void fail() { //Function used if the player fails to match the sequence
 
  for (int y=0; y<=5; y++){ //Flashes lights for failure
   digitalWrite(led1, HIGH);
   digitalWrite(led2, HIGH);
   digitalWrite(led3, HIGH);
   digitalWrite(led4, HIGH);
   delay(200);
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
   delay(200);
  }
  delay(500);
  turn = -1; //Resets turn value so the game starts over without need for a reset button
}[/code]
El Colombiano9 months ago
Hi.. Do you have the code to play with sound? thankss
would love to see a video of this!
agomes6 (author)  amandaghassaei1 year ago
I am still working on this but it's shaping up :

http://www.youtube.com/watch?v=ZcibT5wFgy4&feature=youtu.be
cool, looks like you might need to isolate the keys from nearby vibrations a little more?
agomes6 (author)  amandaghassaei1 year ago
threshold was at [8]={50...50} even though I am using different resistor for better differentiation....that's just code, I was just thrilled to share the video with you but as soon as the time allows it i will polish it up...with the simon game on. But for anyone replicating this, i would most definitely advise to make it on a larger scale!! There's a really good xylophone arduino from one of the instructables staff ;)
I was talking more about vibration dampening, using rubber underneath the keys to isolate them. But yeah maybe increasing the threshold would help too
Pro

Get More Out of Instructables

Already have an Account?

close

PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!