Rompecabezas con arduino y TV

Publicado el: 22 de junio de 2019
Principiante
Acerca de este proyecto
El objetivo es organizar las casillas numéricas del 1 al 15 que se muestran en la pantalla de un televisor y se controla con un HEX PAD.
arduino televisor juego
Publicidad
DETALLES

Este proyecto consiste en jugar el famoso juego del puzzle o rompecabezas cuyos números se visualizan e la pantalla de un televisor CRT conectado a un arduino y los movimientos de dichas casillas se controlan mediante un teclado hexadecimal.

Puzzle

 VIDEO DE FUNCIONAMIENTO

En ingles

LISTA DE MATERIALES

  • Arduino uno o equivalente
  • Teclado hexadecimal
  • Un televisor de rayos catodicos.
  • Cable de video RCA
  • 1 resistor de 1 k ohm.
  • 1 resistor de 470 ohms.
  • Cables de conexion.



DIAGRAMA ESQUEMÁTICO

Diagrama


CONECTAR ARDUINO AL TELEVISOR

Diagrama TV


Diagrama arduino al TV


Descargue esta libreria e importela al sketch.

Como se muestra en el diagrama, el resistor de 1k va conectado al pin 9 del arduino, el resistor de 470 ohms se conecta al pin 7 del arduino. Los extremos libres de los resistores se unen entre si, y esta union se conecta al cable RCA (señal de video) La señal de GND del cable RCA se conecta al GND del arduino.


El código se encuentra en la sección de codificación de este articulo.

Teclado hexadecimal


Los numeros del (1 al 16) se almacenan en un array. El numero 16 representa la posición vacía.

Para desordenar las casillas se presiona la tecla A.

Cuando se presiona alguna tecla, el programa verifica si hay una casilla vacía cerca de esa posición. Por ejemplo, como se muestra en la figura, si se presiona la tecla '1', se verifican las casillas cercanas a ella, que son  la '2' y la '5'.







CODIFICACIÓN
Codigo arduino-

//Made by José Luis Bejarano Vásquez
//www.sistemasymicros.comco

#include <font4x6.h>
#include <font6x8.h>
#include <font8x8.h>
#include <font8x8ext.h>
#include <fontALL.h>

#include <TVout.h>
#include <video_gen.h>

#include <Keypad.h>

const byte ROWS=4;
const byte COLS=4;
char keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {13,6,5,4}; //Filas(pines del 9 al 6)
byte colPins[COLS] = {3,2,1,0}; //Columnas (pines del 5 al 2)
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

