Proyecto de estudiante: LED Cube

Hola a todos

las vacaciones de verano en Alemania están llegando a su fin y algunos jóvenes aficionados han utilizado este tiempo libre para establecer sus propios proyectos. 

Hoy, nos gustaría Niklas Heinzel dar la oportunidad de presentar su proyecto en nuestro blog. Niklas ha tomado el cubo LED clásico y lo ha diseñado y programado completamente, desde cero:

Hoy me gustaría presentarles un nuevo y emocionante proyecto, que construí en casa, un cubo LED en las dimensiones 4x4x4.

Para ello, utilizo:

  • 1 x Nano V3
  • 4 x NPN 2n2222 Transistores
  • 4 resistencias x 1k
  • 16 x 220 • Resistencias
  • 64 x LED difusos azules (5 mm)
  • Puerto micro USB
  • LED amarillo (SMD)

Para la construcción del cubo LED:

Para los 64 LED, el ánodo (siempre en el mismo lugar) se dobla 90o. Estos se disipan hacia abajo hasta el polo más.
Como se puede ver en la imagen de arriba, el cubo consta de un eje X-Y y 4 capas apiladas una encima de la otra. La capa inferior es el número 0 y la capa superior es el número 3. Del mismo modo, los LED están numerados como una matriz tridimensional. El LED inferior izquierdo se encuentra en la capa 0 (1.1). El LED anterior también se encuentra en la capa 1 (1.1). El LED derecho en la capa 0 (2.1) y así sucesivamente. Todas las capas horizontales son los pines negativos de los LED soldados.
Todos los pines positivos de los LED se tratan como columnas de este cubo de matriz. Así que tenemos 4 capas y 16 columnas que lo convierten en 20 cables conectados al Arduino. Los pines positivos (capas) tienen resistencias de 220 ohmios.

 

El ensamblaje del cubo:

En primer lugar, necesitamos un cartón o madera moderadamente grueso. Ahora perforamos agujeros, de modo que se crea un patrón de cubo de 4 x 4 con distancias iguales entre todos los agujeros.
Los agujeros grandes de 5 mm (cada agujero está a 2,4 cm del siguiente (centro-centro)) se perforaron como plantilla para los LED.
Ahora necesita probar y preparar sus LEDs. Para este propósito, puede utilizar una celda de botón de 3V. ¡Prueba todos los LED para que no tengas ningún problema más tarde!
Si desea que la luz se escape de todos los lados del LED, puede espolvorear la luz con papel de lija frotando la cáscara de plástico.
Coloque los LED en la caja, pero asegúrese de que estén alineados. Los pines positivos de los LED deben estar doblados y los negativos deben estar conectados como una capa. Eso es porque vamos a hacer cuatro de estas capas y es fácil soldarlas juntas.

Repetimos estas capas 4x y las colocamos una encima de la otra, conectando todos + pines y poniéndolas una encima de la otra.

 

La placa, el pinout y las conexiones:

en mi caso, elegí el siguiente pinout para controlar el cubo como en una matriz:

Debe realizar estas conexiones y también prestar atención a la elección correcta de los pines, de lo contrario la animación no se ejecutará correctamente más tarde.

He diseñado el tablero de la siguiente manera y debería darle sólo una idea de lo que el diseño podría parecer:

Descargar tablero de enlaces

 

Sólo falta el código:

 

CUBO LED 1.0
Niklas Heinzel
//2019   Int Capa[4]={A3,A2,A1,A0}; inicializando y declarando capas led   Int Columna[16]={13,12,11,10,9,8,7,6,5,4,3,2,1,0,A5,A4}; inicializando y declarando filas led   Int hora = 250;



Vacío Configuración()
{   Para(Int Ⅰ. = 0; Ⅰ.<16; Ⅰ.++)   {     pinMode(Columna[Ⅰ.], Salida);  establecer filas a ouput   }   Para(Int Ⅰ. = 0; Ⅰ.<4; Ⅰ.++)   {     pinMode(Capa[Ⅰ.], Salida);  configuración de capas para la salida   }   randomSeed(analogRead(10));  sembrado al azar para el patrón aleatorio
}

Vacío Bucle()
{   turnEverythingOff();   flickerOn();   turnEverythingOn();   Retraso(hora);   turnonAndOffAllByLayerUpAndDownNotTimed();   layerstompUpAndDown();   spiralInAndOut();   turnOnAndOffAllByColumnSideways();   Retraso(hora);   aroundEdgeDown();   turnEverythingOff();   randomflicker();   randomRain();   diagonalRectangle();   goThroughAllLedsOneAtATime();   Hélice();   spiralInAndOut();   flickerOff();   turnEverythingOff();   Retraso(2000);
}


apagar todo
Vacío turnEverythingOff()
 {    Para(Int  = 0; <16; ++)    {      digitalWrite(Columna[], 1);    }    Para(Int  = 0; <4; ++)    {      digitalWrite(Capa[], 0);    }
 }

encender todo
Vacío turnEverythingOn()
{   Para(Int  = 0; <16; ++)   {     digitalWrite(Columna[], 0);   }   encender las capas   Para(Int  = 0; <4; ++)   {     digitalWrite(Capa[], 1);   }
}
apagar columnas
Vacío turnColumnsOff()
{   Para(Int  = 0; <16; ++)   {     digitalWrite(Columna[], 1);   }
}
parpadeo en
Vacío flickerOn()
{   Int  = 150;   Mientras( != 0)   {     turnEverythingOn();     Retraso();     turnEverythingOff();     Retraso();     -= 5;   }
}
activar todo y desactivar por capa arriba y abajo NO TIEMPO
Vacío turnonAndOffAllByLayerUpAndDownNotTimed()
{   Int X = 75;   Para(Int  = 5;  != 0; --)   {     turnEverythingOn();     Para(Int  = 4; !=0; --)     {       digitalWrite(Capa[-1], 0);       Retraso(X);     }     Para(Int  = 0; <4; ++)     {       digitalWrite(Capa[], 1);       Retraso(X);     }       Para(Int  = 0; <4; ++)     {       digitalWrite(Capa[], 0);       Retraso(X);     }     Para(Int  = 4; !=0; --)     {       digitalWrite(Capa[-1], 1);       Retraso(X);     }   }
}
encender y apagar todo por columna hacia los lados
Vacío turnOnAndOffAllByColumnSideways()
{   Int X = 75;   turnEverythingOff();   activar las capas   Para(Int  = 0; <4; ++)   {     digitalWrite(Capa[], 1);   }   Para(Int y y = 0; y y<3; y y++)   {     activar 0-3     Para(Int  = 0; <4; ++)     {       digitalWrite(Columna[], 0);       Retraso(X);     }     encender 4-7     Para(Int  = 4; <8; ++)     {       digitalWrite(Columna[], 0);       Retraso(X);     }     encender 8-11     Para(Int  = 8; <12; ++)     {       digitalWrite(Columna[], 0);       Retraso(X);     }     encender 12-15     Para(Int  = 12; <16; ++)     {       digitalWrite(Columna[], 0);       Retraso(X);     }     apagar 0-3     Para(Int  = 0; <4; ++)     {       digitalWrite(Columna[], 1);       Retraso(X);     }     apagar 4-7     Para(Int  = 4; <8; ++)     {       digitalWrite(Columna[], 1);       Retraso(X);     }     apagar 8-11     Para(Int  = 8; <12; ++)     {       digitalWrite(Columna[], 1);       Retraso(X);     }     apagar 12-15     Para(Int  = 12; <16; ++)     {       digitalWrite(Columna[], 1);       Retraso(X);     }     encender 12-15     Para(Int  = 12; <16; ++)     {       digitalWrite(Columna[], 0);       Retraso(X);     }     encender 8-11     Para(Int  = 8; <12; ++)     {       digitalWrite(Columna[], 0);       Retraso(X);     }     encender 4-7     Para(Int  = 4; <8; ++)     {       digitalWrite(Columna[], 0);       Retraso(X);     }     activar 0-3     Para(Int  = 0; <4; ++)     {       digitalWrite(Columna[], 0);       Retraso(X);     }     apagar 12-15     Para(Int  = 12; <16; ++)     {       digitalWrite(Columna[], 1);       Retraso(X);     }     apagar 8-11     Para(Int  = 8; <12; ++)     {       digitalWrite(Columna[], 1);       Retraso(X);     }     apagar 4-7     Para(Int  = 4; <8; ++)     {       digitalWrite(Columna[], 1);       Retraso(X);     }     apagar 0-3     Para(Int  = 0; <4; ++)     {       digitalWrite(Columna[], 1);       Retraso(X);     }   }
}
arriba y abajo pisoteo de una sola capa
Vacío layerstompUpAndDown()
{   Int X = 75;   Para(Int  = 0; <4; ++)   {     digitalWrite(Capa[], 0);   }   Para(Int y y = 0; y y<5; y y++)   {     Para(Int Contar = 0; Contar<1; Contar++)     {       Para(Int  = 0; <4; ++)       {         digitalWrite(Capa[], 1);         Retraso(X);         digitalWrite(Capa[], 0);       }       Para(Int  = 4;  !=0; --)       {         digitalWrite(Capa[-1], 1);         Retraso(X);         digitalWrite(Capa[-1], 0);       }     }     Para(Int  = 0; <4; ++)     {       digitalWrite(Capa[], 1);       Retraso(X);     }     Para(Int  = 4; !=0; --)     {       digitalWrite(Capa[-1], 0);       Retraso(X);     }   }
}
parpadeo fuera
Vacío flickerOff()
{   turnEverythingOn();   Para(Int  = 0; != 150; +=5)   {     turnEverythingOff();     Retraso(+50);     turnEverythingOn();     Retraso();   }
}
alrededor del borde del cubo hacia abajo
Vacío aroundEdgeDown()
{   Para(Int X = 200; X != 0; X -=50)   {     turnEverythingOff();     Para(Int  = 4;  != 0; --)     {       digitalWrite(Capa[-1], 1);       digitalWrite(Columna[5], 0);       digitalWrite(Columna[6], 0);       digitalWrite(Columna[9], 0);       digitalWrite(Columna[10], 0);       digitalWrite(Columna[0], 0);       Retraso(X);       digitalWrite(Columna[0], 1);       digitalWrite(Columna[4], 0);       Retraso(X);       digitalWrite(Columna[4], 1);       digitalWrite(Columna[8], 0);       Retraso(X);       digitalWrite(Columna[8], 1);       digitalWrite(Columna[12], 0);       Retraso(X);       digitalWrite(Columna[12], 1);       digitalWrite(Columna[13], 0);       Retraso(X);       digitalWrite(Columna[13], 1);       digitalWrite(Columna[15], 0);       Retraso(X);       digitalWrite(Columna[15], 1);       digitalWrite(Columna[14], 0);       Retraso(X);       digitalWrite(Columna[14], 1);       digitalWrite(Columna[11], 0);       Retraso(X);       digitalWrite(Columna[11], 1);       digitalWrite(Columna[7], 0);       Retraso(X);       digitalWrite(Columna[7], 1);       digitalWrite(Columna[3], 0);       Retraso(X);       digitalWrite(Columna[3], 1);       digitalWrite(Columna[2], 0);       Retraso(X);       digitalWrite(Columna[2], 1);       digitalWrite(Columna[1], 0);       Retraso(X);       digitalWrite(Columna[1], 1);     }   }
}
parpadeo aleatorio
Vacío randomflicker()
{   turnEverythingOff();   Int X = 10;   Para(Int  = 0;  !=750; +=2)   {   Int randomLayer = Aleatorio(0,4);   Int randomColumn = Aleatorio(0,16);   digitalWrite(Capa[randomLayer], 1);   digitalWrite(Columna[randomColumn], 0);   Retraso(X);   digitalWrite(Capa[randomLayer], 0);   digitalWrite(Columna[randomColumn], 1);   Retraso(X);   }
}
lluvia aleatoria
Vacío randomRain()
{   turnEverythingOff();   Int X = 100;   Para(Int  = 0; !=60; +=2)   {     Int randomColumn = Aleatorio(0,16);     digitalWrite(Columna[randomColumn], 0);     digitalWrite(Capa[0], 1);     Retraso(X+50);     digitalWrite(Capa[0], 0);     digitalWrite(Capa[1], 1);     Retraso(X);     digitalWrite(Capa[1], 0);     digitalWrite(Capa[2], 1);     Retraso(X);     digitalWrite(Capa[2], 0);     digitalWrite(Capa[3], 1);     Retraso(X+50);     digitalWrite(Capa[3], 0);     digitalWrite(Columna[randomColumn], 1);   }
}
rectángulo diagonal
Vacío diagonalRectangle()
{   Int X = 350;   turnEverythingOff();   Para(Int Contar = 0; Contar<5; Contar++)   {     arriba a la izquierda     Para(Int  = 0; <8; ++)     {       digitalWrite(Columna[], 0);     }     digitalWrite(Capa[3], 1);     digitalWrite(Capa[2], 1);     Retraso(X);     turnEverythingOff();     medio medio     Para(Int  = 4; <12; ++)     {       digitalWrite(Columna[], 0);     }     digitalWrite(Capa[1], 1);     digitalWrite(Capa[2], 1);     Retraso(X);     turnEverythingOff();     abajo a la derecha     Para(Int  = 8; <16; ++)     {       digitalWrite(Columna[], 0);     }     digitalWrite(Capa[0], 1);     digitalWrite(Capa[1], 1);     Retraso(X);     turnEverythingOff();     medio inferior     Para(Int  = 4; <12; ++)     {       digitalWrite(Columna[], 0);     }     digitalWrite(Capa[0], 1);     digitalWrite(Capa[1], 1);     Retraso(X);     turnEverythingOff();     abajo a la izquierda     Para(Int  = 0; <8; ++)     {       digitalWrite(Columna[], 0);     }     digitalWrite(Capa[0], 1);     digitalWrite(Capa[1], 1);     Retraso(X);     turnEverythingOff();     medio medio     Para(Int  = 4; <12; ++)     {       digitalWrite(Columna[], 0);     }     digitalWrite(Capa[1], 1);     digitalWrite(Capa[2], 1);     Retraso(X);     turnEverythingOff();     arriba a la derecha     Para(Int  = 8; <16; ++)     {       digitalWrite(Columna[], 0);     }     digitalWrite(Capa[2], 1);     digitalWrite(Capa[3], 1);     Retraso(X);     turnEverythingOff();     parte superior del medio     Para(Int  = 4; <12; ++)     {       digitalWrite(Columna[], 0);     }     digitalWrite(Capa[2], 1);     digitalWrite(Capa[3], 1);     Retraso(X);     turnEverythingOff();   }   arriba a la izquierda   Para(Int  = 0; <8; ++)   {     digitalWrite(Columna[], 0);   }   digitalWrite(Capa[3], 1);   digitalWrite(Capa[2], 1);   Retraso(X);   turnEverythingOff();
}
Hélice
Vacío Hélice()
{   turnEverythingOff();   Int X = 90;   Para(Int y y = 4; y y>0; y y--)   {     Para(Int  = 0; <6; ++)     {       activar la capa       digitalWrite(Capa[y y-1], 1);       a1       turnColumnsOff();       digitalWrite(Columna[0], 0);       digitalWrite(Columna[5], 0);       digitalWrite(Columna[10], 0);       digitalWrite(Columna[15], 0);       Retraso(X);       b1       turnColumnsOff();       digitalWrite(Columna[4], 0);       digitalWrite(Columna[5], 0);       digitalWrite(Columna[10], 0);       digitalWrite(Columna[11], 0);       Retraso(X);       c1       turnColumnsOff();       digitalWrite(Columna[6], 0);       digitalWrite(Columna[7], 0);       digitalWrite(Columna[8], 0);       digitalWrite(Columna[9], 0);       Retraso(X);       d1       turnColumnsOff();       digitalWrite(Columna[3], 0);       digitalWrite(Columna[6], 0);       digitalWrite(Columna[9], 0);       digitalWrite(Columna[12], 0);       Retraso(X);       d2       turnColumnsOff();       digitalWrite(Columna[2], 0);       digitalWrite(Columna[6], 0);       digitalWrite(Columna[9], 0);       digitalWrite(Columna[13], 0);       Retraso(X);       d3       turnColumnsOff();       digitalWrite(Columna[1], 0);       digitalWrite(Columna[5], 0);       digitalWrite(Columna[10], 0);       digitalWrite(Columna[14], 0);       Retraso(X);     }   }   d4   turnColumnsOff();   digitalWrite(Columna[0], 0);   digitalWrite(Columna[5], 0);   digitalWrite(Columna[10], 0);   digitalWrite(Columna[15], 0);   Retraso(X);
}
espiral de entrada y salida
Vacío spiralInAndOut()
{   turnEverythingOn();   Int X = 60;   Para(Int  = 0; <6; ++)   {     espiral en el sentido de las agujas del reloj     digitalWrite(Columna[0], 1);     Retraso(X);     digitalWrite(Columna[1], 1);     Retraso(X);     digitalWrite(Columna[2], 1);     Retraso(X);     digitalWrite(Columna[3], 1);     Retraso(X);     digitalWrite(Columna[7], 1);     Retraso(X);     digitalWrite(Columna[11], 1);     Retraso(X);     digitalWrite(Columna[15], 1);     Retraso(X);     digitalWrite(Columna[14], 1);     Retraso(X);     digitalWrite(Columna[13], 1);     Retraso(X);     digitalWrite(Columna[12], 1);     Retraso(X);     digitalWrite(Columna[8], 1);     Retraso(X);     digitalWrite(Columna[4], 1);     Retraso(X);     digitalWrite(Columna[5], 1);     Retraso(X);     digitalWrite(Columna[6], 1);     Retraso(X);     digitalWrite(Columna[10], 1);     Retraso(X);     digitalWrite(Columna[9], 1);     Retraso(X);
espiral hacia fuera en sentido contrario a las agujas del reloj     digitalWrite(Columna[9], 0);     Retraso(X);     digitalWrite(Columna[10], 0);     Retraso(X);     digitalWrite(Columna[6], 0);     Retraso(X);     digitalWrite(Columna[5], 0);     Retraso(X);     digitalWrite(Columna[4], 0);     Retraso(X);     digitalWrite(Columna[8], 0);     Retraso(X);     digitalWrite(Columna[12], 0);     Retraso(X);     digitalWrite(Columna[13], 0);     Retraso(X);     digitalWrite(Columna[14], 0);     Retraso(X);     digitalWrite(Columna[15], 0);     Retraso(X);     digitalWrite(Columna[11], 0);     Retraso(X);     digitalWrite(Columna[7], 0);     Retraso(X);     digitalWrite(Columna[3], 0);     Retraso(X);     digitalWrite(Columna[2], 0);     Retraso(X);     digitalWrite(Columna[1], 0);     Retraso(X);     digitalWrite(Columna[0], 0);     Retraso(X);
espiral en contra reloj sabio     digitalWrite(Columna[0], 1);     Retraso(X);     digitalWrite(Columna[4], 1);     Retraso(X);     digitalWrite(Columna[8], 1);     Retraso(X);     digitalWrite(Columna[12], 1);     Retraso(X);     digitalWrite(Columna[13], 1);     Retraso(X);     digitalWrite(Columna[14], 1);     Retraso(X);     digitalWrite(Columna[15], 1);     Retraso(X);     digitalWrite(Columna[11], 1);     Retraso(X);     digitalWrite(Columna[7], 1);     Retraso(X);     digitalWrite(Columna[3], 1);     Retraso(X);     digitalWrite(Columna[2], 1);     Retraso(X);     digitalWrite(Columna[1], 1);     Retraso(X);     digitalWrite(Columna[5], 1);     Retraso(X);     digitalWrite(Columna[9], 1);     Retraso(X);     digitalWrite(Columna[10], 1);     Retraso(X);     digitalWrite(Columna[6], 1);     Retraso(X);
espiral hacia fuera reloj sabio     digitalWrite(Columna[6], 0);     Retraso(X);     digitalWrite(Columna[10], 0);     Retraso(X);     digitalWrite(Columna[9], 0);     Retraso(X);     digitalWrite(Columna[5], 0);     Retraso(X);     digitalWrite(Columna[1], 0);     Retraso(X);     digitalWrite(Columna[2], 0);     Retraso(X);     digitalWrite(Columna[3], 0);     Retraso(X);     digitalWrite(Columna[7], 0);     Retraso(X);     digitalWrite(Columna[11], 0);     Retraso(X);     digitalWrite(Columna[15], 0);     Retraso(X);     digitalWrite(Columna[14], 0);     Retraso(X);     digitalWrite(Columna[13], 0);     Retraso(X);     digitalWrite(Columna[12], 0);     Retraso(X);     digitalWrite(Columna[8], 0);     Retraso(X);     digitalWrite(Columna[4], 0);     Retraso(X);     digitalWrite(Columna[0], 0);     Retraso(X);   }
}
pasar por todos los leds uno a la vez
Vacío goThroughAllLedsOneAtATime()
{   Int X = 15;   turnEverythingOff();   Para(Int y y = 0; y y<5; y y++)   {     //0-3     Para(Int Contar = 4; Contar != 0; Contar--)     {       digitalWrite(Capa[Contar-1], 1);       Para(Int  = 0; <4; ++)       {         digitalWrite(Columna[], 0);         Retraso(X);         digitalWrite(Columna[], 1);         Retraso(X);       }     digitalWrite(Capa[Contar-1], 0);     }     //4-7     Para(Int Contar = 0; Contar < 4; Contar++)     {       digitalWrite(Capa[Contar], 1);       Para(Int  = 4; <8; ++)       {         digitalWrite(Columna[], 0);         Retraso(X);         digitalWrite(Columna[], 1);         Retraso(X);       }     digitalWrite(Capa[Contar], 0);     }     //8-11     Para(Int Contar = 4; Contar != 0; Contar--)     {       digitalWrite(Capa[Contar-1], 1);       Para(Int  = 8; <12; ++)       {         digitalWrite(Columna[], 0);         Retraso(X);         digitalWrite(Columna[], 1);         Retraso(X);       }     digitalWrite(Capa[Contar-1], 0);     }     //12-15     Para(Int Contar = 0; Contar < 4; Contar++)     {       digitalWrite(Capa[Contar], 1);       Para(Int Ⅰ. = 12; Ⅰ.<16; Ⅰ.++)       {         digitalWrite(Columna[Ⅰ.], 0);         Retraso(X);         digitalWrite(Columna[Ⅰ.], 1);         Retraso(X);       }     digitalWrite(Capa[Contar], 0);     }   }
}

 

Una vez que el código ha sido cargado, se puede admirar y complementar las animaciones.

Para arduinoProyectos para principiantes

4 comentarios

Niklas Heinzel

Niklas Heinzel

Die Platine kann bei mir erworben werden. Bei Interesse bitte an niklas-heinzel@gmx.de.

Niklas Heinzel

Niklas Heinzel

Die Platine kann erworben werden. Bei Interesse bitte an niklas-heinzel@gmx.de.

AxelF

AxelF

Kann man die Platine, wie abgebildet, käuflich erwerben?
Ich kann sie nämlich nicht herunterladen.

Andreas K.

Andreas K.

Hm… wie ist das mit der maximalen Strombelastung?
Ab 40mA pro Ausgangs-Pin bzw. 200mA in Summe auf allen Ausgangs-Pins (geht durch Masse bzw VCC) wird es beim 328 irgendwann kritisch.
Wenn alle LEDs leuchten, kommen mit den 220 Ohm Widerständens schon mal 300mA oder mehr zusammen, die dann insgesamt durch die Massepins fließen.
Wie lange macht der MC das mit?

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas