Introduction: Duel of the Fate

This is a pong game works on Processing with two Arduino potentiometer as controller.

Step 1: Circuit Example

Arduino UNO x 1

Mini breadbaord x1


Potentiometer x 2

Wires x 12

Step 2: Example Code for Arduino

In this project you will need to code in both Processing and Arduino.



For Arduino

int secondSensor = 0; // second analog sensor

int firstSensor = 0; // first analog sensor

int inByte = 0; // incoming serial byte
char val;
void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  pinMode(2, OUTPUT); // digital sensor is on digital pin 2
  
  establishContact(); // send a byte to establish contact until receiver
  // responds
}
void loop()
{
  // if we get a valid byte, read analog ins:
  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.read();
    // read first analog input, divide by 4 to make the range 0-255:
    firstSensor = analogRead(A0) / 4;
    // delay 10ms to let the ADC recover:
    delay(10);
    // read second analog input, divide by 4 to make the range 0-255:
    secondSensor = analogRead(1) / 4;
    // read switch, map it to 0 or 255L
    // send sensor values:
    Serial.write(firstSensor);
    Serial.write(secondSensor);
   
  }
}
void establishContact() {
  while (Serial.available() <= 0) {
    Serial.print('A'); // send a capital A
    delay(100);
  }
}

Step 3: Example Code for Processing

For Proccessing

// This example code is in the public domain.
import processing.serial.*; int bgcolor; // Background color int fgcolor; // Fill color Serial myPort; // The serial port int[] serialInArray = new int[3]; // Where we'll put what we receive int serialCount = 0; // A count of how many bytes we receive int apos, bpos; // Starting position of the player int p1score=0; // Score int p2score=0; boolean start=false; // The status of game boolean p1goal=false; boolean p2goal=false; boolean Gameover=false;
boolean Hit=false;
boolean Goal=false;
ball b;
Letter l;
Number n;
Score s;
boolean firstContact = false;  // Whether we've heard from the
// microcontroller
void setup() {
  size(500, 305); // Stage size
  noStroke();  // No border on the next thing drawn
  // Set the starting position of the ball (middle of the stage)
  apos = width/2;
  bpos = height/2;
  b= new ball();
  l= new Letter();
  n= new Number();
  s= new Score();
  // Print a list of the serial ports, for debugging purposes:
  // I know that the first port in the serial list on my mac
  // is always my FTDI adaptor, so I open Serial.list()[0].
  // On Windows machines, this generally opens COM1.
  // Open whatever port is the one you're using.
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
  
}
void draw() {
  
  background(bgcolor);
  fill(255);
  // Draw the shape
  rect(30, apos, 20, 60);
  rect(470, bpos, 20, 60);
  b.balldraw();
  b.ballcheck();
  s.display();
  s.check();
}
void serialEvent(Serial myPort) {
  // read a byte from the serial port:
  int inByte = myPort.read();
  // if this is the first byte received, and it's an A,
  // clear the serial buffer and note that you've
  // had first contact from the microcontroller.
  // Otherwise, add the incoming byte to the array:
  if (firstContact == false) {
    if (inByte == 'A') {
      myPort.clear();   // clear the serial port buffer
      firstContact = true;  // you've had first contact from the microcontroller
      myPort.write('A');  // ask for more
    }
  } else {
    // Add the latest byte from the serial port to array:
    serialInArray[serialCount] = inByte;
    serialCount++;
    // If we have 3 bytes:
    if (serialCount > 2 ) {
      apos = serialInArray[0];
      bpos = serialInArray[1];
      fgcolor = serialInArray[2];
      // print the values (for debugging purposes only):
      println(apos + "t" + bpos + "t");
      // Send a capital A to request new sensor readings:
      
      
      
      myPort.write('A');
      // Reset serialCount:
      serialCount = 0;
    }
  }
}

Step 4: Example Code for Processing (2)

