Project tutorial
ARDUINO PONG

ARDUINO PONG © LGPL

The game in a dot matrix display P10 16x32 pixels

  • 1,823 views
  • 1 comment
  • 8 respects

Components and supplies

About this project

The circuit Is very simple; you need a potenciometer to move the paddle and a buzzer for emitting sounds when the ball is bounce off

here is the circuit:

the code:

 /*
//JUEGO PONG CON ARDUINO UNO Y MATRIZ LED 16X32 P10
//MAS INFORMACION LA ENCUENTRAS EN MI BLOG:
//dinoelectro.blogspot.com
//
//PENDIENTE:
//   MARCADOR DE PUNTAJE
//   MODO DE DOS JUGADORES
//
//CONEXIONES:
//  ARDUINO________________DMD
//  PIN9___________________OE
//  PIN6___________________A
//  PIN7___________________B
//  PIN13__________________SLK
//  PIN8___________________SCLK
//  PIN11__________________SPI
//  CANAL A0_______________Pot 10K
//  PIN5___________________Zumbador
*/
#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"
int width=31,height=15; //DIMENSION DEL AREA DE JUEGO 
int x1=width/2,y1=height/2,speedx=1,speedy=1; //POSICION Y VELOCIDAD DE LA BOLA
int paddlex=2,paddley=height/2,paddleh=3,paddles=1; //POSICION ANCHURA Y VEOCIDAD DE LA PALETA
DMD display(1,1); 
void ScanDMD()
{ 
  display.scanDisplayBySPI();
}
void setup() {
  Timer1.initialize( 3000 );           
  Timer1.attachInterrupt(ScanDMD);    
  pinMode(5, OUTPUT); //aqui conectamos el zumbador
 // welcomeScreen();
}
void loop(){
  delay(50);
  display.clearScreen(true);
  analogWrite(5, 0); //APAGO EL SONIDO DE REBOTE
  display.writePixel(x1,y1,GRAPHICS_NORMAL,1); //DIBUJA LA PELOTA EN EL CENTRO
  x1=x1+speedx; //MUEVE LA PELOTA EN LA DIRECCION X
  y1=y1+speedy; //MUEVE LA PELOTA EN LA DIRECCION Y
  if(x1>=width){
   speedx=-speedx;//SI LA PELOTA TOCA EL LADO LATERAL CAMBIA DE DIRECCION
   analogWrite(5, 20); //EMITE SONIDO DE REBOTE
   }else if(x1<=0){
     speedx=-speedx;//SI LA PELOTA TOCA EL LADO LATERAL CAMBIA DE DIRECCION
     analogWrite(5, 20); //EMITE SONIDO DE REBOTE
     }
 if(y1>=height){
   speedy=-speedy;//SI LA PELOTA TOCA EL LADO SUPERIOR CAMBIA DE DIRECCION
   analogWrite(5, 20); //EMITE SONIDO DE REBOTE
   }else if(y1<=0){
     speedy=-speedy;//SI LA PELOTA TOCA EL LADO SUPERIOR CAMBIA DE DIRECCION
     analogWrite(5, 20); //EMITE SONIDO DE REBOTE
     }
   paddley=map(analogRead(A0),0,1023,0,12);  
   //GRAFICAMOS LA PALETA EN LA POSICION TOMANDO COMO REFERENCIA LA LECTURA DEL
   //POTENCIOMETRO
   display.drawLine(paddlex,paddley,paddlex,paddley+paddleh,GRAPHICS_NORMAL);   
   //SI LA PELOTA TIENE CONTACTO CON LA PALETA, CAMBIA DE DIRECCION
   if(x1==paddlex && y1<=paddley+paddleh && y1>paddley-paddleh/3){
     speedx=-speedx;
     speedy=-speedy;
     analogWrite(5, 20); //EMITE SONIDO DE REBOTE
     } else if(x1==0){
     //SI LA PELOTA ALCANZA LA POSICION X=0, EL JUEGO TERMINA
     //ESCRIBE GAME OVER
     analogWrite(5, 0); //APAGO
     SONIDO GAME OVER
     display.clearScreen(true);
     display.selectFont(System5x7);                     
     display.drawString(5,0,"GAME",4, GRAPHICS_NORMAL); 
     display.drawString(5,9,"OVER",4, GRAPHICS_NORMAL);  
     delay( 2000 );
     //REINICIA VARIABLES 
     x1=width/2;
     y1=height/2;
     paddlex=2;
     paddley=height/2;
     display.clearScreen(true);
     //ESCRIBE PONG DUINO
     display.drawString(5,0,"PONG",4,  GRAPHICS_NORMAL);
     display.drawString(1,9,"DUINO",5, GRAPHICS_NORMAL); 
     delay(2000);
     display.clearScreen(true);
     //ESCRIBE "READY" 
     display.drawString(2,4,"READY",5,  GRAPHICS_NORMAL);        
     delay(2000);
     display.clearScreen(true);
     //ESCRIBE GO!!!
     display.drawString(5,4,"GO!!!",5,  GRAPHICS_NORMAL);        
     delay(500);
     }
     }

