Introduction: PONG WITH ARDUINO - ARDUINO PONG
You need some components: (Sorry i dont talk english)
Tu necesitaras los siguientes componentes:
- An ARDUINO UNO R3
- A Dot Matrix Display P10
- A 10K Potenciometer
- A Buzzer
- Jumper Wires
- Arduino Software
Step 1: SCHEMATICS AND SKETCH
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
sketch for ARDUINO UNO is here, make sure install all libraries:
Es muy simple armar el circuito, se utiliza un potenciometro para mover la paleta y un buzzer para emitir sonidos cada vez que la pelota rebota.
El código para cargar en arduino es el siguiente; asegúrate de tener instaladas las librerías necesarias:
- TimerOne.h
- DMDMaster.h
- SPI.h
/* //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); } }
Step 2: PHOTOS
im going to make a box
necesitaré hacer una caja:
Step 3: Further More to Make...
- Pong Scoreboard
- Two players mode
- build a box
- Marcador Puntaje
- Modo dos jugadores
- hacer una caja
more info: digitalplanet
Thank you!
Gracias!
Step 4: PONG WITH TWO PLAYERS, SCORE AND BOX
El codigo es el siguiente:
//ARDUINO PONG //CONEXIONES: //nOE---------------D7 //A-----------------D6 //B-----------------D5 //SCLK--------------D4 //LATCH-------------D3 //R-----------------D2 //Raul Barreto Quinteros #include #include 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(); }
Step 5: Ensamble.
Here is the video: