PushTheLukas - Air Edition

martin.kiechle's picture

In this weeks Arduino installation, Kiliand and Martin created a little game called PushTheLukas - Air Edition. The goal of the game is to balance a ping pong ball on top of an air stream within a tube by pushing a small blue ball (see youtube video: http://www.youtube.com/watch?v=DJJg9OHGuKk). Every time the ping pong ball stays inside a target area, the player is being awarded credits. The higher the player scores, the larger becomes a random momentum added to the players input which makes balancing the ball more and more tricky.

Materials

  • paper board
  • toilet paper pipes
  • plastic forks
  • three resistors
  • piezo speaker
  • transistor
  • diode
  • wires

Arduino code

int DEBUG = 0;

 
// data
enum notes {c, d, e, f, g, a, b, C, COIN};
int tones[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956, 300};
 
int potPin = 0, sensPin = 1, piezoPin = 7;   // select the input pin for the potentiometer
int motorPin = 9; // select the pin for the Motor
int val = 0;      // variable to store the value coming from the sensor
int sensVal = 0;
int lightThresh = 100;
int timeOut = 3000;
int counter = 0;
int output = 0;
int i = 0;
signed int randomy = 0;
 
void setup() {
  pinMode(piezoPin, OUTPUT);
  Serial.begin(9600);
  randomSeed(analogRead(3));
}
 
void loop() {
  //val = analogRead(potPin) * 0.6084 + 400;    // read the value from the sensor, between 0 - 1024
  val = reMap(analogRead(potPin));
  sensVal = analogRead(sensPin);
  
  analogWrite(motorPin, val/4); // analogWrite can be between 0-255
  
  if(sensVal <= lightThresh){
    if(counter == timeOut){
      counter = 0;
      addPoints();
      playTone(COIN);
    }
    else counter++;
  }
  
  if(DEBUG){  
    Serial.print("Pressure: "); Serial.print(val, DEC);
    Serial.print(" ||  Light sensor: "); Serial.println(sensVal, DEC);
  }
}
 
void playTone(int note){
  for(i = 0; i < 200; i++){
    digitalWrite(piezoPin,HIGH);
    delayMicroseconds(tones[note]-i);
    digitalWrite(piezoPin, LOW);
    delayMicroseconds(tones[note]-i);
  }
}
 
int reMap(int input){ 
  if(input == 0) return 0;
  output = (input  - randomy) * 1.8;
  output = (output > 1023) ? 1023 : output;
  output = (output < 0) ? 0 : output;
  return output;  
}
 
void addPoints(){
  static unsigned int score = 0;
  
  score += 1;
  randomy = random(score*20);
  randomy -= score*10;
  Serial.print(score, DEC);
  Serial.print(";");
  //Serial.println(randomy, DEC); 
  delay(100);
}
 
Score Board
the VB.NET project for the score board is attached to this post
 
0
Your rating: None