here is working...

(Sorry my bad english)

TWO PLAYERS PONG GAME (UPDATE 22/4/2018)

The Circuit:

the Code:

//ARDUINO PONG
//CONEXIONES:
//nOE---------------D7
//A-----------------D6
//B-----------------D5
//SCLK--------------D4
//LATCH-------------D3
//R-----------------D2
//Raul Barreto Quinteros
#include <DMD2.h>
#include <fonts/SystemFont5x7.h>
SoftDMD dmd(1,1,7,6,5,3,4,2);
int x=15,y=7,speedx=1,speedy=1,aux1,aux2,aux3,aux4,ScoreA,ScoreB;
void setup() {
pinMode(9,OUTPUT);
dmd.setBrightness(255);
dmd.selectFont(SystemFont5x7);
dmd.begin();
dmd.drawString(1,0,F("PING ")); 
dmd.drawString(2,8,F(" PONG")); 
delay(2000);
mostrarPuntaje();
comenzarPartido();
}
void loop() {
dibujarBola();
dibujarJugadorA();
dibujarJugadorB();
rodarBola();
delay(100);
}
void dibujarBola(){
analogWrite(9,0);
dmd.setPixel(aux1,aux2, GRAPHICS_OFF);
dmd.setPixel(x,y, GRAPHICS_ON);
aux1=x;
aux2=y;
} 
void dibujarJugadorA(){
int analogA = map(analogRead(A0),0,1023,-3,15);
dmd.drawLine(1, aux3, 1, aux3+3, GRAPHICS_OFF);
dmd.drawLine(1, analogA, 1, analogA+3, GRAPHICS_ON);
aux3=analogA;
if(x==1 && y>=aux3 && y<=aux3+3) 
{
analogWrite(9,30);
speedx=-speedx;
}
}
void dibujarJugadorB(){
int analogB = map(analogRead(A1),0,1023,-3,15);
dmd.drawLine(30, aux4, 30, aux4+3, GRAPHICS_OFF);
dmd.drawLine(30, analogB, 30, analogB+3, GRAPHICS_ON);
aux4=analogB;
if(x==30 && y>=aux4 &&  y<=aux4+3 ){
analogWrite(9,30);
speedx=-speedx;
}
}  
void rodarBola(){
if(x>31){ 
ScoreA++;
if(ScoreA>99)ScoreA=0;  
mostrarPuntaje();
speedx=-speedx;
comenzarPartido();
}
else if(x<0){
ScoreB++;
if(ScoreB>99)ScoreB=0;  
mostrarPuntaje();
speedx=-speedx;
comenzarPartido();
}
if(y>15){
speedy=-speedy;
analogWrite(9,30);
}
else if(y<0){
speedy=-speedy;
analogWrite(9,30);
}
x=x+speedx;
y=y+speedy; 
}
void mostrarPuntaje(){
dmd.clearScreen();  
dmd.drawString(2,0,"A: "+String(ScoreA)); 
dmd.drawString(2,8,"B: "+String(ScoreB)); 
delay(2000);  
dmd.clearScreen();  
}
void comenzarPartido(){
dmd.clearScreen();
x=15,y=7;
dmd.drawString(2,4,F("LISTO!"));
delay(2000);
dmd.clearScreen();  
}

The Video:

Thanks.

if you need help: dino_barreto@hotmail.com

Code

PONG GAMEArduino
A PONG GAME IN A P10 DOT MATRIZ DISPLAY 16X32 PIXELS
/*
//JUEGO PONG CON ARDUINO UNO Y MATRIZ LED 16X32 P10
//MAS INFORMACION LA ENCUENTRAS EN MI BLOG:
//dinoelectro.blogspot.com
//
//PENDIENTE:
//   MARCADOR DE PUNTAJE
//   MODO DE DOS JUGADORES
//
//CONEXIONES:
//  ARDUINO________________DMD
//  PIN9___________________OE
//  PIN6___________________A
//  PIN7___________________B
//  PIN13__________________SLK
//  PIN8___________________SCLK
//  PIN11__________________SPI
//  CANAL A0_______________Pot 10K
//  PIN5___________________Zumbador
*/

#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"

int width=31,height=15; //DIMENSION DEL AREA DE JUEGO 
int x1=width/2,y1=height/2,speedx=1,speedy=1; //POSICION Y VELOCIDAD DE LA BOLA
int paddlex=2,paddley=height/2,paddleh=3,paddles=1; //POSICION ANCHURA Y VEOCIDAD DE LA PALETA
DMD display(1,1); 

void ScanDMD()
{ 
   display.scanDisplayBySPI();
}

void setup() {
   Timer1.initialize( 3000 );           
   Timer1.attachInterrupt(ScanDMD);    
   pinMode(5, OUTPUT); //aqui conectamos el zumbador
  // welcomeScreen();
}

void loop(){
   delay(50);
   display.clearScreen(true);
   analogWrite(5, 0); //APAGO EL SONIDO DE REBOTE
   display.writePixel(x1,y1,GRAPHICS_NORMAL,1); //DIBUJA LA PELOTA EN EL CENTRO
   x1=x1+speedx; //MUEVE LA PELOTA EN LA DIRECCION X
   y1=y1+speedy; //MUEVE LA PELOTA EN LA DIRECCION Y
   if(x1>=width){
    speedx=-speedx;//SI LA PELOTA TOCA EL LADO LATERAL CAMBIA DE DIRECCION
    analogWrite(5, 20); //EMITE SONIDO DE REBOTE
    }else if(x1<=0){
      speedx=-speedx;//SI LA PELOTA TOCA EL LADO LATERAL CAMBIA DE DIRECCION
      analogWrite(5, 20); //EMITE SONIDO DE REBOTE
      }
  if(y1>=height){
    speedy=-speedy;//SI LA PELOTA TOCA EL LADO SUPERIOR CAMBIA DE DIRECCION
    analogWrite(5, 20); //EMITE SONIDO DE REBOTE
    }else if(y1<=0){
      speedy=-speedy;//SI LA PELOTA TOCA EL LADO SUPERIOR CAMBIA DE DIRECCION
      analogWrite(5, 20); //EMITE SONIDO DE REBOTE
      }
    paddley=map(analogRead(A0),0,1023,0,12);  
    //GRAFICAMOS LA PALETA EN LA POSICION TOMANDO COMO REFERENCIA LA LECTURA DEL
    //POTENCIOMETRO
    display.drawLine(paddlex,paddley,paddlex,paddley+paddleh,GRAPHICS_NORMAL);   
    //SI LA PELOTA TIENE CONTACTO CON LA PALETA, CAMBIA DE DIRECCION
    if(x1==paddlex && y1<=paddley+paddleh && y1>paddley-paddleh/3){
      speedx=-speedx;
      speedy=-speedy;
      analogWrite(5, 20); //EMITE SONIDO DE REBOTE
      } else if(x1==0){
      //SI LA PELOTA ALCANZA LA POSICION X=0, EL JUEGO TERMINA
      //ESCRIBE GAME OVER
      analogWrite(5, 0); //APAGO
      SONIDO GAME OVER
      display.clearScreen(true);
      display.selectFont(System5x7);                     
      display.drawString(5,0,"GAME",4, GRAPHICS_NORMAL); 
      display.drawString(5,9,"OVER",4, GRAPHICS_NORMAL);  
      delay( 2000 );
      //REINICIA VARIABLES 
      x1=width/2;
      y1=height/2;
      paddlex=2;
      paddley=height/2;
      display.clearScreen(true);
      //ESCRIBE PONG DUINO
      display.drawString(5,0,"PONG",4,  GRAPHICS_NORMAL);
      display.drawString(1,9,"DUINO",5, GRAPHICS_NORMAL); 
      delay(2000);
      display.clearScreen(true);
      //ESCRIBE "READY" 
      display.drawString(2,4,"READY",5,  GRAPHICS_NORMAL);        
      delay(2000);
      display.clearScreen(true);
      //ESCRIBE GO!!!
      display.drawString(5,4,"GO!!!",5,  GRAPHICS_NORMAL);        
      delay(500);
      }
      }
    
 