class ball {
  float x=250; // Starting position of the ball
  float y=150;
  float xspeed=3; // Speed of the ball
  float yspeed=3;
  void balldraw() {
    fill(255);
    rectMode(CENTER);
    rect(width/2, height/2, 6, height);
    rectMode(CORNER);
    if ((keyPressed)&&(key==CODED)) { //Press UP to start the game
      if (keyCode==UP)
      {
        if (Gameover==false) {
          start=!start;
        }
      }
    }
    if (start==false) {
      fill(255);
      x=250;
      y=150;
      ellipse(width/2, height/2, 30, 30);
    }
    if (start==true) {   
      fill(255);
      ellipse(x, y, 30, 30);
      x=x+xspeed;
      y=y+yspeed;
    }
  }
  void ballcheck() {
    if (y<15) {
      yspeed=-yspeed;
    }
    
    
    if (y>290) {
      yspeed=-yspeed;
    }
   
    if (x>485) {
      start=false;
      p1score+=1;
      p1goal=true;
      Goal=true;
     
    }
    if (x<15) {
      start=false;
      p2score+=1;
      p2goal=true;
      Goal=true;
      
    }
    if ((x>45)&&(x<65)&&(y>apos-15)&&(y<apos+75)) {<="" p=""></apos+75))>
      xspeed=-xspeed;
      Hit=true;
    }
    
    if ((x>450)&&(x<470)&&(y>bpos)&&(y<bpos+75)) {<="" p=""></bpos+75))>
      xspeed=-xspeed;
      Hit=true;
    }       

