Programación de un cubo (4x4x4)

Hola a todos, estoy metido en el diseño de un cubo de leds de 4x4x4 y, aunque todavía no he terminado de montarlo, durante esos ratos que estoy en clase aburrido y no puedo montar el cubo, he programado el firmware.

Os lo posteo para que podáis darme vuestra opinión, si creéis si funcionará o no. Digamos que como no puedo testearlo porque no tengo el cubo os lo posteo para que me comentéis sobre el.

El cubo funciona de la siguiente forma:

  • Cada piso de leds tiene asignado un pin, de esta forma, activo o desactivo el piso.
  • Cada columna de leds tiene asignado un pin, así decido qué columna encender y qué columna apagar dentro del piso activo.

Muchas gracias por vuestra ayuda.

Código:

int t=100; //Tiempo
int i,j,k,v; //Contadores

int pines[4][4]; //Columnas 0-15
int pis[4]={17,18,19,20}; //Pisos 17-20

int pant[4][4][4]; //Píxeles

void setup() 
{ 
  v=0; //Inicializamos el contador en el que vamos a contar el pin
  for(i=0;i<4;i++) //Vueltas por la X del cubo
  {
    for (j=0;j<4;j++) //Vueltas por la Z del cubo
    {  
      pines[i][j]=v; //Guardamos el número de pin en la array de pines
      pinMode(v,OUTPUT); //Abrimos el pin
      v++; //Pasamos al siguiente pin
    }
  }
  for(v=0;v<4;v++) //Cuatro vueltas, una por cada pin de "piso"
  {
      pinMode(17+v,OUTPUT); //Abrimos el pin de "piso"
  }
}

void loop() {  
  test(); //Escena de test
  delay(500);

}

void test() 
{
  reset(); //Reseteamos el cubo para poner todos los leds a 0
  
  //Encendido
    for(i=0;i<4;i++) //Vuelta por la Y del cubo
    {
      for (j=0;j<4;j++) //Vuelta por la X del cubo
      {  
        for(k=0;k<4;k++) //Vuelta por la Z del cubo
        {
          pant[i][j][k]=1; //Encendemos el "pixel" actual
          frame(); //Función de "pintado por pantalla"
        }
      }
    }
    
  //Apagado
    for(i=0;i<4;i++) //Vuelta por la Y del cubo
    {
      for (j=0;j<4;j++) //Vuelta por la X del cubo
      {  
        for(k=0;k<4;k++) //Vuelta por la Z del cubo
        {
          pant[i][j][k]=0; //Encendemos el "pixel" actual
          frame(); //Función de "pintado por pantalla"
        }
      }
    }
}

void frame() //Función de "pintado de pantalla"
{
  for(v=0;v<t;v++)//Vueltas para mostrar el fotograma
  {
    for(i=0;i<4;i++) //Vuelta por la Y del cubo
    {
      digitalWrite (pis[i],HIGH); //Encendemos el piso    
      for(j=0;j<4;j++) //Vuelta por la X del cubo
      {
        for(k=0;k<4;k++) //Vuelta por la Z del cubo
        {
          if(pant[0][j][k]!=1) //Comprobamos el estado del "pixel" actual
          { //Si está encendido
            digitalWrite(pines[j][k],HIGH); //lo encendemos
          }
          else
          { //Si está apagado
            digitalWrite (pines[j][k],LOW); //lo apagamos
          }
        }
      }
      digitalWrite (pis[i],LOW); //Apagamos el piso
    }
  }  
}

void reset() 
{
  for(i=0;i<4;i++) //Vuelta por la Y del cubo
  {
    for (j=0;j<4;j++) //Vuelta por la X del cubo
    {  
      for(k=0;k<4;k++) //Vuelta por la Z del cubo
      {
        pant[i][j][k]=0; //Apagamos el "pixel" actual
      }
    }
  }
  frame(); //Función de "pintado por pantalla"
}