PONG GAME TWO PLAYERS AND SCOREBOARDArduino
//ARDUINO PONG
//CONEXIONES:
//nOE---------------D7
//A-----------------D6
//B-----------------D5
//SCLK--------------D4
//LATCH-------------D3
//R-----------------D2
//Raul Barreto Quinteros

#include <DMD2.h>
#include <fonts/SystemFont5x7.h>
SoftDMD dmd(1,1,7,6,5,3,4,2);
int x=15,y=7,speedx=1,speedy=1,aux1,aux2,aux3,aux4,ScoreA,ScoreB;

void setup() {
pinMode(9,OUTPUT);
dmd.setBrightness(255);
dmd.selectFont(SystemFont5x7);
dmd.begin();
dmd.drawString(1,0,F("PING ")); 
dmd.drawString(2,8,F(" PONG")); 
delay(2000);
mostrarPuntaje();
comenzarPartido();
}

void loop() {
dibujarBola();
dibujarJugadorA();
dibujarJugadorB();
rodarBola();
delay(100);
}
  
void dibujarBola(){
analogWrite(9,0);
dmd.setPixel(aux1,aux2, GRAPHICS_OFF);
dmd.setPixel(x,y, GRAPHICS_ON);
aux1=x;
aux2=y;
} 

void dibujarJugadorA(){
int analogA = map(analogRead(A0),0,1023,-3,15);
dmd.drawLine(1, aux3, 1, aux3+3, GRAPHICS_OFF);
dmd.drawLine(1, analogA, 1, analogA+3, GRAPHICS_ON);
aux3=analogA;
if(x==1 && y>=aux3 && y<=aux3+3) 
{
analogWrite(9,30);
speedx=-speedx;
}
}

void dibujarJugadorB(){
int analogB = map(analogRead(A5),0,1023,-3,15);
dmd.drawLine(30, aux4, 30, aux4+3, GRAPHICS_OFF);
dmd.drawLine(30, analogB, 30, analogB+3, GRAPHICS_ON);
aux4=analogB;
if(x==30 && y>=aux4 &&  y<=aux4+3 ){
analogWrite(9,30);
speedx=-speedx;
}
}  

void rodarBola(){
if(x>31){ 
ScoreA++;
if(ScoreA>99)ScoreA=0;  
mostrarPuntaje();
speedx=-speedx;
comenzarPartido();
}
else if(x<0){
ScoreB++;
if(ScoreB>99)ScoreB=0;  
mostrarPuntaje();
speedx=-speedx;
comenzarPartido();
}
if(y>15){
speedy=-speedy;
analogWrite(9,30);
}
else if(y<0){
speedy=-speedy;
analogWrite(9,30);
}
x=x+speedx;
y=y+speedy; 
}

void mostrarPuntaje(){
dmd.clearScreen();  
dmd.drawString(2,0,"A: "+String(ScoreA)); 
dmd.drawString(2,8,"B: "+String(ScoreB)); 
delay(2000);  
dmd.clearScreen();  
}

void comenzarPartido(){
dmd.clearScreen();
x=15,y=7;
dmd.drawString(2,4,F("LISTO!"));
delay(2000);
dmd.clearScreen();  
}

Schematics

PONG GAME
Schematics gnmq9xe6in
PONG GAME TWO PLAYER AND SCORE
Pong2players u2fm3ckt4l

Comments

Similar projects you might like

RING PONG

Project showcase by aerodynamics

  • 5,332 views
  • 2 comments
  • 12 respects

NeoMatrix Arduino Pong

Project tutorial by Arduino “having11” Guy

  • 4,650 views
  • 0 comments
  • 19 respects

4D Ping Pong

Project showcase by 4D Makers

  • 1,920 views
  • 0 comments
  • 6 respects

Serial Pong

Project showcase by Cody Brooks

  • 2,803 views
  • 2 comments
  • 12 respects

Arduino Pong Game - OLED Display

Project tutorial by Nick Koumaris

  • 5,291 views
  • 1 comment
  • 14 respects

Arduino Ping Pong Pinball

Project tutorial by joesinstructables

  • 4,495 views
  • 3 comments
  • 10 respects
Add projectSign up / Login