Cubo de leds 3x3x3 + Arduino

Hacia tiempo que había visto los cubos de leds en Youtube y algunos son realmente impresionantes, asi que me decidí a hacer uno, pero de los sencillos, de 3x3x3 leds.
(En Youtube los hay de hasta 16x16x16 leds)

Este ha sido el resultado de mi cubo 3x3x3 de leds:

Cubo de Leds 3x3x3

Cubo de Leds 3x3x3


Pero… ¿Cómo se hace?

Sigue leyendo para verlo

Primero que nada, hay que construir una especie de plantilla, para poder posicionar bien los leds y efectuar el doblado de las patillas, sin que se deforme, o que por lo menos parezca un cubo al estar terminado.

Para esto, una madera fina, y un taladro con broca del 5 (justo el tamaño de los leds 5mm), y realizamos la plantilla con los 9 agujeros en forma de cubo y uno en el centro, tal que asi:

Plantilla

Plantilla para cubo de leds 3x3x3

Una vez tengamos la plantilla terminada, colocamos los leds dentro de forma que queden los cátodos (patilla más corta) hacia adentro del cubo. Deben quedar los cátodos hacia adentro ya que son éstos los que conectaremos para formar el primer “nivel” del cubo, así que doblamos y conectamos los cátodos de los leds para que quede un “cátodo común” para todos los leds. Yo heché mano de unas pinzas de cocodrilo y procedemos a soldarlos.

Doblamos los cátodos y nos ayudamos de pinzas

Una vez soldados los cátodos retiramos la estructura que queda, y realizamos el mismo paso 3 veces, para obtener 3 estructuras de 9 leds conectados por sus cátodos, que serán los 3 niveles o filas del cubo.

Estructuras de leds

Una vez que tengamos las estructuras de los leds, procedemos a conectarlas entre sí, y para ello utilizando la misma plantilla colocamos una de las estructuras dentro, con ayuda de unas pinzas de cocodrilo colocamos otra estructura encima y soldamos los ánodos de los leds esta vez, repitiendo el paso para la última estructura y finalizando el cubo.

Estructuras montadas para soldar los ánodos

Y así, finalizamos el cubo, de modo que tenemos un cubo con 9 patillas donde cada una de ellas corresponde al ánodo de los 3 leds de esa misma columna,  y 3 niveles o filas de leds conectados por sus cátodos.

Si lo vieramos de un modo informático, es un array bidimensional de leds, tenemos “columnas” y “filas”, y así es como accederemos a cada uno de los leds con Arduino.

Cubo de Leds 3x3x3

Cubo de Leds 3x3x3

Terminado el cubo procedemos a la conexión con Arduino. Dado que son leds, necesitan de una pequeña resistencia así que conectamos cada uno de los pines del cubo con una resistencia de 220 Ω, a 9 pines digitales del Arduino.

Para conectar los cátodos ó los 3 niveles del cubo, debemos utilizar 3 transistores NPN, en mi caso usé 2N3904.

Así que conectamos cada uno de los 3 niveles al colector de 3 transistores NPN, la base de los transistores se conectaría a los pines digitales del Arduino, y el emisor a masa o GND.

Así utilizamos el transistor en conmutación, de modo que al enviar con Arduino un valor lógico HIGH a uno de los transistores, éste entrará en saturación, “conectando” el colector con el emisor, de forma que el cátodo del diodo led se “conectaría” a masa y encendería.

La forma de conectarlo todo es la siguiente:


Y una vez conectado, declaramos los pines como un array de filas y columnas, y que decir, es simplemente encender unos leds 😉

Debido a las altas peticiones de código para encender el cubo, dejo aquí el código correspondiente al momento en que se encienden los leds aleatoriamente:


int Columnas[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int Filas[] = {12, 11, 10};
int RandFila;     //Variable para fila aleatoria
int RandColumna;  //Variable para columna aleatoria

void setup()
{
  int contador;

  for (int contador = 1; contador < 10; contador++){
    pinMode(Columnas[contador], OUTPUT); }

  for (int contador = 1; contador < 4; contador++){
    pinMode(Filas[contador], OUTPUT); }
}

void loop()
{
  RandLed();
}

void RandLed()
{
  RandFila = random(0,3);
  RandColumna = random(0,9);

  digitalWrite(Filas[RandFila], HIGH);
  digitalWrite(Columnas[RandColumna], HIGH);

  delay(75);

  digitalWrite(Filas[RandFila], LOW);
  digitalWrite(Columnas[RandColumna], LOW);

  delay(50);
}

En funcionamiento:

😀

Anuncios

449 comentarios en “Cubo de leds 3x3x3 + Arduino

    • Fernando, el positivo de los leds va al ánodo de los leds de la primera planta, en las plantas superiores lo que haces es poner GND para cerrar el circuito y poder encender los leds.

      Saludos!

    • Jorge, utilicé un Arduino UNO, pero para el cubo de 3x3x3 puedes utilizar cualquiera de las placas Arduino. Ya para ampliar el cubo, 4x4x4 por ejemplo, no es válido el Arduino UNO ya que no tiene suficientes pines.

      Saludos!

    • Jorge, el Arduino tiene su propio lenguaje de programación basado en Wiring. Es muy parecido a C.

      El coste quitando la placa Arduino (22€) es muy bajo, 27 leds por unos euros, resistencias, cables y transistores por menos de 3 €.

      Saludos!

    • Tazma, las medidas son a elección, yo personalmente fabriqué el molde para hacer el cubo, con la distancia suficiente entre los leds para que los cátodos de los leds se solaparan lo suficiente para poder soldarlos sin problemas, tal y como se ve en una de las imágenes del post.

      Saludos!

  1. ok gracias ya me di cuenta una cosa preguntoestopor soy novato
    ya lo yengo casi montado el cubo
    que alternativa tengo ha esto 2N3904
    salu2

  2. Hola de nuevo. Te vuelvo a felicitar por todas las dudas que vas resolviendo a todos los “novatos” como yo (Yo el que más). He hecho un cubo de 4x4x4 con un arduino mega variando el programa un poco e increiblemente para mi, ha funcionado. JAJAJAJAJA!!
    Ahora tengo una duda: supongo que es bastante más complicado para explicarlo aquí, pero he comprado unos registros de desplazamiento (74HC595D) para ir probando. Quería saber como se programa el arduino para que se comunique con los registros de desplazamiento para poder hacer un cubo más grande o incluso uno con leds RGB.
    Muchas gracias de nuevo.

    Alex

    • Alex, tengo pendiente hacer un post con los registros de desplazamiento, ya que no son sencillos de utilizar precisamente.

      Yo para aprender a usarlos, utilicé el post que está en la web de Arduino oficial, este: http://www.arduino.cc/es/Tutorial/ShiftOut

      La verdad es que está bien explicado con esquemas y varios códigos tratar con los registros 74595.

      Saludos!

      P.D.: Cuelga un vídeo si puedes del cubo para que lo veamos! 🙂

  3. como no se puede editar pues pongo otro post jeje me podrias decir como aprendo a programar en arduino y se puede traspasar este codigo a un pic
    salu2

    • Tazma, no es posible traspasar el código de un Arduino a un PIC, no sin traducirlo antes ya que son lenguajes distintos.

      El lenguaje de Arduino está basado en Wiring y el de los PICs es CCS, basado en C.

      Para aprender Arduino te recomiendo la web oficial de Arduino, ya que tiene muchos ejemplos y explicaciones en castellano sobre programación, librerías, esquemas, etc.

      Saludos!

    • Tazma, no es posible traspasar el código de un Arduino a un PIC, no sin traducirlo antes ya que son lenguajes distintos.

      El lenguaje de Arduino está basado en Wiring y el de los PICs es CCS, basado en C.

      Para aprender Arduino te recomiendo la web oficial de Arduino (http://www.arduino.cc/es/), ya que tiene muchos ejemplos y explicaciones en castellano sobre programación, librerías, esquemas, etc.

      Saludos!

  4. hola aqui estoy otra vez
    corrigeme que se guro que me confundo
    segun leo aqui si vas ampliando
    digitalWrite(filas
    digital(columnas
    amplias el juego de luces y esto que as puesto es para fila 1 que seria la 1º empezando por abajo ?
    veo que lo que remarco en descontinuas pones HIGH que es alto
    pero mas abajo pones LOW HIGH es o por que es y se tendria que hacer en cada columna
    si soy pesdado dimelo pero es soy muy novato y tengo dudas

    salu2

    Daniel B, los leds están declarados como un array de filas y columnas, de modo que para hacer combinaciones de encendido, el método más sencillo sería ir encendiendo cada uno de los leds y apagándolos después de X tiempo simplemente haciendo un “digitalWrite” del led que quieras encender. Así:

    digitalWrite(Filas[1], HIGH); ———————————-
    digitalWrite(Columnas[1], HIGH); —————————

    delay(75);

    digitalWrite(Columnas[1], LOW); —————————–
    digitalWrite(Filas[1], HIGH); ————————-

    Ese trozo de código, te encenderá el led correspondiente a la columna 1, de la fila 1, durante 75 milisegundos, y lo apagará.
    Si lo metes en el loop, parpadeará rápidamente.

    Saludos!

    • Tazma, así es, el código ese encenderá un led de la Fila[1] y Columna[1], no te puedo decir si es el de más abajo o no, ya que dependerá de como lo tengas conectado en los pines cada uno de las 9 columnas.

      El código tiene un error, aquí te lo pongo corregido, lo que hace es lo siguiente:

      digitalWrite(Filas[1], HIGH); // Señal HIGH a la base del transistor de la fila 1, por tanto, conexión a GND
      digitalWrite(Columnas[1], HIGH); // Señal HIGH a la columna 1, se encenderá el led de la fila que tenga GND (Fila 1)

      delay(75); // Esperamos un momento

      digitalWrite(Columnas[1], LOW); // Apagamos el led.
      digitalWrite(Filas[1], LOW); // “Cortamos” GND

      Ya me cuentas!

      Saludos!!

      • a ver si se explicarme bien sobre lo que me comentas con el codigo jeje ten paciencia con migo que soy un aficionado
        como comentas dices que hay un error yo e sustituido
        esto
        digitalWrite(Filas[RandFila], HIGH);
        digitalWrite(Columnas[RandColumna], HIGH);

        delay(75);

        digitalWrite(Filas[RandFila], LOW);
        digitalWrite(Columnas[RandColumna], LOW);

        delay(50);
        }

        por esto

        digitalWrite(Filas[1], HIGH); // Señal HIGH a la base del transistor de la fila 1, por tanto, conexión a GND
        digitalWrite(Columnas[1], HIGH); // Señal HIGH a la columna 1, se encenderá el led de la fila que tenga GND (Fila 1)

        delay(75); // Esperamos un momento

        digitalWrite(Columnas[1], LOW); // Apagamos el led.
        digitalWrite(Filas[1], LOW); // “Cortamos” GND
        delay(50);
        }

        pero solo funcionan 2 leds
        seguro que estoy haciendo algo mal no?

        • Tazma, no estás haciendo nada mal, ese código es para encender 1 led nada más, para seguir encendiendo los demás, debes repetir ese mismo código cambiando los números de filas y columnas.

    • Lisy, como bien ha dicho Tazma (Gracias!) las patillas que están soldadas entre si en cada “nivel” del cubo, son los cátodos, los pines negativos, los más cortitos.

      Saludos!

  5. muy bueno el proyecto, todavia no me ha llegado mi arduino uno q compre, pero quise hacer la prueba con Simulator for Arduino pero el codigo me tira error, columna[contador]
    no se xq no toma el del contador para pasarlo para q prende el pin!! lei todo el codigo y no tiene error, tenes idea xq no toma el valor de contador?? es como q columna[contador] es una variable entera y no un array

    • Martin, no puedo decirte el fallo porque puede ser, ya que en el entorno de Arduino, el código funciona correctamente.

      Es posible que el fallo sea por el propio simulador que estás utilizando.

      En cuanto te llegue el Arduino, compruébalo y si te da error en el entorno oficial de Arduino, nos cuentas y vemos que ocurre.

      Saludos!

  6. hola otra vez por aqui alguien me puede explicar este error
    sketch_dec10a:4: error: ‘diagnol’ does not name a type

  7. ok gracias ya la modifique 🙂
    una pregunta me baje de una web un codigo de un cubo led pero al pasarlo al ide
    meda un monton de errores como puede ser posible

    • Tazma, cada cubo de los que existen por internet será diferente en cuanto a pines seguramente y alguna que otra diferencia de construcción.

      El código para programar el cubo depende de la forma en la que hayas construido el cubo.

      Un saludo!

    • Carlos Baños, el valor de las resistencias de base de los transistores, lo calculas tu mismo para asegurar la saturación del transistor.

      Normalmente un transistor de pequeña señal, se satura con pocos miliAmperios, por tanto, para obtener por ejemplo 10 miliAmperios en la base, usas la Ley de Ohm: Resistencia = Voltaje / Intensidad

      Resistencia = 5V (De los pines de Arduino) / 0,010 A (10 mA para la base del transistor) = 500 Ohmios.

      A partir de ahí buscas un valor estándar que sea Ohmios arriba, Ohmios abajo, por ejemplo 560 Ohmios o 470 Ohmios.

      Un saludo!

  8. disculpa soy algo nuevo en esto de programar, con que instruccion se puede repetir cada secuencia sierto tiempo, por ejemplo cuando los leds se prenden aleatoriamente se queden ejecutandose por 9 segundos y despues cambien a otra rutina

    • Carlos baños, puedes utilizar este trozo de código:

      int tiempo; // Variable que almacena el tiempo
      int tiempoMax; // Variable que almacena el tiempo máximo

      void loop()
      {
      tiempo = millis() // Almacenamos en la variable tiempo el tiempo desde que está encendido el Arduino

      tiempoMax = tiempo + 9000; // Aumentamos el tiempo maximo en 9 segundos.

      do{ // Mientras que no pasen los 9 segundos…

      tiempo = millis(); // Actualizamos el tiempo

      // AQUI DONDE VA EL CODIGO DE LA SECUENCIA DE LOS LEDS

      }while(tiempo <= tiempoMax)
      }

      He intentado explicarlo del mejor modo posible, no se si se entenderá, pero es lo que yo haría sin la necesidad de un reloj en tiempo real externo que nos dé una base de tiempo con la que trabajar más tranquilamente.

      Saludos!

  9. Hola, me gustaria saber cual es la resistencia q colocas en la base del trancistor y como la calculas?

    • Saul Oviedo, la resistencia la puedes calcular usando la Ley de Ohm: Resistencia = Voltaje / Intensidad

      En este caso, la intensidad que necesitas, es la mínima suficiente para saturar el transistor, el 2N3904 con unos 10 miliAmperios satura perfectamente, por tanto, hacemos la cuenta:

      Resistencia = 5 Voltios / 0,010 Amperios

      Resistencia = 500 Ohms.

      Puedes jugar con los valores de corriente desde el mínimo de corriente necesaria para saturar el transistor (Este valor lo vemos el Datasheet del 2N3904) y así calcular todo perfectamente.

      Saludos!

  10. Tu PROYECTO ME ENCANTO esta es una forma de prender todos los leds en el entorno arduino saludos

    void setup () {

    pinMode (1, OUTPUT);
    pinMode (2, OUTPUT);
    pinMode (3, OUTPUT);
    pinMode (4, OUTPUT);
    pinMode (5, OUTPUT);
    pinMode (6, OUTPUT);
    pinMode (7, OUTPUT);
    pinMode (8, OUTPUT);
    pinMode (9, OUTPUT);
    pinMode (10, OUTPUT);
    pinMode (11, OUTPUT);
    pinMode (12, OUTPUT);
    }
    void loop () {

    // Cubo completo

    digitalWrite (1, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (2, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (3, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (4, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (5, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (6, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (7, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (9, HIGH);
    digitalWrite (10, HIGH);
    digitalWrite (1, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (2, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (3, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (4, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (5, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (6, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (7, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (9, HIGH);
    digitalWrite (11, HIGH);
    digitalWrite (1, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (2, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (3, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (4, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (5, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (6, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (7, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (12, HIGH);
    digitalWrite (9, HIGH);
    digitalWrite (12, HIGH);
    delay (1500);
    digitalWrite (1, LOW);
    digitalWrite (10, LOW);
    digitalWrite (2, LOW);
    digitalWrite (10, LOW);
    digitalWrite (3, LOW);
    digitalWrite (10, LOW);
    digitalWrite (4, LOW);
    digitalWrite (10, LOW);
    digitalWrite (5, LOW);
    digitalWrite (10, LOW);
    digitalWrite (6, LOW);
    digitalWrite (10, LOW);
    digitalWrite (7, LOW);
    digitalWrite (10, LOW);
    digitalWrite (8, LOW);
    digitalWrite (10, LOW);
    digitalWrite (9, LOW);
    digitalWrite (10, LOW);
    digitalWrite (1, LOW);
    digitalWrite (11, LOW);
    digitalWrite (2, LOW);
    digitalWrite (11, LOW);
    digitalWrite (3, LOW);
    digitalWrite (11, LOW);
    digitalWrite (4, LOW);
    digitalWrite (11, LOW);
    digitalWrite (5, LOW);
    digitalWrite (11, LOW);
    digitalWrite (6, LOW);
    digitalWrite (11, LOW);
    digitalWrite (7, LOW);
    digitalWrite (11, LOW);
    digitalWrite (8, LOW);
    digitalWrite (11, LOW);
    digitalWrite (9, LOW);
    digitalWrite (11, LOW);
    digitalWrite (1, LOW);
    digitalWrite (12, LOW);
    digitalWrite (2, LOW);
    digitalWrite (12, LOW);
    digitalWrite (3, LOW);
    digitalWrite (12, LOW);
    digitalWrite (4, LOW);
    digitalWrite (12, LOW);
    digitalWrite (5, LOW);
    digitalWrite (12, LOW);
    digitalWrite (6, LOW);
    digitalWrite (12, LOW);
    digitalWrite (7, LOW);
    digitalWrite (12, LOW);
    digitalWrite (8, LOW);
    digitalWrite (12, LOW);
    digitalWrite (9, LOW);
    digitalWrite (12, LOW);

    delay (200);
    }

Deja un comentario!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s