TVout tv;
//int cuenta;
  int puzzle[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int cX = 0;
int cY= 0;
byte width=20;
byte height=20;
byte color=1;
byte full=0;
byte azar;
byte i;
int temp;
int numero;
int modoJuego=false;
int intentos=0;
boolean ganado=false;
int cuenta=0;

unsigned long tiempo=0;
unsigned long inicio=0;


void revolver()
{
  tv.clear_screen();
  
  intentos=0;
  inicio = millis();
  
  dibujar_cuadros();
  
  for (i=0;i<=15;i++)

  {  
      randomSeed(analogRead(0));
      
      azar = random(0,16);  //Genera un número  aleatorio entre 0 y 16
    
      temp = puzzle[i];  
  
      puzzle[i] = puzzle[azar];
      
      puzzle[azar] = temp;
      
    
  }

}




void dibujar_cuadros()
{
  
    //Dibuja la primera fila
   tv.draw_rect(cX,cY+0,width,height,color,full);
   
   tv.draw_rect(cX+20,cY+0,width,height,color,full);

   tv.draw_rect(cX+40,cY+0,width,height,color,full);
  
   tv.draw_rect(cX+60,cY+0,width,height,color,full);
   
   //Dibuja la segunda fila
   
   tv.draw_rect(cX+0,cY+20,width,height,color,full);

   tv.draw_rect(cX+20,cY+20,width,height,color,full);

   tv.draw_rect(cX+40,cY+20,width,height,color,full);

   tv.draw_rect(cX+60,cY+20,width,height,color,full);
   
   //****** Dibuja la tercera fila
   tv.draw_rect(cX+0,cY+40,width,height,color,full);

   tv.draw_rect(cX+20,cY+40,width,height,color,full);

   tv.draw_rect(cX+40,cY+40,width,height,color,full);

   tv.draw_rect(cX+60,cY+40,width,height,color,full);
   
  //******** Dibuja la cuarta fila
   tv.draw_rect(cX+0,cY+60,width,height,color,full);

   tv.draw_rect(cX+20,cY+60,width,height,color,full);

   tv.draw_rect(cX+40,cY+60,width,height,color,full);

   tv.draw_rect(cX+60,cY+60,width,height,color,full);

}

void dibujar_pantalla()
{

if(puzzle[0]==16)
 {
   tv.print(6,6,'');
 } 
 else
 {
   tv.print(6,6,puzzle[0]);
 }
 
  
 if(puzzle[1]==16)
 {
   tv.print(26,6,'');
 } 
 else
 {
   tv.print(26,6,puzzle[1]);
 }
 
  if(puzzle[2]==16)
   {
     tv.print(46,6,'');
   } 
   else
   {
     tv.print(46,6,puzzle[2]);
   }
   
 if(puzzle[3]==16)
 {
   tv.print(66,6,'');
 } 
 else
 {
   tv.print(66,6,puzzle[3]);
 }

  
 if(puzzle[4]==16)
 {
   tv.print(6,26,'');
 } 
 else
 {
   tv.print(6,26,puzzle[4]);
 }

 if(puzzle[5]==16)
 {
   tv.print(26,26,'');
 } 
 else
 {
   tv.print(26,26,puzzle[5]);
 }

 if(puzzle[6]==16)
 {
   tv.print(46,26,'');
 } 
 else
 {
   tv.print(46,26,puzzle[6]);
 }

 if(puzzle[7]==16)
 {
   tv.print(66,26,'');
 } 
 else
 {
   tv.print(66,26,puzzle[7]);
 }

 
 if(puzzle[8]==16)
 {
   tv.print(6,46,'');
 } 
 else
 {
   tv.print(6,46,puzzle[8]);
 }

 if(puzzle[9]==16)
 {
   tv.print(26,46,'');
 } 
 else
 {
   tv.print(26,46,puzzle[9]);
 }


 if(puzzle[10]==16)
 {
   tv.print(46,46,'');
 } 
 else
 {
   tv.print(46,46,puzzle[10]);
 }


 if(puzzle[11]==16)
 {
   tv.print(66,46,'');
 } 
 else
 {
   tv.print(66,46,puzzle[11]);
 }

 
 if(puzzle[12]==16)
 {
   tv.print(6,66,'');
 } 
 else
 {
   tv.print(6,66,puzzle[12]);
 }


 if(puzzle[13]==16)
 {
   tv.print(26,66,'');
 } 
 else
 {
   tv.print(26,66,puzzle[13]);
 }


 if(puzzle[14]==16)
 {
   tv.print(46,66,'');
 } 
 else
 {
   tv.print(46,66,puzzle[14]);
 }


 if(puzzle[15]==16)
 {
   tv.print(66,66,'');
 } 
 else
 {
   tv.print(66,66,puzzle[15]);
 }
 
 
 
 tv.print(0,86,'intentos:');
 tv.print(56,86,intentos);  

}

int intercambiar(int posI,int posF)
{
      
  if(puzzle[posF]==16)
  {

    numero= puzzle[posI];
    puzzle[posI]=16;
    puzzle[posF]=numero;
  }
  
  
  tv.clear_screen();

  dibujar_cuadros();
    
  dibujar_pantalla();
  
  finalizar();
  
}

void finalizar()
{ if(puzzle[0]==1 && puzzle[1]==2 && puzzle[2]==3 && puzzle[3]==4 && puzzle[4]==5 && puzzle[5]==6 && puzzle[6]==7 && puzzle[7]==8 && puzzle[8]==9 && puzzle[9]==10 && puzzle[10]==11 && puzzle[11]==12 && puzzle[12]==13 && puzzle[13]==14 && puzzle[14]==15)
  
          
          {
            tv.clear_screen();
            tv.print(30,40,'GANASTE');
            tv.print(23,60,'intentos: ');
            tv.print(83,60,intentos);
            modoJuego=false;
            ganado=true;
            tiempo=millis();

          } 
        
  
}

void temporizador()
{
    
   if(modoJuego==true)
   {
    tiempo= millis()-inicio;  
    
  
   tv.print(78,86,millis());
    
   }
   
}

void setup()
{
  tv.begin(_NTSC,120,96);
  tv.select_font(font6x8);
  dibujar_cuadros();
  cuenta=0;
 } 
 
 void loop()
 {

   temporizador();
   
   char key = keypad.getKey();  
   
    if(key)
   {
     //Si el juego no ha comenzado
     if(modoJuego==false)
     {     
       if(key=='A')
       {
         revolver();
         modoJuego=true;
       }
     
     }
     else
     {
       
       
       switch(key)
       {
         
         case '1':
           intercambiar(0,1);
           intercambiar(0,4);
           break;
           
         case '2':
           intercambiar(1,0);
           intercambiar(1,2);           
           intercambiar(1,5);           
           break;

         case '3':
           intercambiar(2,1);
           intercambiar(2,3);
           intercambiar(2,6);           
           break;

         case 'A':  //The four
           
           static int count;

           count=count+1;

           if(count==2)
          {
            revolver();
          }
  
           intercambiar(3,2);
           intercambiar(3,7);                    
           break;

         case '4':  //The 5
           intercambiar(4,0);
           intercambiar(4,5);
           intercambiar(4,8);           
           break;

         case '5':  //The 6
           intercambiar(5,1);
           intercambiar(5,4);
           intercambiar(5,6);           
           intercambiar(5,9);           
           break;

         case '6':  //The 7
           intercambiar(6,2);
           intercambiar(6,5);
           intercambiar(6,7);           
           intercambiar(6,10);           
           break;

         case 'B':  //The 8
           intercambiar(7,3);
           intercambiar(7,6);
           intercambiar(7,11);                  
           break;

         case '7':  //The 9
           intercambiar(8,4);
           intercambiar(8,9);
           intercambiar(8,12); 
           break;

         case '8':  //The 10
           intercambiar(9,5);
           intercambiar(9,8);
           intercambiar(9,10);
           intercambiar(9,13);                     
           break;

         case '9':  //The 11
           intercambiar(10,6); 
           intercambiar(10,9); 
           intercambiar(10,11); 
           intercambiar(10,14);            
           break;

         case 'C':  //The 12
           intercambiar(11,7); 
           intercambiar(11,10); 
           intercambiar(11,15); 
           break;

         case '*':  //The 13
           intercambiar(12,8); 
           intercambiar(12,13);            
           break;

         case '0':  //The 14
           intercambiar(13,9); 
           intercambiar(13,12);    
           intercambiar(13,14);            
           break;

         case '#':  //The 15
           intercambiar(14,10); 
           intercambiar(14,13); 
           intercambiar(14,15);            
           break;

         case 'D':  //The 16
           intercambiar(15,11); 
           intercambiar(15,14);            
           break;
           
           
       }//Fin switch
       
      intentos++; 
       
     }  //Fin else
     
   }  //Fin If key

    
   if(ganado!=true)
     {
       
     dibujar_pantalla();
     
     }
   
  
   
 }  //End loop







Autor: sistemasymicros
26 proyectos 6 seguidores 0 siguiendo

Ingeniero en electrónica. Maker, apasionado por la programación. Sigueme en sistemasymicros.

COMENTARIOS
Para publicar un comentario debes