LED Cube with Arduino and custom PCB

This instructable details the design and building process for a 5 x 5 x 5 LED cube, controlled with an Arduino, which resides on a custom printed circuit board. 

Additional information, photos, and videos can be found on my website.

The finished product is shown in the video below:

Remove these adsRemove these ads by Signing Up

Step 1: Design concept and materials

I have seen many designs for LED Cubes, and they all share the same problem:  How to control so many LEDs with so few pins.  Many designers choose to utilize shift registers, which uses a serial load with parallel output.  I was not to fond of this idea, primarily because of the time needed to shift all bits and the possible resulting trailing effect, so I started from my own drawing board, see attached.   

My design uses 5 x 3-8 line decoders (also known as DEMUX) to convert a 5-bit parallel binary output to a one-hot 25-bit parallel output, which drives the columns of LEDs.  "One-Hot" means that only one of the 25 output pins will be "hot" at any given moment.  If the five output pins of the arduino are: 01010, this is the number 10 in binary.  The decoders take interpret this signal and in turn power on output pin number 10 of the 25 columns (numbered 0-24).  See the attached design for illustration.

As many other LED cubes do, my design also uses NPN transistors to switch the cathodes of each plane of the cube.

My design also includes a custom designed Printed Circuit Board, to eliminate the many unsightly wires that would otherwise be needed.    


Part No.          Description                          Vendor             Quantity     Each        Total
74HC238       3-8 Decoder                        eBay                  5                $0.70        $3.50
LED                5mm Diffused Blue LED   eBay                 125            $0.09         $11.25
RES               150 Ohm Resistor                                         30              $0.05        $1.50
2N4401         NPN Transistor                    RadioShack    5                $0.20        $1.00
POT               10k Ohm Trim-Pot                RadioShack   1                 $1.49        $1.49
Arduino         Arduino                                   SparkFun        1                 $30.00      $30.00
PCB               PCB + Shipping                    AdvancedCircuits 1          $51.42      $51.42

Grand Total: $100.16

Second Thoughts:  Be sure to get one-HOT decoders, many will have every output high, but the one selected output LOW.  This is the opposite of what we want here.  Be CERTAIN to check the truth table in the  data sheet of whatever chip you purchase. 

Step 2: Cube Construction

The first step is to construct the cube of LEDs.  My LEDs were very cheap and the leads were incredibly short.  This is why I used additional wire, which worked out very nicely.

Firstly, make yourself a wooden jig to hold the LEDs when you solder.  I spaced mine 1" apart.  Solder all the CATHODES (-) together in the plane. 

Once you have all 5 planes done, its time to go up!  Use a 1" spacer between the planes as you solder.  Be sure you run enough wire vertically for all 5 planes, and then some extra.  

Done? Congratulations! You just made about 300 solder joints!

Second Thoughts:   Upon completion,  it appears that the Cube leans, and thats because it does.  When attaching the planes to the vertical wires, I attached to the same side of the LED lead each time.  To avoid this, alternate which side of the lead you attach to the vertical wire. 

Step 3: Prototype Circuit

Once you have the cube constructed, solder test leads to each anode and cathode set.  I used cat5 cable, purely because it is cheap and available.  If you don't have any spare wire, go to your local telephone system installation company and ask to buy their scrap, you can probably get it for less than 30 cents a foot.  

Assemble the circuit (as described in the pdf) on a bread board.  Choose a corner of the cube to be the origin, and connect that anode to output 0 from the decoders.  The next anode will be in the alleged X direction, and then you go to the next row down (output number 5) you will have moved in the alleged Y direction.  Don't forget resistors!  I used 150 Ohm resistors in series with each column (between the decoder and the column)

To wire up the cathodes, use the NPN transistors and switches to ground.  You need to use a resistor between the base pin and the output from the arduino.  If you have never used transistors before, they are fairly straightforward: for an NPN type, the two outer leads are like the two terminals of a simple switch.  The center lead is the signal that, when HIGH, completes the circuit.  Thus connect pin 1 to ground, pin 2 to arduino ouput, and pin 3 to the cathode plane of the cube.  

Step 4: Programming with Arduino

Once the Cube is wired up to your prototype circuit, write some test code!

One clever function I developed to efficiently realize the output to the decoders is documented below, and also found in the code attached.  This is where some bitwise black magic obviously occurs.

 * Displays the anode column with the given number value; [0, 24].
void displayNum(int num){
  //constrain the argument to be between 0 and 24 inclusive.
  num = constrain(num, 0, 24);

   * AND: selects the bit, the bit at weight will be 1 if the pin is to be high
   * >>: shifts the selected bit to the end of the word, making the value a 0 or 1
   * first result is lsb
   * digitalWrite: write the approptiate result (HIGH or LOW)
* to the appropriate decoder pin
for(int weight=1, pin=0; pin < DECODER_BITS; weight*=2, pin++)
digitalWrite(decoderPins[pin] ,(num & weight) >> pin);

//delay, this is the absoloute minimum time the light will be displayed.
//ensures adequate delay for decoders as well.

The rest of the code I used is attached here as well.  This is broken into 4 main pieces. 

     Contains all pins definitions, and arrays containing pins for swift iterations. 
     Contains a few basic "shapes" in the cube, for use in patterns. 
     Contains patterns which the cube can display.  Each is documented in the code, and can be seen in the video in the intro step of this instructable. 
     This is the final version of my code, and its setup() and loop() functions.  you will notice that I choose which pattern to display at reset based on the position of the potentiometer (discussed next step).  I would encourage a better way to change patterns, also discussed in the next step. 

Step 5: Add-ons

To make the LED Cube more functional as a standalone piece of decor, settings need to be adjustable on the fly, and not by re uploading code each time you want to change the pattern.

One add-on I used was a potentiometer, whose analog reading was directly related to the delay time of the animation, as seen in the video.

Second Thoughts:

Another intent I had was to use jumpers to select which pattern to display--this can be seen on the PCB design.  however, I never tested this concept, and forgot that a pin reading is unstable without a reference voltage.  If you try this, you will probably need a pull up resistor configuration.  Whatever you do, don't do what is shown on the PCB design, and do test it. 

Also, as cheap as they are, potentiometers are versatile, and a second one could easily be used as a pattern selector. 

Step 6: PCB Design

I designed this circuit and PCB in Eagle, which is free PCB design software, available at .  I have attached the eagle files for your reference or reuse, but as stated previously, some re-working my be desired.  

If you are new to PCB design, it is easy and fun!  One good tutorial can be found at the instructable titled "Turn your EAGLE schematic into a PCB" .

Second Thoughts:
One thing to watch out for when designing a PCB is the size of the drill holes.  Most parts in the library are good, but be sure to check wire connections, like those of the anode columns. 

Also, if you like the project, but not the cost of the professionally fabricated PCB, you could also easily create this on a perfboard , or even use a toner transfer do make your own PCB while still using Eagle .

EDIT:  The attached eagle files have been fixed for the jumper issue, they now jump to GND instead of VCC

Step 7: PCB Manufacture and assembly

To send a design out for manufacture, you will first need to create a drill file and gerber files.  This area is not my specialty, but the instructable "Professional PCBs almost cheaper than making them at home" nails it, follow the instructions to a T and you will have no problems. 

EDIT: Due to a few requests, I have attached the gerber files needed by the manufacturer to this page.  Please notice that the issue with the jumpers has been fixed in this version. (they now jump to GND, which will work by using the arduino internal pull-up resistors.  

Finding a manufacturer:  
I got my PCB fabricated at Advanced Circuits , and here's why:
1.  US Based:  Don't get me wrong, I order TONS of components Hong Kong direct, the postman is used to seeing Chinese stamped padded envelopes in my box, but matters here is that when I am antsy for my board to arrive, I DON't have to wait three weeks for shipping!

2. $33 each. yup, just $33 per board for standard spec orders.  Whats the catch? Minimum order of 3, see below.

3. STUDENT DISCOUNT!  Advanced Circuits will let you order only one of their $33 each special for students!

4. Free DFM check, basically it makes sure your drill and gerber files are correct before you give them any money.

5.  Free surprise with each order, its popin good ;)

Begin soldering components with the lowest profile, meaning height.  Start with resistors, then the IC sockets, ... , and finish with the cube itself last. 

I used all through hole components, so assembly is pretty straightforward.  If you've never soldered on a PCB before, here are the keys:

1.  Use a good, clean iron.  Clean your tip with tip tinner and a wet sponge.
2.  Heat the PART*.
3.  Apply solder to the BASE OF THE HOLE.
4.  Allow solder to seep into hole before removing heat. (about a half second)

*Be cautious not to overheat components containing semiconductors, as they are easily damaged by heat.  I used sockets for all DIP chips (decoders)

Step 8: Done!

Once your custom board is assembled, test it out!  Upload the code and snap on your arduino. 

For more pictures, descriptive videos, and more projects, check out my website at:

Comments? Questions? Post-em!

Second Thoughts:
If the lights don't act as you anticipate, first check that your decoder pins are placed properly, as indicated in the PDF of step 1.  Swapping bits will mess it up big time. 
1-40 of 71Next »
浩李7 months ago
Hi ajmontag.
I finish the hardware but I don't know how to program it.
may I ask you for a code for LED CUBE code sample
can you mail to
npedrazzoli7 months ago
you can send me the program that is to be loaded on the arduino1 by email?
Tuffy_DK2 years ago
Hi ajmontag.

I've tried to build your cube 5x5x5x by using your schematics (Cube.sch), but its not working.

I think there is something wrong with your layout (cube.sch). Can you please check it again??

SaurIMX Tuffy_DK9 months ago
can you please tell me how to change the patterns?
ajmontag (author)  Tuffy_DK2 years ago
I am quite positive the schematic is good, since I made a PCB from it and it works too. Check your wiring and let me know if you have any questions.
Hi ajmontag.

I've now tested all my wireing with an ohm meter and all wires are ok - I started all over on my breadboard and finished up with the same thing as yesterday... Nothing.. :-(

But then I removed the GND wireing (on pin 4 and 5) from the 74HC238 (V1 to V5) and then it seems to work (LEDS are flashing on and off).

Is it a mistake to wire pin 4 and 5 to GND???

Kindly Regards

ajmontag (author)  Tuffy_DK2 years ago
That should not be the problem, If you have checked everything over I would pull everything off the breadboard and start over. You could also unit test a single decoder (74-238) to make sure that is working properly
Hi ajmontag.

I'll check all my wiring, and get back to you.. Perhaps there are one broken wire (on the breadboard)...


hassantahir22210 months ago
can 74138 decoder be used here instead of 74238 ???

i have 74138 x 5 decoders but when i place them in socket all the leds in a layer glow rather than 1 by 1
any idea about it that how to solve this problem ??
SaurIMX10 months ago
can i use atmega8 with arduino bootloader instead of atmega328?
and could you please explain how you placed those switches?
SaurIMX11 months ago
Any other alternative for 74HC238?
ajmontag (author)  SaurIMX11 months ago
a MAX7221 or similar would be a better solution. That is a serial constant current source/sink. You should be able to do the whole cube with just one or two of those.
Why did you make the Arduino the brain when you could have easily just put an Atmega chip instead?
Geekaton1 year ago
i am 15 and have made my own LED cube, heres a video of how I made it:
let me know if its helpful!
AmalZone1 year ago
Dear Sir,

We are a marketing company in Saudi Arabia . We are interested in buying a customized LED cube for a project that we are handling now. The LED has to be one meter in length and one meter in depth and 2.5 meters in height.

Please let us know if it is possible to build it and give us a quotation on that.

Amal Alsayegh
Marketing and PR rep.
Zone Arabia
ajmontag (author)  AmalZone1 year ago
Thank you for the offer, but I am not interested at this time. There are many others online who have made a similar device that you can ask.
yonch1 year ago
Can it work with Arduino Uno?
ajmontag (author)  yonch1 year ago
yes, they should be pin-compatible.
yonch2 years ago
I think I did it wrong. Is the power to the LED's coming from the column or plane? I connected the short pin of the led to the plane and the long to the column.
ajmontag (author)  yonch1 year ago
Each plane is for negative, each column is for positive.
yonch ajmontag1 year ago
I'm very confused with the negative positive. According to the led pinout below, which pin is connected to the plane and which to the column?
yonch yonch1 year ago
LED Pinout.JPG
ajmontag (author)  yonch1 year ago
Cathode is (-), meading the short lead is the plane.
yonch2 years ago
What wire is used to build the columns?
ajmontag (author)  yonch2 years ago
This is the wire that I used:
yonch2 years ago
Can someone PLEASE explain how the LED's are wired, to one another and to the circuit? Are all the cathodes connected? Where are the anodes connected?
ajmontag (author)  yonch2 years ago
Each column has a common anode (positive), and each level or plane has a common cathode (negative).
yonch ajmontag2 years ago
But then if I want to turn on two LED's not on the same level or column, for example (2,3,4) and (2,1,3), two more LED's will glow.
ajmontag (author)  yonch2 years ago
Yes, you are correct. That is why we only ever light up one LED at a time, but we just cycle through them really fast (a few micro seconds). It gives the illusion that they are lit simultaneously.
purpulhaze2 years ago
I'm really trying to understand the wiring of the decoders to the cube but I just don't get it.
ajmontag (author)  purpulhaze2 years ago
each output of the decoders go to one of the columns (anodes). This supplies the current for the LEDs.
sunhmt2 years ago
Nice job!
I want to ask about how I can use a music to controll the CUBE like a VU meter. I need to change the arduino type?
mr_pinooo3 years ago
Thumbs up for this cube !!

Are there any plans of making a control program for controlling the cube live from a PC ?

ajmontag (author)  mr_pinooo3 years ago
Not in the near future, I would like to have it standalone and not connected to a PC. I could do the GUI in swing, but from previous experience, i understand that serial communication in java is unreliable... understandable.
sunhmt ajmontag2 years ago
Thankyou for the idea. I want to know how to add a audio input to this arduino.
I want to make a VU meter by 3D.
Psychojm2 years ago
Hi, can you please tell me just how to turn 1 random x, y, z LED
thats all I need.
Psychojm2 years ago
Hi im new here, I just made this cube with 6x6x6 instead of 5 and im also new with arduino so i would like to know how to make the patterns work properly, with 6^3, and also I dont quite understand the jumpers part.
Also realy cool project ill try with a PIC later, also new on those too :)
and sorry for my bad english.

Blackice5042 years ago
Nice PCB neat layout and simple to follow and the idea of mounting the arduino on brilliant but it would be nice to have a option just to mount the chip on.

are you doing any work on RGB led cube?
ajmontag (author)  Blackice5042 years ago
Indeed, I have since been working on a different project with a standalone micro-controller; at the time i was not comfortable with this. It would be a simple change to the PCB.

I have not done any work with RGB, but hope to with time.
mstoetz13 years ago
I'm willing to depart with 5 or 6 of the PCB's I got made. The cost ended up being $206.08 ($15.50 + $29 shipping + $22.08 taxes x 10 boards) for me to get them.

The choices I had at order time was around 12 with 10 day turn around, or 15.50 with 6 day turn around. I would have been good with the 10 day, except the place I ordered from (Ottawa Canada) celebrated Chinese New Year and shut down for 10 days over that time, so I decided to do the $155.00 / 10 board plan.

I have Andrew to thank for providing this instructable, and the gerber files. He did all the work.. thank you Andrew!! PS: your name is on my boards, so you're going to be famous ;)

I've attached a pic of the one I've started. To be honest, I sort of "whipped it together". The next one I think I'll spend more time making the cube perfectly straight.

1-40 of 71Next »