Interés general

Cubo Led con Arduino

Hacía mucho que quería armar el conocido cubito, pero por falta de tiempo siempre quedaba para después. Lo hice de 3x3x3 leds, y me hubiese gustado hacerlo un poco más grande, pero el «problema» está en que si, por ejemplo, se aumenta en 1 el lado, la cantidad de leds ya pasan a ser 64 y el presupuesto se estira mucho. Mejor lo dejamos en 27 leds xD

Para quienes preguntan, aquí dejo un pequeño how to (sin imágenes porque olvidé sacar el paso a paso) y un video de lo que quedó.

Materiales: 27 leds (yo usé de alta luminiscencia), 12 resistencias de 1KΩ (9 para los leds, 3 para los transistores), 3 transistores 2N3904, una placa Arduino Uno (pueden ser las otras), cables «de colores» y si tienen protoboard en buena hora, sino se puede también.

Pasos y Conexiones:

Haz una plantilla de cartón o madera (algo rígido) con agujeros de 5mm, en los que pondrás los leds y doblarás las patas para luego soldarlos. Una vez ubicados los 9 leds, debes doblar y unir entre sí los cátodos (patas cortas) de todos los leds, dejando sin doblar los ánodos. Con eso tendrás listo un «piso». Repite el paso 3 veces haciendo «3 pisos». Una vez que ya tienes los 3 pisos, los unes entre ellos por medio de los ánodos. Con eso tendrás 9 ánodos en la base que conectan con los ánodos de los otros pisos y 3 pisos unidos por los cátodos.

A cada uno de esos 9 ánodos que tenemos en la base, les pondremos una resistencia, y luego los conectaremos a las salidas del arduino ( yo conecté de la 1 a la 9). Las salidas 10, 11 y 12 irán cada una a una resistencia, y luego a la base de cada transistor (los usaremos en modo conmutación). Los emisores de los 3 transistores, los unimos y los mandamos a masa (pin GND). Y por último, a los 3 colectores mandamos los 3 pisos del cubo.

Código: Para hacerlo un poco más amplio, utilicé la librería ledcube.h con la cuál trabajamos en C sin problemas, e incluso podemos ampliar fácilmente el tamaño del cubo. Les dejo el code, aunque todavía me queda probar hacer más cosas:

[cpp]#include <LedCube.h>

#define SIZE 3
#define COLS (SIZE*SIZE)

byte levelPins[SIZE] = {10,11,12};
byte colPins[COLS] = {1,2,3,4,5,6,7,8,9};

LedCube cube(3, levelPins, colPins);

void setup ()
{
//    Serial.begin(9600);
}

void loop ()
{
delay(100);
cube.enableBuffer(false);

// todos test
for(byte d=25; d>2; d-=2) {
for(byte r=0; r<cube.getLevels(); r++) {
cube.lightLevel(r,d);
}
}

// random
cube.randomLight(random(25,100),100);

// columna random prende apaga nivel
for(byte x=0; x<=15; x++) {
cube.lightDrop(random(0,cube.getCols()), random(50,150));
}

// circulo en nivel random
for(byte x=0; x<=5; x++) {
cube.lightPerimeter(random(0,cube.getLevels()), random(1,5), random(25,100));
}

// columna random rapido
cube.randomColumn(25);

// apaga una columna random
cube.enableBuffer();
for(byte c=0; c<25; c++)
{
cube.fillBuffer();
cube.invertBuffer();
cube.randomColumn();
cube.drawBuffer(10);
}
cube.enableBuffer(false);

// entra y sale columna
for(byte c=1, d=0; c<=36; c++)
{
if(c%2 == 0){
for(d=0; d<20; d++) {
cube.lightColumn(2,1);
cube.lightColumn(4,1);
cube.lightColumn(6,1);
cube.lightColumn(8,1);
}
} else if(c%4 == 1) {
for(d=0; d<30; d++) {
cube.lightColumn(1,1);
cube.lightColumn(3,1);
cube.lightColumn(7,1);
cube.lightColumn(9,1);
}
} else {
for(d=0; d<70; d++) {
cube.lightColumn(5,1);
}
}
}

// diam y caja
byte diamond[] = {1,5, 2,2, 2,4, 2,5, 2,6, 2,9, 3,5};
byte box[] = {1,1, 1,2, 1,3, 1,4, 1,6, 1,7, 1,8, 1,9, 2,2,  2,1, 2,3, 2,7, 2,9,  3,1, 3,2, 3,3, 3,4, 3,6, 3,7, 3,8, 3,9};
cube.lightSequence(box, sizeof(box), 200);
cube.lightSequence(diamond, sizeof(diamond), 400);

// efecto helicoptero
cube.enableBuffer();
byte topSeq[8] = {1,4,7,8,9,6,3,2};
byte botSeq[8] = {9,6,3,2,1,4,7,8};
for(byte r = 1; r<8; r++){
for(byte s= 1; s<9; s++){
cube.clearBuffer();
cube.lightOn(1,botSeq[s]);
cube.lightOn(2,5);
cube.lightOn(3,topSeq[s]);
cube.drawBuffer(20);
}
}

// apaga un led por vez
cube.fillBuffer();
cube.drawBuffer(25);
for(byte w=0, l, c; w<27; ){
l = random(0,cube.getLevels());
c = random(0,cube.getCols());
if(cube.getBufferAt(l,c)){
cube.lightOff(l,c);
cube.drawBuffer(15+w*2);
w++;
}
}
}[/cpp]

Por último un video:

[youtube]http://www.youtube.com/watch?v=hhuAMG4r1FQ[/youtube]