if ((x>40)&&(x<width-<width-40)&&(y style="background-color: initial;">40)&&(y>40)&&(y<height-40)){Hit=false;}</width-40)&&(y>
<width-40)&&(y style="background-color: initial;">}</width-40)&&(y>
<width-40)&&(y style="background-color: initial;">}</width-40)&&(y>
<width-40)&&(y style="background-color: initial;"><p>class Score{</p><p>void display(){
  if(p1score==0){n.Zero(width/2-15,15,2);}
  if(p1score==1){n.One(width/2-15,15,2);}
  if(p1score==2){n.Two(width/2-15,15,2);}
  if(p1score==3){n.Three(width/2-15,15,2);}
  
  if(p2score==0){n.Zero(width/2+12,15,2);}
  if(p2score==1){n.One(width/2+12,15,2);}
  if(p2score==2){n.Two(width/2+12,15,2);}
  if(p2score==3){n.Three(width/2+12,15,2);}
  
}</p><p>void check(){</p><p>  if(p1score==3){
  
  l.P(width/2-42,105,8);
  n.One(width/2+40,105,8);
  
  l.W(width/2-46,180,8);
  l.I(width/2-4,180,8);
  l.N(width/2+38,180,8);
  
  Gameover=true;
  }
   if(p2score==3){
  
  l.P(width/2-42,105,8);
  n.Two(width/2+40,105,8);
  
  l.W(width/2-46,180,8);
  l.I(width/2-4,180,8);
  l.N(width/2+38,180,8);
  
  Gameover=true;
  }</p><p>}</p><p>}</p></width-40)&&(y>

Step 5: Example Code for Processing (3)

For Processing (3)


This part is unnecessary, but I still use this way in my code. If you can use text function, you can ignore this part and fix the code on your own.

 class Letter {
  void A(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x, y, p, p);
    rect(x-p*1, y+p*1, p, p*4);
    rect(x+p*1, y+p*1, p, p*4);
    rect(x, y+p*2, p, p);
  }
  void B(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*5);
    rect(x-p*1, y, p*2, p);
    rect(x-p*1, y+p*2, p*2, p);
    rect(x-p*1, y+p*4, p*2, p);
    rect(x+p*1, y+p*1, p, p*3);
  }
  void C(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y+p*1, p, p*3);
    rect(x, y, p*2, p);
    rect(x, y+p*4, p*2, p);
  }
  void D(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*5);
    rect(x, y, p, p);
    rect(x+p*1, y+p*1, p, p*3);
    rect(x, y+p*4, p, p);
  }
  void E(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p*3, p);
    rect(x-p*1, y, p, p*5);
    rect(x-p*1, y+p*2, p*3, p);
    rect(x-p*1, y+p*4, p*3, p);
  }
  void F(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p*3, p);
    rect(x-p*1, y, p, p*5);
    rect(x-p*1, y+p*2, p*3, p);
  }
  void G(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p*3, p);
    rect(x-p*1, y, p, p*5);
    rect(x-p*1, y+p*4, p*3, p);
    rect(x+p*1, y+p*3, p, p);
  }
  void H(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*5);
    rect(x+p*1, y, p, p*5);
    rect(x, y+p*2, p, p);
  }
  void I(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x, y, p, p*5);
    rect(x-p*1, y+p*4, p*3, p);
    rect(x-p*1, y, p*3, p);
  }
  void J(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p*3, p);
    rect(x+p*1, y, p, p*4);
    rect(x, y+p*4, p, p);
    rect(x-p*1, y+p*3, p, p);
  }
  void K(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*5);
    rect(x, y+p*2, p, p);
    rect(x+p*1, y, p, p*2);
    rect(x+p*1, y+p*3, p, p*2);
  }
  void L(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*5);
    rect(x-p*1, y+p*4, p*3, p);
  }
  void M(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*5);
    rect(x+p*1, y, p, p*5);
    rect(x, y+p*1, p, p*3);
  }
  void N(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*5);
    rect(x+p*1, y, p, p*5);
    rect(x, y, p, p);
  }
  void O(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p*3, p);
    rect(x-p*1, y, p, p*5);
    rect(x+p*1, y, p, p*5);
    rect(x-p*1, y+p*4, p*3, p);
  }
  void P(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*5);
    rect(x-p*1, y, p*3, p);
    rect(x+p*1, y, p, p*3);
    rect(x-p*1, y+p*2, p*3, p);
  }
  void Q(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p*3, p);
    rect(x-p*1, y, p, p*4);
    rect(x+p*1, y, p, p*4);
    rect(x-p*1, y+p*3, p*3, p);
    rect(x+p*1, y+p*4, p, p);
    
  }
  void R(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*5);
    rect(x-p*1, y, p*3, p);
    rect(x+p*1, y, p, p*3);
    rect(x-p*1, y+p*2, p*3, p);
    rect(x, y+p*3, p, p);
    rect(x+p*1, y+p*4, p, p);
  }
  void S(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x, y, p*2, p);
    rect(x-p*1, y+p*1, p, p*2);
    rect(x-p*1, y+p*2, p*3, p);
    rect(x+p*1, y+p*2, p, p*2);
    rect(x-p*1, y+p*4, p*2, p);
  }
  void Y(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*3);
    rect(x+p*1, y, p, p*3);
    rect(x, y+p*2, p, p*3);
  }
  void V(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*1, y, p, p*4);
    rect(x+p*1, y, p, p*4);
    rect(x, y+p*3, p, p*2);
  }
  void W(float x, float y, float p) {
    rect(x-p*1, y, p, p*5);
    rect(x+p*1, y, p, p*5);
    rect(x, y+p*2, p, p*2);
  }
}
class Number {
void Zero(float x, float y, float p) { rectMode(CORNER); fill(255); rect(x-p*1, y, p*3, p); rect(x-p*1, y, p, p*5); rect(x+p*1, y, p, p*5); rect(x-p*1, y+p*4, p*3, p); } void One(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x, y, p, p*4);
    rect(x-p*1, y, p, p);
    rect(x-p*1, y+p*4, p*3, p);
  }
  void Two(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*2, y, p*3, p);
    rect(x, y, p, p*3);
    rect(x-p*2, y+p*2, p*3, p);
    rect(x-p*2, y+p*2, p, p*3);
    rect(x-p*2, y+p*4, p*3, p);
  }
  void Three(float x, float y, float p) {
    rectMode(CORNER);
    fill(255);
    rect(x-p*2, y, p*3, p);
    rect(x, y, p, p*3);
    rect(x-p*2, y+p*2, p*3, p);
    rect(x, y+p*2, p, p*3);
    rect(x-p*2, y+p*4, p*3, p);
  }
}

Step 6: