Esta vez les traigo este tradicional juego Pong de antaño hecho con pocos componentes electrónicos, donde se vera a través de un display Oled de 0,96 pulgadas.
Elementos a utilizar
1-Arduino UNO.
1-Display Oled 0.96″.
1- Protoboard.
2- Potenciometros de 5K.
Un par de cables Jumpers.
1- Cable Usb del Tipo AB.
1- Fuente Alimentación. Ej PowerBank de 5V estilo para móviles.
Diagrama:
Las conexiones del Arduino UNO con:
Display Oled
Potenciómetro uno:
Potenciómetro dos:
Código:
Las lineas de código están muy bien comentadas, así que no les será difícil su interpretación.
#include <OLED_I2C.h>// libreria para control del display OLED
#include <math.h>// libreria para cálculos que vamos a tener que hacer
// Los jugadores
int jug1;// variable para controlar al jugador 1 con un potenciometro
int jug2;// idem para el jugador 2
// Variable para el conteo de goles del jugador 1 y del jugador 2
int a=0;// goles del jugador 1
int b=0;// goles del jugador 2
// Variables para la posición en cancha de la barrita de cada jugador
float pos1;
float pos2;
// Variables para las dimensiones de la cancha...ojo con cambiar mucho todos los numeros que puede salir cualquier cosa
float xcancha=15;// Seria la parte mas a la izquierda de la cancha
float ycancha=1;// Seria la parte mas arriba de la cancha
float largo=96; // largo de la cancha
float ancho=62;// ancho de la cancha
float sep=8; //separacion entre la barrita de cada jugador y la linea final de la cancha de su lado
float barrita=15;// largo de la barrita de cada jugador
// Variables para la pelotita (es un circulo chiquitito); se inicia en el centro de la cancha
float xp=64;//posición X inicial de la pelotita
float yp=32;//posición Y inicial de la pelotita
float r=2;// radio de la pelotita (tamaño)
// Como arranca la pelotita desplazandose al inicio del juego
// cambiandole estos valores se puede aumentar o disminuir la velocidad de la pelotita; pero no lo recomiendo
float xr=1;//desplazamiento en X de la pelotita
float yr=1;//desplazamiento en Y de la pelotita
OLED myOLED(SDA, SCL, 8);// activamos la libreria del OLED
extern uint8_t SmallFont[];// Tamaño de fuente de los textos
extern uint8_t MediumNumbers[];// Tamaño de los numeros que indican el goleo de cada jugador
void setup()
{
myOLED.begin();//inicializa el display OLED
myOLED.setFont(SmallFont);//seteo el tamaño de la fuente para los textos que se escribiran
myOLED.print("JUEGO DEL PONG", CENTER, 10);//imprime la frase entre comillas
myOLED.print("DitecnoMakers", CENTER, 30);//imprime la frase entre comillas
myOLED.print("Ditecno Digital", CENTER, 40);//imprime la frase entre comillas
myOLED.print("Saludos", CENTER, 50);//imprime la frase entre comillas
myOLED.update();// actualiza la pantalla haciendo lo anterior
delay(2000);
myOLED.clrScr(); // borra la pantalla
}
void loop ()
{
int i;// variable local para el bucle for que hace que la barrita del jugador 1 se mueva
int j;// idem del jugador 2
jug1=analogRead(0);//El jugador 1 controla su barrita con un potenciometro colocado en la entrada analogica 0
jug2=analogRead(1);//El jugador 2 controla su barrita con un potenciometro colocado en la entrada analogica 1
pos1=jug1*(ancho-barrita)/1023+ycancha;// la posición de la barrita del jugador 1 de acuerdo a la señal analogica 0 y a las dimensiones de la cancha; 15 seria el largo en pixels de la barrita del jugador
pos2=jug2*(ancho-barrita)/1023+ycancha;// la posición de la barrita del jugador 2 de acuerdo a la señal analogica 1 y a las dimensiones de la cancha; 15 seria el largo en pixels de la barrita del jugador
myOLED.drawRect(xcancha,ycancha,xcancha+largo,ycancha+ancho);// dibuja el rectangulo que es la cancha
myOLED.drawCircle(xp,yp,r);//dibuja la pelotita con su tamaño y posición inicial
// Movimiento de la barra del jugador 1
for(i=63;i>pos1;i--){
myOLED.drawLine(xcancha+sep,pos1,xcancha+sep,pos1+barrita);// posicion de la barra del jugador 1 con su movimiento vertical
}
// Movimiento de la barra del jugador 2
for(j=63;j>pos2;j--){
myOLED.drawLine(xcancha+largo-sep,pos2,xcancha+largo-sep,pos2+barrita);// posicion de la barra del jugador 2 con su movimiento vertical
}
myOLED.setFont(MediumNumbers);// fuente de tamaño grande para los numeros de goles de cada jugador
myOLED.printNumI(a,00,0);// imprime la cantidad de goles del jugador Nº 1
myOLED.printNumI(b,115,0);// imprime la cantidad de goles del jugador Nº 2
//Inicializo el desplazamiento de la pelotita...hay que darle un cierto inicio al comienzo del juego y yo le digo que empieze hacia la derecha
xp=xp+xr;// va sumandole xr pixeles a su posición en X
yp=yp+yr;// va sumandole yr pixeles a su posición en Y
// Ahora viene el rebote de la pelotita en las paredes superior e inferior de la cancha
if(yp>=(ycancha+ancho-r)) { // rebote en la pared inferior
yr=-1;
}
else if(yp<=ycancha+r) { // rebote en la pared superior
yr=1;
}
// Ahora, el rebote de la pelotita en la barrita de los jugadores y la anotación de goles
// si pasa lo siguiente, hay gol del jugador Nº 2
if (xp<=(xcancha+r)) { // o sea si la pelotita llego mas atras de la posición X del jugador 1
b=b+1;// aumenta en un gol su tanteador
// la pelotita vuelve al medio de la cancha y ahora empieza al reves su desplazamiento
xp=64;
yp=32;
xr=-xr;
yr=-yr;
delay (500);// un tiempito antes de mover del medio
}
// sino hubo gol, entonces hubo rebote de la pelotita en el jugador 1 y debe cambiar su dirección
if(xp==xcancha+sep+r && ((yp+r)>=pos1 && (yp-r)<=(pos1+barrita))) { // esto es para tomar en cuenta que la pelotita puede rebotar en cualquier parte de la barrita del jugador
xr=-xr;
}
// si pasa lo siguiente, hay gol del jugador Nº 1
if(xp>=(xcancha+largo-r)) { // o sea si la pelotita llego mas adelante de la posición X del jugador 2
a=a+1;// aumenta en 1 gol su tanteador
// la pelotita vuelve al medio de la cancha y ahora empieza al reves su desplazamiento
xp=64;
yp=32;
xr=-xr;
yr=-yr;
delay(500);// un tiempito antes de mover del medio
}
// si no hubo gol, hubo rebote de la pelotita en el jugador 2
else if(xp==xcancha+largo-sep-r && ((yp+r)>=(pos2) && (yp-r)<=(pos2+barrita))) { // esto es para tomar en cuenta que la pelotita puede rebotar en cualquier parte de la barrita del jugador
xr=-xr;
}
// El partido termina cuando algun jugador llega a 10 goles
if (a==10) {
myOLED.setFont(SmallFont);//seteo el tamaño de la fuente para los textos que se escribiran
myOLED.clrScr(); //borra la pantalla
myOLED.print("Partido terminado",CENTER,10);
myOLED.print("Gano el jugador",CENTER,20);
myOLED.print("de la izquierda",CENTER,30);
myOLED.print("GRACIAS POR JUGAR",CENTER,50);
myOLED.update();//actualiza la pantalla
a=0;
b=0;
delay(10000);// en 10 segundos vuelve a empezar el partido
}
else if (b==10) {
myOLED.setFont(SmallFont);//seteo el tamaño de la fuente para los textos que se escribiran
myOLED.clrScr(); //borra la pantalla
myOLED.print("Partido terminado",CENTER,10);
myOLED.print("Gano el jugador",CENTER,20);
myOLED.print("de la derecha",CENTER,30);
myOLED.print("GRACIAS POR JUGAR",CENTER,50);
myOLED.update();//actualiza la pantalla
a=0;
b=0;
delay(10000);//en 10 segundos vuelve a empezar
}
myOLED.update();//actualiza la pantalla
myOLED.clrScr(); //borra la pantalla y reinicia el loop
}
Eso es todo.Saludos Juanjo
- Tutorial
- Arduino















El recordado Pong. Muy bien se ve.
así es, el bien ponderado Pong
Amigo no cuento con ninguna placa Arduino, pero quisiera saber si se puede similar en proteus. Gracias.
Intentalo y decinos si la animacion del Oled se ve reflejada en Proteus. Yo creo que no. Puedes probarlo y decirnos.
Exelent!
gracias @DrakerDG