My 3x3x3 and 5x5x5 LED cube

Thanks to you all! Then I will get resistor aimed @15mA. As well with the programming I will only lit up 1 layer at the time :)!

Control question: If I want to lit up the whole cube, I need to do the following: -Select layer 1 (turn off layer 2/3) -Turn on all LED columns -Turn off all LED columns -Select layer 2 (turn off layer 1/3) -Turn on all LED columns -Turn off all LED columns -Select layer 3 (turn off layer 1/2) -Turn on all LED columns -Turn off all LED columns

Or is this possible as well? (I'm newbie in programming as well ;)): -Select layer 1 (turn off layer 2/3) -Turn on all LED -Turn off layer 1 -Select layer 2 -Turn off layer 2 -Select layer 3 -Turn off layer 3

I will post some pics of building this cube!

WonderTiger: Control question: If I want to lit up the whole cube, I need to do the following: ... Or is this possible as well? (I'm newbie in programming as well ;)): -Select layer 1 (turn off layer 2/3) -Turn on all LED -Turn off layer 1 -Select layer 2 -Turn off layer 2 -Select layer 3 -Turn off layer 3

That will work, yes... (for any pattern which is the same in all three layers)

Ok thanks I will keep it in mind until I got everything soldered up!

Maybe someone want to check this for the last time, to be sure I buy the right stuff:

-Transistor+22kOhms resistor should be fine right? Datasheet transistor: http://www.produktinfo.conrad.com/datenblaetter/150000-174999/163350-da-01-en-Transistor_2N3904.pdf -LED+220 ohms @15mA GREEN. Datasheet LED: http://www.produktinfo.conrad.com/datenblaetter/175000-199999/184705-da-01-en-WU_8_56_GD_LED_5mm_gruen.pdf

Thanks :grin:

You are very close, but there is a critical step that is missing.

Starting with all pins low. Turn plane 1 pin low Turn column pin(s) high Wait some amount of time(1ms or more) Turn column pins low Turn plane pin high

Usually you set things back to a neutral position, unless you know that is what you want in the next step. Usually you turn the light on, wait, turn it off, move to the next step in the sequence.

Usually cubes run static patterns, but they can also be run by calculations (like with the game of life, or random.)

Ye I did forget the delay :|.

Though for me its more like this, right?: Starting with all pins low. Turn plane 1 pin [u]high[/u] Turn column pin(s) high Wait some amount of time(1ms or more) Turn column pins low Turn plane pin [u]low[/u]

I use npn transistors that will switch to ground when current is provided to the base pin from the transistor, this is why I need to set plane 1 to a value HIGH instead of low, right?

Yes, you send high from the microcontroller to the NPN to turn the plane low.

Ok thanks! Then If you can confirm the 22kOhm will be sufficient for the 2N3904 transistor: http://www.produktinfo.conrad.com/datenblaetter/150000-174999/163350-da-01-en-Transistor_2N3904.pdf. Then I will be ready to place my order ;).

Im probably not the best person to ask about what transistor to use. Im actually considering using tiny logic level mosfets instead of BJT type transistors for something that only needs a quarter amp. One of the features of using an n channel mosfet is no resistor required.

No problem, you helped me out alot on other stuff though. Thanks again!!!

I'll guess somebody else can take a look at it :).

Is it possible for somebody to explain me why I need to use a resistor on the base from the transistor? I did alot of reading about why a resistor is needed on the base from the transistor (as NPN switch), but I keep seeing different answer on different forums this makes me understand it less and less. So if someone briefly can explain why a resistor is needed on the base (and how you calculate it) I would be very happy with it :)!

sorry for the newbie questions, still in the learning process :)

The resistor limits the current which might go in and out of whatever is driving the base of the transistor, such as an arduino pin.

WonderTiger: Is it possible for somebody to explain me why I need to use a resistor on the base from the transistor? I did alot of reading about why a resistor is needed on the base from the transistor (as NPN switch), but I keep seeing different answer on different forums this makes me understand it less and less. So if someone briefly can explain why a resistor is needed on the base (and how you calculate it) I would be very happy with it :)!

sorry for the newbie questions, still in the learning process :)

It's because once the voltage applied across the emitter/base junction of a transistor is higher then the forward voltage drop rating for that base/emitter junction it will fully turn on and act like a short circuit drawing current well in excess of it's maximum base current limit (and the maximum output current being drawn from say an arduino output pin when set high that one might wire to the base terminal), so something in the base circuit needs to limit the base current to at or below it's maximum rated current value, and a resistor wired in series with the base terminal just happens to be the simplest way to do that.

Lefty

Thanks for the explanations, now I understand why I needed it.

I got another question about the 13th pin from arduino. According to arduino pin 13th has an built in resistor so I can directly put a LED to pin 13 and ground. When I connect a column on pin 13 does the LEDs shine less bright because there is an extra resistor built in on pin 13(my 220ohm resistor + arduino uno pin 13th resistor?)

WonderTiger: Thanks for the explanations, now I understand why I needed it.

I got another question about the 13th pin from arduino. According to arduino pin 13th has an built in resistor so I can directly put a LED to pin 13 and ground. When I connect a column on pin 13 does the LEDs shine less bright because there is an extra resistor built in on pin 13(my 220ohm resistor + arduino uno pin 13th resistor?)

There is a series resistor/led wired to pin 13 mounted on most arduino boards. However the shield pin 13 is wired directly to the AVR pin so the pin is not protected by the on board resistor, so all the same current rules apply to using pin 13 as with any other AVR I/O pin.

Lefty

All the components are send today! Soon I will start building the cube :grin:.

A little programming question. What will happen when I don't use a delay between switching on and off the LED. I would guess it wouldnt turn on the LED because it's been turned on and off too fast. Will I do damage on any components if I don't use delay.

And it's true the arduino pin can take up to 200mA? So I will be able to put on 9 LEDs on 1 plane ( 9 * ~15mA= 135mA). Thanks for the help again :roll_eyes:.

Got my LED cube build today :D! This code I made as a test:

I used for() loops as delay between the columns as well for making the led columns run at their full brightness.

int layer1 = 11; 
int layer2 = 12;
int layer3 = 13;
int led1   = 10;
int led2   = 9;
int led3   = 8;
int led4   = 7;
int led5   = 6;
int led6   = 5;
int led7   = 4;
int led8   = 3;
int led9   = 2;
int r      = 1;




void setup()
{
  pinMode(layer1, OUTPUT); 
  pinMode(layer2, OUTPUT);    
  pinMode(layer3, OUTPUT);  
  pinMode(led1,   OUTPUT); 
  pinMode(led2,   OUTPUT);  
  pinMode(led3,   OUTPUT);  
  pinMode(led4,   OUTPUT);  
  pinMode(led5,   OUTPUT);  
  pinMode(led6,   OUTPUT);  
  pinMode(led7,   OUTPUT);  
  pinMode(led8,   OUTPUT);  
  pinMode(led9,   OUTPUT);  
  

}

void loop()
{
while(r<=5){
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, LOW);
  digitalWrite (led5, HIGH);
  
 for(int i = 0; i <= 15;i++){
  digitalWrite (layer1, HIGH);
  digitalWrite (led1, HIGH);
  delay(1);
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, HIGH);
  delay(1);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, HIGH);
  delay(1);
  digitalWrite (layer3, LOW);
  digitalWrite (led1, LOW);
 }

 for(int i = 0; i <= 15;i++){
  digitalWrite (layer1, HIGH);
  digitalWrite (led2, HIGH);
  delay(1);
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, HIGH);
  delay(1);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, HIGH);
  delay(1);
  digitalWrite (layer3, LOW);
  digitalWrite (led2, LOW);
 }

for(int i = 0; i <= 15;i++){
  digitalWrite (layer1, HIGH);
  digitalWrite (led3, HIGH);
  delay(1);
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, HIGH);
  delay(1);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, HIGH);
  delay(1);
  digitalWrite (layer3, LOW);
  digitalWrite (led3, LOW);
 }

 for(int i = 0; i <= 15;i++){
  digitalWrite (layer1, HIGH);
  digitalWrite (led6, HIGH);
  delay(1);
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, HIGH);
  delay(1);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, HIGH);
  delay(1);
  digitalWrite (layer3, LOW);
  digitalWrite (led6, LOW);
 }

 for(int i = 0; i <= 15;i++){
  digitalWrite (layer1, HIGH);
  digitalWrite (led9, HIGH);
  delay(1);
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, HIGH);
  delay(1);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, HIGH);
  delay(1);
  digitalWrite (layer3, LOW);
  digitalWrite (led9, LOW);
 }

 for(int i = 0; i <= 15;i++){
  digitalWrite (layer1, HIGH);
  digitalWrite (led8, HIGH);
  delay(1);
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, HIGH);
  delay(1);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, HIGH);
  delay(1);
  digitalWrite (layer3, LOW);
  digitalWrite (led8, LOW);
 }

 for(int i = 0; i <= 15;i++){
  digitalWrite (layer1,  HIGH);
  digitalWrite (led7,    HIGH);
  delay(1);
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, HIGH);
  delay(1);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, HIGH);
  delay(1);
  digitalWrite (layer3, LOW);
  digitalWrite (led7, LOW);
 }
 for(int i = 0; i <= 15;i++){
  digitalWrite (layer1, HIGH);
  digitalWrite (led4, HIGH);
  delay(1);
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, HIGH);
  delay(1);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, HIGH);
  delay(1);
  digitalWrite (layer3, LOW);
  digitalWrite (led4, LOW);
 }
 digitalWrite (led5, LOW);
 digitalWrite (layer1, LOW);
 digitalWrite (layer2, LOW);
 digitalWrite (layer3, LOW); // RESET all layers to OFF
 r = r++;                     
}
r = 1;                        
while (r<=10){
  digitalWrite (layer1, HIGH);
  digitalWrite (led1, HIGH);
  digitalWrite (led3, HIGH);
  digitalWrite (led7, HIGH);
  digitalWrite (led9, HIGH);
  delay(75);
  digitalWrite (layer1, LOW);
  digitalWrite (layer2, HIGH);
  delay(75);
  digitalWrite (layer2, LOW);
  digitalWrite (layer3, HIGH);
  delay(75);
  digitalWrite (led1, LOW);
  digitalWrite (led3, LOW);
  digitalWrite (led7, LOW);
  digitalWrite (led9, LOW);
  delay(75);
  digitalWrite (led2, HIGH);
  digitalWrite (led4, HIGH);
  digitalWrite (led6, HIGH);
  digitalWrite (led8, HIGH);
  delay(75);
  digitalWrite (layer3, LOW);
  digitalWrite (layer2, HIGH);
  delay(75);
  digitalWrite (layer2, LOW);
  digitalWrite (layer1, HIGH);
  delay(75);
  digitalWrite (led2, LOW);
  digitalWrite (led4, LOW);
  digitalWrite (led6, LOW);
  digitalWrite (led8, LOW);
  r = r++;
}
r=1;
}

Here a video :): http://www.youtube.com/watch?v=4nfarTktGv8 If anyone has some tips what I could do better on my code, feel free to let me know :).

Yay, working cube!

Another video :), multiplexed so only 1 layer is lit on any given time(im using array's and for loops to turn on the LEDs, easier to program/the code is shorter): http://www.youtube.com/watch?v=n4JEfAUBjKc

edit: this code has even less lines as the one that I showed 2 posts back :).

Neat! Nice work. Would you mind posting the new code as a reference? Definitely think it would be helpful for me as jump into the programming of my cube. Thanks.

Yep no problem(this code is a little different than showed in the video):

/* 3x3x3 LED cube 
 * ------------
 * Created January 2013
 * http://arduino.cc/forum/index.php/topic,144057.0.html
 * Made by M.Neuhaus
 */

int lvlPins[3] = {11,12,13};
int ledPins[9] = {10,9,8,7,6,5,4,3,2};
int repeat_value = 0;
int speed_value;    //Used in a double while loop
int randomledPins;
int randomlvlPins;

void setup()
{
  for(int i=0; i<3; i++){
    pinMode(lvlPins[i], OUTPUT);
  }
  for(int i=0; i<9; i++){
    pinMode(ledPins[i], OUTPUT);
  }
}
void loop(){
  repeat_value = 0;
  speed_value = 50;
  while(speed_value > 1){  
    while(repeat_value < speed_value){
        for(int i=0; i<3; i++){digitalWrite(ledPins[i], HIGH);}
        for(int i=0; i<3; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}
        for(int i=0; i<3; i++){digitalWrite(ledPins[i], LOW);}
        repeat_value+=1;  //wall 0,1,2 
    }                                                                                          
    repeat_value = 0;        
    while(repeat_value < speed_value){
        for(int i=0; i<3; i++){digitalWrite(ledPins[i+2+i*2], HIGH);}
        for(int i=0; i<3; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}
        for(int i=0; i<3; i++){digitalWrite(ledPins[i+2+i*2], LOW);}
        repeat_value+=1;  //wall 2,5,8
    }  
    repeat_value = 0;  
    while(repeat_value < speed_value){
        for(int i=0; i<3; i++){digitalWrite(ledPins[i+6], HIGH);}
        for(int i=0; i<3; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}
        for(int i=0; i<3; i++){digitalWrite(ledPins[i+6], LOW);}
        repeat_value+=1;  //wall 6,7,8
    }  
    repeat_value = 0;  
    while(repeat_value < speed_value){
        for(int i=0; i<3; i++){digitalWrite(ledPins[i+i*2], HIGH);}
        for(int i=0; i<3; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}
        for(int i=0; i<3; i++){digitalWrite(ledPins[i+i*2], LOW);}
        repeat_value+=1;  //wall 0,3,6
    }     
    repeat_value = 0; 
    speed_value-=5;       //acceleration
  }        
  while(repeat_value<200){
    digitalWrite(lvlPins[0], HIGH);
    digitalWrite(ledPins[4], HIGH);
    delay(1);
    digitalWrite(lvlPins[0], LOW);
    digitalWrite(lvlPins[1], HIGH);
    for(int i=0; i<3; i++){digitalWrite(ledPins[i+3], HIGH); digitalWrite(ledPins[1], HIGH); digitalWrite(ledPins[7], HIGH);}
    delay(1);
    digitalWrite(lvlPins[1], LOW);
    for(int i=0; i<3; i++){digitalWrite(ledPins[i+3], LOW); digitalWrite(ledPins[1], LOW); digitalWrite(ledPins[7], LOW);}
    digitalWrite(lvlPins[2], HIGH);
    digitalWrite(ledPins[4], HIGH);
    delay(1);
    digitalWrite(lvlPins[2], LOW);
    digitalWrite(ledPins[4], LOW);
    repeat_value+=1;      //Orb
  }
  repeat_value=0;
  while(repeat_value<500){
    for(int i=0; i<5; i++){digitalWrite(ledPins[i+i], HIGH);}
    for(int i=0; i<1; i++){digitalWrite(lvlPins[i+1], HIGH); delay(1); digitalWrite(lvlPins[i+1], LOW);}
    repeat_value+=1;   //Orb expands to 4 corners of cube
  }
  repeat_value = 0;
  while(repeat_value<400){
    for(int i=0; i<5; i++){digitalWrite(ledPins[i+i], HIGH);}
    for(int i=0; i<3; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}
    for(int i=0; i<5; i++){digitalWrite(ledPins[i+i], LOW);}
    if(repeat_value>200){
      for(int i=0; i<4; i++){digitalWrite(ledPins[2*i+1], HIGH);}  //Led 1,3,5,7 ON
      for(int i=0; i<1; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}
      if(repeat_value>250){
        for(int i=0; i<1; i++){digitalWrite(lvlPins[i+1], HIGH); delay(1); digitalWrite(lvlPins[i+1], LOW);}
      }
      if(repeat_value>300){
        for(int i=0; i<1; i++){digitalWrite(lvlPins[i+2], HIGH); delay(1); digitalWrite(lvlPins[i+2], LOW);}
      }
      for(int i=0; i<4; i++){digitalWrite(ledPins[2*i+1], LOW);}
    }            
    repeat_value+=1;
  }
  repeat_value=0;
  for(int i=0; i<9; i++){digitalWrite(ledPins[i], HIGH);}
  while(repeat_value<200){
    for(int i=0; i<2; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}  
    repeat_value+=1;   // Only layer 1, 2 ON
  }
  repeat_value=0;
  while(repeat_value<150){
    for(int i=0; i<1; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}  
    repeat_value+=1;   //Only layer 1 ON
  }
  for(int i=0; i<9; i++){digitalWrite(ledPins[i], LOW);}
  repeat_value=0;
  while(repeat_value<60){
    randomledPins=random(9);
    randomlvlPins=random(3);
    digitalWrite(ledPins[randomledPins], HIGH);
    digitalWrite(lvlPins[randomlvlPins], HIGH);
    delay(50);
    digitalWrite(ledPins[randomledPins], LOW);
    digitalWrite(lvlPins[randomlvlPins], LOW);
    repeat_value+=1;
  }
  repeat_value = 0;
  speed_value = 0;  
  while(repeat_value<5){
    while(speed_value<30){    //Use of 'speed_value' due double while loop
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+1], HIGH);}
      for(int i=0; i<3; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+1], LOW);}
      speed_value+=1;
    }
    speed_value = 0;
    while(speed_value<30){
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+2], HIGH);}
      for(int i=0; i<1; i++){digitalWrite(lvlPins[i+2], HIGH); delay(1); digitalWrite(lvlPins[i+2], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+2], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+1], HIGH);}
      for(int i=0; i<1; i++){digitalWrite(lvlPins[i+1], HIGH); delay(1); digitalWrite(lvlPins[i+1], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+1], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i], HIGH);}
      for(int i=0; i<1; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i], LOW);}
      speed_value+=1;
    }
    speed_value = 0;
    while(speed_value<90){
      for(int i=0; i<9; i++){digitalWrite(ledPins[i], HIGH);}
      for(int i=0; i<1; i++){digitalWrite(lvlPins[i+1], HIGH); delay(1); digitalWrite(lvlPins[i+1], LOW);}
      for(int i=0; i<9; i++){digitalWrite(ledPins[i], LOW);}
      speed_value+=1;
    }
    speed_value = 0;
    while(speed_value<30){
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i], HIGH);}
      for(int i=0; i<1; i++){digitalWrite(lvlPins[i+2], HIGH); delay(1); digitalWrite(lvlPins[i+2], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+1], HIGH);}
      for(int i=0; i<1; i++){digitalWrite(lvlPins[i+1], HIGH); delay(1); digitalWrite(lvlPins[i+1], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+1], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+2], HIGH);}
      for(int i=0; i<1; i++){digitalWrite(lvlPins[i], HIGH); delay(1); digitalWrite(lvlPins[i], LOW);}
      for(int i=0; i<3; i++){digitalWrite(ledPins[3*i+2], LOW);}
      speed_value+=1;
    }
  repeat_value+=1;
  speed_value = 0;
  }
}