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 = 0; contador < 10; contador++){
    pinMode(Columnas[contador], OUTPUT); }

  for (int contador = 0; 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:

:D

About these ads

294 pensamientos en “Cubo de leds 3x3x3 + Arduino

  1. hola alejandro muy bien el cubo pero como ya digo seria muy util para todos si colgaris los codigos a si los mas novatos podemos practicar
    salu2

    • hola pense que me llegarian notificaciones a las respuestas muchas gracias por los comentarios puedo pegar el texto completo del código, de todas formas en el video de youtube sale la fuente del código, lo que mas me gusta de esto del codigo libre y el hardware arduino es justamente el espíritu de compartir conocimiento como la ayuda entre si:
      codigo:
      void setup() {
      // initialize the digital pin as an output.
      pinMode(0, OUTPUT);
      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); // Level 1
      pinMode(10, OUTPUT); // Level 2
      pinMode(11, OUTPUT); // Level 3

      }

      void loop() {
      digitalWrite(9, HIGH);
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);

      for (int i=0; i <= 3; i++) // run loop 4 times
      {
      // all on
      digitalWrite(0, HIGH);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      delay(500);

      // all off
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      delay(500);
      }

      // wipe
      for (int i=0; i <= 5; i++) // run loop 6 times
      {
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      delay(200);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      delay(200);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(0, HIGH);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      delay(200);
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      delay(200);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      }

      // rotate
      for (int i=0; i <= 5; i++) // run loop 6 times
      {
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      delay(100);
      digitalWrite(3, LOW);
      digitalWrite(5, LOW);
      digitalWrite(2, HIGH);
      digitalWrite(6, HIGH);
      delay(100);
      digitalWrite(2, LOW);
      digitalWrite(6, LOW);
      digitalWrite(1, HIGH);
      digitalWrite(7, HIGH);
      delay(100);
      digitalWrite(1, LOW);
      digitalWrite(7, LOW);
      digitalWrite(0, HIGH);
      digitalWrite(8, HIGH);
      delay(100);
      digitalWrite(0, LOW);
      digitalWrite(8, LOW);
      }
      digitalWrite(4, LOW);
      delay(1000);

      // sequential

      byte pin[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
      // above array of 9
      {
      for (int i=0; i <= 3; i++) // run loop 4 times
      {
      for(int i=0; i<=8; i++) // loop equals number
      { // of values in array – 1
      digitalWrite(pin[i], HIGH); // write index value
      delay(100); // pause 200ms
      digitalWrite(pin[i], LOW); // write index value
      }
      }
      }

      // all on
      digitalWrite(0, HIGH);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      delay(500);

      // all off
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      delay(500);

      // random

      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);

      for (int i=0; i <= 50; i++) // run loop 50 times
      {
      int randNumber;
      int randLevel;
      {
      randNumber = random(0,8);
      randLevel = random(9,11);
      digitalWrite(randNumber, HIGH); // write index value
      digitalWrite(randLevel, HIGH); // write index value
      delay(100); // pause 100ms
      digitalWrite(randNumber, LOW); // write index value
      digitalWrite(randLevel, LOW); // write index value
      delay(10);
      }
      }

      // squares

      digitalWrite(9, HIGH); // bottom layer on
      digitalWrite(10, HIGH); // middle layer on
      digitalWrite(11, HIGH); // top layer on

      for (int i=0; i <= 2; i++) // run loop 2 times
      {
      digitalWrite(11, LOW); // top layer off
      digitalWrite(9, HIGH); // bottom layer on
      digitalWrite(2, LOW);
      digitalWrite(5, LOW);

      digitalWrite(0, HIGH);
      digitalWrite(1, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      delay(200);
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      delay(200);
      digitalWrite(3, LOW);
      digitalWrite(6, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(8, HIGH);
      delay(200);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      delay(200);
      digitalWrite(11, HIGH); // top layer on
      digitalWrite(9, LOW); // bottom layer off

      digitalWrite(2, LOW);
      digitalWrite(5, LOW);

      digitalWrite(0, HIGH);
      digitalWrite(1, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      delay(200);
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      delay(200);
      digitalWrite(3, LOW);
      digitalWrite(6, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(8, HIGH);
      delay(200);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      delay(200);

      }

      digitalWrite(9, HIGH); // turn bottom layer on

      // all off
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      delay(100);

      // walls
      for (int i=0; i <= 4; i++) // run loop 4 times
      {
      digitalWrite(5, LOW);
      digitalWrite(8, LOW);

      digitalWrite(0, HIGH);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      delay(300);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(6, HIGH);
      delay(300);
      digitalWrite(3, LOW);
      digitalWrite(0, LOW);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      delay(300);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(2, HIGH);
      digitalWrite(5, HIGH);
      delay(300);
      }

      // all on
      digitalWrite(0, HIGH);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      delay(500);

      // all off
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      delay(500);

      // trampoline
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);

      digitalWrite(0, HIGH);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);

      for (int i=0; i <= 5; i++) // run loop 5 times
      {
      digitalWrite(11, HIGH);
      delay(100);
      digitalWrite(11, LOW);
      digitalWrite(10, HIGH);
      delay(100);
      digitalWrite(10, LOW);
      digitalWrite(9, HIGH);
      delay(100);
      digitalWrite(9, LOW);
      digitalWrite(10, HIGH);
      delay(100);
      digitalWrite(10, LOW);
      }

      // all off
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      delay(500);

      // spiral down

      byte pins[] = {0, 1, 2, 5, 8, 7, 6, 3};
      // above array of 8
      {
      for (int i=0; i <= 3; i++) // run loop 3 times
      {
      byte level[] = {11, 10, 9};
      for(int i=0; i<=2; i++) // loop equals number
      { // of values in array
      digitalWrite(level[i], HIGH); // write index value

      for(int i=0; i<=7; i++) // loop equals number
      { // of values in array
      digitalWrite(pins[i], HIGH); // write index value
      delay(50); // pause 200ms
      digitalWrite(pins[i], LOW); // write index value
      }
      digitalWrite(level[i], LOW); // write index value

      }
      }
      }

      // explode
      for (int i=0; i <= 3; i++) // run loop 5 times
      {
      digitalWrite(9, LOW);
      digitalWrite(10, HIGH);
      digitalWrite(11, LOW);

      digitalWrite(4, HIGH);
      delay(500);
      digitalWrite(1, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(7, HIGH);
      delay(200);
      digitalWrite(9, HIGH);
      digitalWrite(11, HIGH);
      delay(200);
      digitalWrite(0, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      delay(500);
      // all off
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      }

      // growing boxes
      for (int i=0; i <= 3; i++) // run loop 5 times
      {
      digitalWrite(9, HIGH);
      digitalWrite(10, HIGH);
      digitalWrite(11, LOW);

      digitalWrite(0, HIGH);
      digitalWrite(1, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      delay(500);
      digitalWrite(10, LOW);
      digitalWrite(9, HIGH);

      digitalWrite(4, LOW);
      digitalWrite(1, LOW);
      digitalWrite(3, LOW);

      digitalWrite(11, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      delay(500);
      digitalWrite(11, LOW);
      digitalWrite(10, HIGH);
      digitalWrite(2, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      }

      }

        • como ago para ce¿rear ese cubo??? soy orincipiante… y que son esos cogigos??’

        • Xavier martinez, antes de empezar a crear un cubo de leds debes dar algunas lecciones básicas de electrónica y programación de placas Arduino para poder entender lo que estás realizando.

          Las explicaciones al detalle de como crear el cubo están en el post, solo hay que leer, pero sin conocimientos básicos de electrónica hasta un proyecto simple como este puede resultar muy complicado.

          Te recomiendo buscar en google algunos documentos de electrónica básica para poder entender conceptos que se utilizan para crear el cubo.

          Saludos!!

        • Xavir, vas a tener que mirar más videos en YouTube, o empezar con alguno sencillo, de los que no se programan, con leds RGB de cambio automatico son lindos.

          Esos códigos son para programar en Arduino, es la placa que será el cerebro del cubo, pero eso es un mundo complejo. Hay otras formas también para programarlo, pero todas requieren un poco de conocimiento previo, y no tener miedo de programar.

        • Alberto Enrique, el código es el que se encuentra en el blog.

          No guardé todas las combinaciones de código que se ven en el vídeo.

          Si quieres realizar más combinaciones, juega con el código o revisa los comentarios que hay mucha
          gente que a aportado sus códigos para crear diferentes combinaciones.

          Saludos

  2. muchas gracias de verdad
    ahora pregunto que por eso soy muy novato jeje
    en los codigos que quiere decir cuando se ponen 2 o 3
    }
    }
    }

    esto que significa

    salu2

    • Se están cerrando grupos que fueron abiertos con {

      Si trabajas con “Notepad++” te va a pintar el código de colores y lo interpretarás más facil.

      for (int i=0; i <= 3; i++) // run loop 3 times
      {
      **Aca el código a repetir**
      }

      "for" lo hará las veces que sea igual a 3, empieza como 0 y se le dice que le sume 1, cuando llega a 3, el "for" deja de ejecutarse y sigue adelante.

      Es muy parecido a otros lenguajes, yo se PHP y algo de este código interpreto, aún no conociéndolo a fondo.

    • Carlos Baños, geniaaal!! El de 6x6x6 es impresionante! ¿Con qué lo controlas? Ya que un Arduino Uno no tiene suficientes pines.

      Gracias por compartirlos!! Un saludo!!

      • Yo me estoy armando uno de 3x3x3 de momento creo que lo controlaré con los pines del Arduino. Pero como dices, si vas más lejos, la forma de controlarlo, al menos por lo que he visto en un video de alguien que hizo un 8x8x8 usó unos integrados llamados “Shift Register” con sólo 3 pines del Arduino, podés controlar infinitas salidas (he hecho en este video se muestra que controla 200)

        http://www.youtube.com/feed/UC42d7zFnWU0dYVk_M0JED6w/u

        De seguro ya lo viste, sino te lo recomiendo, aunque esté en inglés :P

        Ni bien termine el 3x3x3 hago un video y lo comparto. Y con suerte en un futuro paso al 5x5x5 RGB

        Pero primero me tengo que aprender mejor como animarlo.

        • Ya tengo un blog, así es, los “Shift registers” o registros de desplazamiento, son muy útiles para controlar muchas salidas con apenas unos pines del Arduino.

          El 74HC595 es uno de ellos muy común. Aunque no son precisamente sencillos de utilizar.

          Esperamos ver esos cubos! :D Saludos!

      • Lautaro, estupendo! La distancia entre led y led es más o menos la distancia de la patilla del cátodo del led, lo suficiente para al doblarla poder soldarla con el que está a su lado sin problemas.

        Saludos!

  3. lauturo????????? ese codigo que as usadome parece que ya lo vi yo en otro cubo puede ser que me confunda pero juraria que lo vi antes
    salu2

    • En la descripción está. A eso le tenés que sumar un Arduino. Sino busca guía de como hacer uno fijo, o con leds de cambio rápido o lento RGB

    • AnarkoPuagh Pienza Lucha, los materiales están en el post, solo hay que leer.

      - 27 Leds (3x3x3 leds)
      - Una tabla de madera para poder hacer el molde
      - Cables
      - 9 x Resistencias 270 Ohms
      - 3 x Transistor 2N2222 o 2N3904
      - Placa de prototipos (Opcional)
      - Placa Arduino UNO

      Saludos!

  4. muy buen aporte pero quiero hacer uno de 4x4x4 pero como hago con el codigo que debo hacer para q me funcione porq el de 3x3x3 son menos led y si me funciono espero q me ayudes ALEJANDRO

    • Oscar para un cubo de 4x4x4 necesitas multiplexor o un registro de desplazamiento como el 74HC595 para poder controlar todas las salidas necesarias desde un Arduino UNO, ya que no te alcanzan los pines para poder conectar uno de 4x4x4.

      Saludos!

  5. bro me podrias pasar el programa completo es que en el principio aparece otro y veo que le das a otro chavo otra parte y no se como ponerla porfa!!

  6. que tal me gustaria saber como puedo hacer que suene una cancion y que empiece el código a correr agradecere mucho su respuesta

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 )

Conectando a %s