Introduction: LED CUBE CODE GENERATOR 4x4x4 Arduino

This is a tutorial on how to easier make patterns for your Arduino-controlled LED cube 4x4x4.

I recognized the difficulty a lot of people have with programming the LED cube after building it, so I have made a program to make this an easy task.

The program will work for those that used a Arduino to control their LED cube. I did not write the LED cube code and the person I got it from didn't either so I don't know who wrote it, but thanks!

I will talk a little about how I wired the cube and how the program works in the next steps!

Step 1: The LED Cube Code Generator

You can download the program from my shared Dropbox folder here, you do not need to be a dropbox user to download it.: LCCG DOWNLOAD or you can download it from this instructable as a .Zip file below.

If you wired your cube "opposite" and made the anodes the floors and the cathodes the columns then you can simply download the "LCCG OPPOSITE" instead.

The program is made for Windows so it will not work on Apple computers unless you have a virtual windows.

How you wired your Arduino to the cube is of course very important for this to work like it's supposed to, it is a description of the pins in the Arduino code but I will also explain this in the next step.


How the code generator program works:

There are 4 squares with checkboxes. These squares are called plane 1, 2, 3 and 4. The planes represents the cube like you would have seen it if you looked straight at it from the front, so these are the four vertical planes of the cube. This is so it is easier to visualize your patterns when you make them. If you did not understand the planes you can take a look at the pictures, I will post one there to clear it up

To make a pattern you would simply check the boxes representing the LED's you want to light up and you hit the "Generate" button. Now you will see a line of code being published in the textbox below. If you want the code to be faster or slower you can enter a certain time in the "Enter time in m/s" box before generating the code, or change it later with the "Change generated code time" box.

So one generate would make the LED's light up for that certain amount of time, and to make a pattern just repeat this process. There are some black boxes beside the checkboxes, these are for marking the full line of LED's to save time not having to click every single checkbox.

When you are satisfied with your code you can click Ctrl+C (you don't have to mark anything) and it will copy your code to the clipboard. Then you click the "Main Code" button (Hotkey = Ctrl+Enter), and your Arduino code will pop up. Insert your generated code into this code where it says "Replace this with generated code" and click "Copy to Clipboard".

Now all you have to do is open your Arduino program and insert the code you have in your clipboard (Ctrl+v).

Arduino can also be opened from the Code Generator program where it says "Open Arduino" if you have it installed at "C:\Program Files (x86)\Arduino\arduino.exe"


If you click the "info" button there will be short info about the program and the hotkeys are listed there.

Hotkeys:

Ctrl+I = Info box

Ctrl+A = Mark/Unmark all boxes

Ctrl+X = Uncheck all boxes

Ctrl+Z = Undo generated code

Ctrl+C = Copy generated code

Enter = Generate code

Ctrl+Enter = Open main Arduino code

Delete = Remove all generated code from textbox

Updates:

19.03.2015 - Changed the label names from "columns" to "planes" to make the explanation of the cube more clear. Nothing else was done so the previous version is just as good, but with different labels of the planes.

27.03.2015 - Added a version of the program for those who have the cube wired "opposite" with 4 anode floors and 16 cathode columns.

10.02.2016 - Added several pre made patterns as "Patterns.zip". Here you will find some fun patterns and one extensive one that you can just open and run right away on your LED cube.

Step 2: Building the LED Cube

This is not a instructable on how to build your LED cube, but I will explain how I did it and how this way is really simple. There are 3 pictures above that shows the soldering of the cube and how to wire everything up to the Arduino. Hopefully the Arduino drawing will be helpful.

Components used

1x Arduino Uno board

64x blue LED

1x Prototype board to mount everything on

4x 2n2222a transistors

16x ~ 95ohm resistors

4x ~1000 ohm resistors

Wires for easy plug and unplug.

Arduino Uno

I used the Arduino Uno board for my build, it has 20 digital I/O pins in total because the analog ones can also be used as digital pins. This is exactly enough to wire up the cube directly from the Arduino, which was the reason I did it. Because this is only my prototype before making the 8x8x8 cube, I wanted to make it as simple as possible.

The Arduino's digital pins can output 5V and 40mA.

The 4x4x4 cube is a total of 64 LEDs. The way it's wired it needs 16 digital outs for the Anodes and 4 digital outs for the Cathodes. The wiring will be explained in a picture above and in the text below.

The Wiring

The LEDs are wired like the picture above which gives us 16 Anodes and 4 Cathodes. Each of the anode and cathode is also marked with a number in the picture. The 16 Anodes will be connected to the digital pins:

"0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, A4, A5" in the order they are marked on the picture from 1 - 16. That means anode number 1 in the picture is digital out nr 0 on the arduino etc.

The same goes for the Cathodes where "floor" 1 is A0, "floor" 2 is A1 etc.

"A0, A1, A2, A3".

I used blue LEDs that run on 3.1V and 20mA. Since the Arduino gives out 5V this would destroy my LEDs so you need a resistor between the digital out and the LEDs to convert the 5V to 3.1V and 20mA. This is done by using the formula: (Vs - Vd) / I

Vs = Source voltage = 5V, Vd = Diode Voltage = 3.1V, I = Max current the LEDs can handle = 20mA = 0,02A

Which gives us (5 - 3.1) / 0,02 = 95 ohm.

So we would need to add 16pcs of 95ohm resistors between the digital out and the anodes to keep the LEDs from burning and to make it light up at it's full potential.

For the 4 cathode wires we would need to ground them, but we also need to control when to ground them, so we use transistors. Using transistors enables us to use a +5V digital out from the Arduino to control a transistor that is used as a switch to ground the cathode layers. I used 4 pcs of 2n2222a transistors because they can handle the current and they are fast enough.

There can be maximum 1 layer on at a time which gives us 16 * 20mA = 320mA. This is the amount of current the transistor needs to be able to handle. It is also important to use NPN and not PNP transistors.

The wire from the first floor cathode goes to the collector of the transistor.

The emitter is connected to ground on the Arduino.

And the base of the transistor is connected to a 1kohm resistor and then to the pin A0.

Repeat this for the remaining 3 floors of cathodes.

So to summarize the wiring:

16 digital out's to - 95ohm resistors, from there to the 16 anodes.

4 digital out's to - 1kohm resistors, from there to the base of the transistors.

From the cube's 4 floor cathodes to the transistor "collector".

From the transistor "emitter" to ground on the Arduino.

And that's all there is to it, if you have any questions feel free to comment.

Comments

author
miyuru.lnbti made it! (author)2017-08-13

thanks for your instructions i made it ...its awesome

IMG_0313.JPG
author
FlorinP18 made it! (author)2017-05-28

Really good instructable, Marius. I made one following your instructions and I had a really good time playing with the program you provided. The only difference is that I used Arduino Nano instead of Uno, and red LEDs. Thanks a lot!

Do you have the intention of making an instructable for 8x8x8 LED cube any time soon? With a little program to play with? If so, I'm really eager to follow it.

20170528_104839.jpg
author
Aftaab Hussain (author)2017-01-25

where is the wiring for led cube
will the code generated be for arduino uno

author
PierreV16 (author)2017-01-01

Am a novice and is confused.

On
https://www.instructables.com/id/4x4x4-LED-Cube-Arduino-Uno/step2/Making-The-LED-Jig/I
see the anodes horizontally and cathodes connected vertically.

On
https://www.instructables.com/id/LED-CUBE-CODE-4x4x4-Arduino/I see the vertical
anodes and cathodes horizontally.

I am wrong and how is
it anyway?

author
JaredE (author)2016-09-10

LCCG and LCCG OPPOSITE zip files contain what seems to be the same generator. I have my cube wired in the opposite manner and when I try to generate a pattern using the generator, my cube lights up erratically. I would like to show only one LED on at a time.

author
JaredE (author)JaredE2016-09-10

Also, I did not use transistors on my plane pins. Could this be the problem?

author
MariusG1 (author)JaredE2016-12-09

Sorry for the late reply, you probably fixed this already. If you didn't and someone else is wondering: Yes you ABSOLUTELY need transistors, they are there to sink current from the other 16 pins.

author
JaredE (author)MariusG12016-12-10

Thanks. I will set up the cube again and see if transistors fix the problem. I need to replace one LED that has stopped working.

author
goldenshuttle (author)2016-11-28

I have seen in science fair, one older guy, who built 16X16x16..where he connected a video camera and turn it into a human head in 3D (low resolution of course)...he wouldn t share the code, but it was really cool

author
MariusG1 (author)goldenshuttle2016-12-06

Wow, that sounds like one hell of a job!!

author
goldenshuttle (author)2016-11-28

great project indeed..thumbs up

author
jbmelectric (author)2015-11-09

I buy "4X4X4 Light Cube Kit Blue Arduino shield" on Ebay. This kid have litle bit different wiring, use two 74HC595 shift register chips to drive anodes. Below is modifed main part of program to work with this kit and generated code.

....................


// this is a dummy element for end of table (duration=0) aka !!!DO NOT TOUCH!!!
B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, 0
};

/*
** Defining pins in array makes it easier to rearrange how cube is wired
** Adjust numbers here until LEDs flash in order - L to R, T to B
** Note that analog inputs 0-5 are also digital outputs 14-19!
** Pin DigitalOut0 (serial RX) and AnalogIn5 are left open for future apps
*/

int PlanePin[] = {4, 5, 6, 7};

int clockPin=0; //SH_CP of 74HC595
int latchPin=1; //ST_CP of 74HC595
int dataPin=3; //DS of 74HC595
int HC_595_E = 2;


// initialization
void setup()
{

int pin; // loop counter

pinMode( latchPin, OUTPUT );
pinMode( clockPin, OUTPUT );
pinMode( dataPin, OUTPUT );
pinMode( HC_595_E, OUTPUT );

// set up plane pins as outputs (active LOW)
for (pin=0; pin<CUBESIZE; pin++) {
pinMode( PlanePin[pin], OUTPUT );
digitalWrite(PlanePin[pin],LOW);
}

}


// display pattern in table until DisplayTime is zero (then repeat)
void loop()
{
// declare variables
byte PatternBuf[PLANESIZE]; // saves current pattern from PatternTable
int PatternIdx;
byte DisplayTime; // time*100ms to display pattern
unsigned long EndTime;
int plane; // loop counter for cube refresh
int patbufidx; // indexes which byte from pattern buffer
int ledrow; // counts LEDs in refresh loop
int ledcol; // counts LEDs in refresh loop
int ledpin; // counts LEDs in refresh loop

// Initialize PatternIdx to beginning of pattern table
PatternIdx = 0;
// loop over entries in pattern table - while DisplayTime>0
do {
// read pattern from PROGMEM and save in array
memcpy_P( PatternBuf, PatternTable+PatternIdx, PLANESIZE );
PatternIdx += PLANESIZE;
// read DisplayTime from PROGMEM and increment index
DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx++ );
// compute EndTime from current time (ms) and DisplayTime
EndTime = millis() + ((unsigned long) DisplayTime) * TIMECONST;

// loop while DisplayTime>0 and current time < EndTime
while ( millis() < EndTime ) {
patbufidx = 0; // reset index counter to beginning of buffer
// loop over planes
for (plane=0; plane<CUBESIZE; plane++) {
// turn previous plane off
if (plane==0) {
digitalWrite( PlanePin[CUBESIZE-1], HIGH );
} else {
digitalWrite( PlanePin[plane-1], HIGH );
}

digitalWrite(latchPin, LOW);
digitalWrite(HC_595_E, HIGH);
shiftOut(dataPin, clockPin, LSBFIRST, (PatternBuf[patbufidx++]|(PatternBuf[patbufidx++] << 4)));
shiftOut(dataPin, clockPin, LSBFIRST, (PatternBuf[patbufidx++]|(PatternBuf[patbufidx++] << 4)));
digitalWrite(latchPin, HIGH);
digitalWrite(HC_595_E, LOW);

// turn current plane on
digitalWrite( PlanePin[plane], LOW );
// delay PLANETIME us
delayMicroseconds( PLANETIME );



} // for plane
} // while <EndTime
} while (DisplayTime > 0); // read patterns until time=0 which signals end
}

author
kheppel71 (author)jbmelectric2016-04-18

You are a life saver, thank you for the updated code.

author
Shaunny (author)kheppel712016-11-07

Hi ,I too got the same cube kit as you and got the same problems as you could you plz send me the code you were sent ,it's driving me crazy.my email is" shaunny@outlook.com " would really help me out thanks

author
WhittlinThom (author)jbmelectric2016-07-03

To: jbmelectric.............I too bought the same 4x4x4 LED cube on eBay that you bought. I am not near as advanced in my Arduino/electronics hobby as you are so I haven't been able to get mine to work properly and I don't understand your explanation on how to work around the 74HC595. I wonder if you could take some time to help me, maybe on fb or skype. Please contact me at usthom2000@yahoo.com and we can go from there. I would be forever grateful for your help. Thank you, Thom Mulford

author
JesperL8 (author)2016-10-01

How do i control the brightness of the leds ???

And what do the plane time do ???

author
WhittlinThom (author)2016-06-21

Hi Marius, I wrote some practice code and went through the instructions to: "Replace this with generated code" and nothing happened. Then I clicked "Copy to Clipboard" and still nothing happened. Can you please give me some tips to help me copy my generated code to Arduino? Thank you, Thom Mulford

author
MariusG1 (author)WhittlinThom2016-09-10

The "copy to clipboard" button is merely a easy way to copy the whole text to your clipboard. If it somehow doesn't work you should be able to just mark the text like anywhere else and copy it and then paste it into the arduino program!

author
Carlosb90 made it! (author)2016-09-06

Hello, I follow your tutorial and made all steps but I have an problem and I like to get help to solve this.

My cube does not turn leds on like I draw in program. For example: When I want to turn a file of leds on (for example: Turn on LED 1,2,3,4) it turns on the LED 1,2,3 and 5.

I will post a pic to be more easy to understand what happens.

I just check all connections between de LED cube and Arduino Digital outputs and it's all in order and correctly connected.

LED Code generator.pngIMG_0277.JPG
author
MariusG1 (author)Carlosb902016-09-10

It sounds to me like you have a wiring problem, did you connect it all correctly to the arduino? I know you said you did, but you should go over it again. Check that you started with the correct wiring and that you didn't confuse A0 - A5, that's easy to do.

ard.jpgardd.jpgarddd.jpg
author
JaredE (author)2016-08-06

I have a cube that I built a couple years ago. Did not have it working until now. This program made it very simple!

author
jhafiz rahmat (author)2016-08-02

thank you bro, i just use your code and mod its port to adapt to my cube

i plan to build my own code with it

author
WhittlinThom (author)2016-07-03

Attn: jbmelectric:

I wrote a message for you that is below your posting here. Please check it out.

author
DjXanJscud made it! (author)2016-06-13

I made with a mdf box as a case, and instead of a Arduino uno, i used a "Generic" Arduino nano to make it a little smaller!

DSC_0020[1].JPGDSC_0021[1].JPG
author
kareemmagdy25 (author)2016-03-24

Hello,

if i want to use arduino nano instead of arduino uno, how i connect it ?

author
MariusG1 (author)kareemmagdy252016-03-27

The Arduino nano seems to have 22 pins instead of the uno's 20 pins so it should work fine. https://www.arduino.cc/en/Main/ArduinoBoardNano

Try to connect it almost the same but just define the I/O pins differently: http://statusorel.ru/technology/grbl-pinout-arduino-nano-v3-0.html

author
wmada1 (author)2016-03-26

I built a huge 4x4x4 its ballingballing

temp_-1345839582.jpg
author
wmada (author)2015-10-31

hey budddy so i built a really big 4x4x4 and i built it backwards or opposite and im having a hard time i guess finding the correct pinout the cube lights up but doesnt do what it should. i copied codes and tryed them out and im not getting the right animations i assume its not hooked up to right pins can u offer help to get the cube proper
tha ks a mill

author
MariusG1 (author)wmada2015-10-31

I just learned a little more about sinking current with the arduino and I think we can solve it with a little change in the code. I'm not sure but you can try it out.

So what you do is you wire the 4 planes that you now have as anodes to A0, A1, A2, A3. And then you connect your 16 cathodes to the rest of the pins. So basicly just the same way as the picture I have of the arduino with connections but you remove the transistors and your cube is opposite.

What we see now is that you only have 4 pins to supply current (A0-A3) and you have to define the 16 pins to sink current, this means they function like ground because their potential is defined as 0V so you get current flow. Only having 4 pins to supply voltage could be a potential problem if they cannot supply enough, but since the LEDs are on for only a cycle (they blink really fast) the current needed is less and I think it might work.

Use 16pcs of 100ohm resistors between the arduino pins and the cathodes. If you didn't understand this, just let me know and I'll make a schematic. I will inbox you the code changes so you can try it out.

author
MyfakenameM (author)MariusG12016-03-26

Would you be willing to give me the schematic for this as I have my planes as anodes and have the 16 cathodes to the rest of the pins?

author
wmada (author)MariusG12015-11-01

was thus directed at me. ? the cube works with kylethecreators code n pinout. how can i use ur method to use b1000 with same pinout or what pinout do i use my cube is wired backwards

author
Ysupov (author)2016-03-19

Hello!
We need to do a cycle for each animation

author
rgavin1 (author)2016-03-04

Hello,

Can you share the program code?

You make him with VB.NET, no?

Thank you

author
MariusG1 (author)rgavin12016-03-16

Hi!

I made this in visual studio written in C#. I guess I can share the code if you want it!

author
rgavin1 (author)MariusG12016-03-16

Thanks you if you can send me the code at : remi.gavin38@gmail.com
PS : sorry for my english il french

author
PARA19951. (author)2016-03-01

Hey there I´m building this LED cube, but I dont know if it is working with that code generator. Hope you can help me. Thanks a lot!!!

Capture.PNG
author
eyaa (author)PARA19951.2016-03-15

hey can u tell me if it worked ? because i am building mine exactly like that , thank you :)

author
MariusG1 (author)eyaa2016-03-16

If the anodes go vertical and the cathodes horisontal as it seems like this will work great!

author
MariusG1 (author)PARA19951.2016-03-16

Hi! This seems to be exactly the same way that I build mine so it should work fine!

author
m.hemanth made it! (author)2016-03-04

fireworks !!!

WP_20160304_001[1].mp4
author
markm285 (author)2016-02-13

So I've made the LED cube here:

https://www.instructables.com/id/4x4x4-LED-Cube-Ard...

and I was wondering if there is a way to use this generator to create animations for it. I've tried to use it but nothing happens once its uploaded. I know the cube itself works as I've successfully uploaded the basic code it provides. Should i copy the code into "void loop" or "void setup"? There are no transistors involved, only leds and resistors.

author
MariusG1 (author)markm2852016-02-14

As far as I understand that LED cube is made of 16 cathode columns and 4 anode planes? And I believe that it doesn't go to ground but it uses the IO's as inputs?

This is quite a problem if you are gonna make this code work on that cube because this code turns 16 anodes on or off and 4 cathodes on or off. I have no way of testing, but you might be able to rewrite the code to work but it seems to me that this way of building the cube is not an optimal way.

author
Sevja1972 made it! (author)2016-02-06

Yes, it's working. And once you figured out how the code generator work it's pure fun!!!

IMG_20160206_124507685.jpg
author
Sevja1972 (author)2016-01-31

Great project, gone build it in the coming weeks and hoping to use the code generator, but, 2 questions:

When
I read other led-cub builders, they often say that there's only 1 LED
ON at a time. So, If we see multiple leds lighting together, its because
the speed of the processor and the working of our eyes that we see them
lighting together.

In your text I read:" There can be maximum 1
layer on at a time... " Now, when we generate a code using your code
generator. How does this work? Does the software automatically lighten
each layer at 1 time or doe we self have to consider when we generate
the code.

Second question, in line whit previous, if I generate
this code: B1111,B1111,B1111,B1111 ,B1111,B1111,B1111,B1111
,B1111,B1111,B1111,B1111 ,B1111,B1111,B1111,B1111 , 10, That's, ALL ON
, how does this work, also each led at 1 time lightened (automatically
through software)? Or, 1 layer at one time or do I self have to, when I
wan't a fully lightened cube, generate a code that very fast lightens
each led at 1 time?

author
MariusG1 (author)Sevja19722016-01-31

Got your email! I will respond to it here since others might find it useful.

In the practical sense when you will actually build and program this led cube you don't have to think about which layers are on or not. If you use the code generator program as well you don't even need to think about the code at all, you just need to understand the generator program and copy paste the code. It's not a bad idea to understand how the notation B1111 B1111 .... works as well. There will be 4 instances of (B1111, B1111, B1111, B1111)x4. The first four describes which leds on the first floor is on, the next four describes the second floors and so on. So if all these four first are B1111's and the last 3 are B0000's then only floor one wil light up.

For the theoretical part and the understanding of how this works it depends a little. We have 4 layers which are connected to ground with each their transistor working as a switch (this is only so we can use a positive voltage from the arduino to ground the cathode side). So we can turn on only 1 of these layers at a time. Now assume we want to light up the entire 1st floor. We would have to ground layer 1 by providing +5V to the transistor and we would need all 16 of the anode ports +5V to be provided. Now all 16 turns on at the same time.

But, if you wanted to turn on the entire floor 1 and floor 2 at the same time, this is when we are using the concept called "persistence of vision". That means we will turn on the entire floor 1, turn it off and then turn on the entire floor 2. This will go back and forth really fast so that it seems to us that it's lighting all up at the same time. For us to experience it as non-blinking light it would have to be around 50Hz or more which is 50 blinks per second. This is exactly the way AC works in your house and your light bulbs blink at 50Hz (or maybe 60 in the US).

I don't know how much you know about coding but we can turn on several ports on a microcontroller at the same time with something called a bitshift. This is essentially what we are doing in the case where one layer will have more than 1 led lighting up.

So to sum up, only 1 led will light up at a time if there is only 1 led supposed to light on each floor but several leds can light up at the same time on the same floors.
To code this and get it to work you don't have to think about this at all, but it's nice to understand what you are doing either way.

author
sridharv3 (author)2016-01-09

it's nice...

i want 5*5 cube program to display ' veera ' and it should moving towards 4 sides of cube. its very urgent

author
sridharv3 (author)2016-01-09

it's nice...

i want 5*5 cube program to display ' veera ' and it should moving towards 4 sides of cube. its very urgent

author
CharlesC63 (author)2015-12-07

Any ways to use this for a Raspberry Pi???

author
MariusG1 (author)CharlesC632015-12-21

I'm not sure how the raspberry pi would work with this. I'd go with arduino, it's a microcontroller and the raspberry pi is more like a computer.

author
kArEnα (author)2015-11-26

can be your mailbox, I'll explain my question

About This Instructable

56,065views

435favorites

License:

Bio: Electrical engineer student and electrician
More by MariusG1:LED CUBE CODE GENERATOR 4x4x4 Arduino
Add instructable to: