/*For six targets with 0,1,2 on one shaft, and 3,4,5 on the other with 0 and 3 
in the same position, 1 and 4 in the same postion and 2 and 5 in ths same position.

*/

#include <Servo.h>

int n;//first random number
int m;//second random number
int threshold=30;
int targets=6;
int score=0;//initialized to 0
int time=3000;//time to hit target once it pops up
int TIME=60000;//total time for game==1 minute--and yes 60000 fits into an int
int TIME_Played=0;//initialize time played

Servo servo0;//servo names
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

int anodePin=4;//all led's use this pin for their long leg

int cathodePin0=14;//A0
int cathodePin1=15;//A1
int cathodePin2=16;//A2
int cathodePin3=17;//A3
int cathodePin4=18;//A4
int cathodePin5=19;//A5

int delaysn=0;  //starts all delays at 0
int delaysm=0;

int tworandom(int i);//random funcition generator for second number
int initialize(int servonum);//sets initial servo positons
int moves(int servonum);//pops up servos
int reads(int led);//read led
int readsavg(int n, int led);//takes average of n readings for led
int reset(int servonum);//initialize current servo, reset delay of current servo, assign a new serov to n or m
int scores(int servonum);//score when you shoot (shooting aliens==++)
int scored(int servonum);//score when you don't shoot (don't shoot humans==++)

void setup()
{
  
  //deactivates pullup resistors
  _SFR_IO8(0x35) |= 4;
  _SFR_IO8(0x35) |= (1<<4); 
  
  randomSeed(analogRead(0));//select start point of random number chain before setting pin A0 to output--reading analog should allow for random start in chain--wiring led to there may get rid of random start--will just cause every game to be the same--will change for final design, but for this week it would not be a problem
  n=random(targets);  //choose first random number
  m=tworandom(n);  //choose second random number based off of the first
  
  
  pinMode(anodePin, OUTPUT);  //set pins associated with led light sensors to outputs
  pinMode(cathodePin0, OUTPUT);
  pinMode(cathodePin1, OUTPUT);
  pinMode(cathodePin2, OUTPUT);
  pinMode(cathodePin3, OUTPUT);
  pinMode(cathodePin4, OUTPUT);
  pinMode(cathodePin5, OUTPUT);
  
  digitalWrite(anodePin, HIGH);
  digitalWrite(cathodePin0,LOW);
  digitalWrite(cathodePin1,LOW);
  digitalWrite(cathodePin2,LOW);
  digitalWrite(cathodePin3,LOW);
  digitalWrite(cathodePin4,LOW);
  digitalWrite(cathodePin5,LOW);
  
  servo0.attach(3);  //use all of the pwms pins
  servo1.attach(5);
  servo2.attach(6);
  servo3.attach(9);
  servo4.attach(10);
  servo5.attach(11);
  
  servo0.write(90);  //initialize servo positons
  servo1.write(90);
  servo2.write(90);
  servo3.write(90);
  servo4.write(90);
  servo5.write(90);
  
  Serial.begin(9600);//set up serial communication to monitor
}

void loop(){
  Serial.print("n and m are ");
  Serial.print(n);
  Serial.println(m);//*/
  moves(m);//pop up the first two servos
  moves(n);
  int number=3;//number of times led is read
  //all delays initialized at 0 or reset to 0 in "reset"
  delaysm=delaysm+(2*number*50);//each read delays 50 so n times 50 is full delay
  delaysn=delaysn+(2*number*50);
  //read sensors
  int i = readsavg(number, (n+14));//servo will be 0 to 5 but led is 14 to 19
  int j = readsavg(number, (m+14));
  /*Serial.print("i and j are");
  Serial.print(i );
  Serial.println(j);//*/
  if((i<threshold)&&(i>0)){
    //you hit target n
    Serial.println("You hit n");
    scores(n);
    int sameasbeforen=n;
    while(n==sameasbeforen){
      n=reset(n,m);
    }
    /*delaysn=0;
    initialize(n);
    n=tworandom(m);//*/
  }
  if((j<threshold)&&(j>0)){
    Serial.println("You hit m");
    //you hit target m
    scores(m);
    /*delaysm=0;
    initialize(m);
    m=tworandom(n);*/
    while(m==sameasbeforem){
      m=reset(m,n);
    }
  }
  if((delaysn>time)&&(delaysm>time)){
    //Serial.println("ran out of time 0");
    /*delaysn=0;
    delaysm=0;
    initialize(m);
    initialize(n);
    n=random(targets);  //choose first random number
    m=tworandom(n);  //choose second random number based off of the first*/
    int sameasbeforen=n;
    while(n==sameasbeforen){
      n=reset(n,m);
    }
    int sameasbeforem=m;
    while(m==sameasbeforem){
      m=reset(m,n);
    }
  }
  if(delaysn>time){
    //Serial.println("ran out of time 1");
    //you ran out of time for target n
    scored(n);
    /*delaysn=0;
    initialize(n);
    n=tworandom(m);//*/
    int sameasbeforen=n;
    while(n==sameasbeforen){
      n=reset(n,m);
    }
  }
  if(delaysm>time){
    //Serial.println("ran out of time 2");
    //you ran out of time for target m
    scored(m);
    /*delaysm=0;
    initialize(m);
    m=tworandom(n);*/
    int sameasbeforem=m;
    while(m==sameasbeforem){
      m=reset(m,n);
    }
  }
  TIME_Played=TIME_Played+(2*number*50);
  if(TIME_Played<TIME){
    Serial.print("Game over.  Your score is");
    Serial.print(score);
    while(1){
      
    }
  }
}
//////////////////////
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////
///////////////////////////////////////////////////////
int tworandom(int i){
  //chooses second random number that is not the same as the fist or equal to that of its pair
  int k=0;
  k=random(targets);//not redundant--if i is not in the first position setting m to 0 at first would cause it to be 0 almost always
  while(((k-3)==i)||(k==i)||((k+3)==i)){
    k=random(targets);
  }
  return k;
}

int initialize(int servonum){
  //set all servos to an inital 90 degrees.  Allows for rotation in either direction of 90 degrees
  if(servonum==0){
    servo0.write(90);
  }
  if(servonum==1){
    servo1.write(90);
  }
  if(servonum==2){
    servo2.write(90);
  }
  if(servonum==3){
    servo3.write(90);
  }
  if(servonum==4){
    servo4.write(90);
  }
  if(servonum==5){
    servo5.write(90);
  }
  delay(150);
}

int moves(int servonum){
  //moves servo to the popped up positon--all move same way because we can just flip the servo
  if(servonum==0){
    servo0.write(0);
  }
  if(servonum==1){
    servo1.write(0);
  }
  if(servonum==2){
    servo2.write(0);
  }
  if(servonum==3){
    servo3.write(0);
  }
  if(servonum==4){
    servo4.write(0);
  }
  if(servonum==5){
    servo5.write(0);
  }
  delay(150);
}

int reads(int led){
  int val = 0;
  int vcc=anodePin;
  int ground=led;
  
  //already emitting light
  
  delay(50);
  
  //switch potentials -- charge LED to -5V
  digitalWrite(vcc,   LOW);
  digitalWrite(ground, HIGH);
  
  //measure time for potential to equalize (for cathode to be LOW)
  
  //switch pinmode 
  pinMode(ground,  INPUT);
  
  //measure time it takes for cathodePin to go to zero
  //this value probably depends on the chip clock or something
  while(digitalRead(ground) != 0){
    delay(1);
    val++;      
  }
  pinMode(ground,  OUTPUT);
  
  digitalWrite(vcc,   HIGH);
  digitalWrite(ground, LOW);
  //Serial.println(val, DEC);
  return val;
}

int readsavg(int n, int led){
  int val=0;
  for(int i=0; i<n; i++){
    val=val+reads(led);//read n times and sum
  }
  val=val/n;//divide by n for average
  return val;
}
  
int reset(int servonum1, int servonum2){
  if(servonum1==m){
    initialize(m);//lower servo m
    delaysm=0;//reset delay before setting new m
    int j=tworandom(servonum2);//choose new m based on n
    /*Serial.print("the new m is");
    Serial.println(m);
    Serial.print("the old n was");
    Serial.println(servonum2);//*/
    return j;
  }
  if(servonum1==n){
    initialize(n);//lower servo n
    delaysn=0;//reset delay before setting new n
    int j=tworandom(servonum2);//choose new n based on m
    /*Serial.print("the new n is");
    Serial.println(n);
    Serial.print("the old m was");
    Serial.println(servonum2);//*/
    return j;
  }
}  

int scores(int servonum){
  //scores==score when shot
  if((servonum==0)||(servonum==1)||(servonum==2)){
    //servos 0, 1, 2 are humans
    score--;//don't shoot humans 
  }
  if((servonum==3)||(servonum==4)||(servonum==5)){
    //servos 3, 4, 5 are aliens
    score++;//do shoot aliens
  }
}
int scored(int servonum){
  //scored==scored when did not shoot
  if((servonum==0)||(servonum==1)||(servonum==2)){
    //servos 0, 1, 2 are humans
    score++;//good you did not shoot the humans
  }
  if((servonum==3)||(servonum==4)||(servonum==5)){
    //servos 3, 4, 5 are aliens
    score--;//baka, you forgot to shoot the aliens--have you seen Independence Day?
  }
}
 
classes/designandproto/me155a_groups/first_generation_of_the_game.txt · Last modified: 2013/02/25 22:58 by nmitchell
 
Except where otherwise noted, content on this wiki is licensed under the following license:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki