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:
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.
4 comentarios
Niklas Heinzel
Die Platine kann bei mir erworben werden. Bei Interesse bitte an niklas-heinzel@gmx.de.
Niklas Heinzel
Die Platine kann erworben werden. Bei Interesse bitte an niklas-heinzel@gmx.de.
AxelF
Kann man die Platine, wie abgebildet, käuflich erwerben?
Ich kann sie nämlich nicht herunterladen.
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?