Introduction: 3x3x3 LED Cube With Arduino Lib
There are other Instructables about building LED cubes, this one is different for several reasons:
1. It's built with a low number of off-the-shelf components and hooks up directly to the Arduino.
2. A clear, easy to reproduce circuit diagram is provided with plenty of photos.
3. A unique approach is used for the software which makes programming the cube easier and more expressive.
Parts needed:
- 1 Perfboard
- 3 NPN Transistors (2N2222, 2N3904, BC547, etc.)
- 12 Resistors (~220 ohms and ~10k ohms)
- 13 Headers (male or female)
- 27 LEDs
- Wire
Step 1: Prepare the LEDs
This step largely follows the LED Cube 4x4x4 but we'll be building a 3x3x3 cube instead. A cube of this size is about as big as it gets without introducing additional circuitry and complexity. We'll need a total of 27 LEDs that will be grouped into three sets of nine.
Each set of nine LEDs will share a common connection amongst their cathodes (negative leads). I'll refer to each of these sets as a "level". Each of the nine LEDs on a level is connected to the corresponding LED on the other two levels through their anodes (positive leads). These will be referred to as "columns". If that didn't make sense it will become self explanatory as we build the cube.
To start we'll use a drill to create a jig out of a small piece of scrap wood. The jig will hold the LEDs in place while we solder them. I decided to space the holes around 5/8 of an inch apart (~15 mm) but the exact distance isn't critical. The hole should have a tight fit around the LED since we don't want them to move around while soldering.
Once the jig is done we're going to bend the cathode of each LED in a 90 degree angle. The cathode is identifiable in three ways: 1) It's the shorter leg, 2) It's on the flat side of a round LED, 3) it's connected to the larger piece inside the LED. Make sure you bend the cathode in the same direction for all of the LEDs.
Now we're ready to begin soldering.
Step 2: Solder the LEDs
First place nine of the LEDs in your newly built jig. Position them so that the legs point in the same counter-clockwise direction. The photos show the cathode pointing clockwise with the anode facing out, but I'd turn the LEDs around if I did it again in order to keep the leg from obstructing the view of the LED.
Solder the sides together, one pair on each side. Use small clips to keep the legs clamped together while applying the solder.
Once each of the four sides are soldered, move the clips to hold the corners together and apply solder to each. Lastly, solder the cathode of the middle LED to one of the sides and trim away the excess.
Repeat three times.
You should now have three sets of nine LEDs. Position two of the sets one on top of the other. Keep the distance equal to the spacing already established between LEDs. Once you're comfortable with the spacing you can clamp each set of legs using two clips, one in each direction, to keep the legs firmly in place while soldering. You may need to bend around a LED to get a good connection. Solder each of the nine pairs, one at a time.
Do this one more time and you're done with the cube.
Place the cube on one side of the the perfboard. Make sure the nine legs are positioned apart evenly while you guide each one through a hole. My board has five holes between each set of legs. You want to leave as much room as possible on the other end of the perfboard to fit the various components.
Add a few clips to hold the legs in place once you're happy with the positioning. Leave plenty of leg poking through the bottom since this will make it easier to solder the resistors later. Turn the board over and solder each of the legs to keep them in place. Flip the cube back over once all the legs have been soldered.
Lastly we need to solder a lead from each of the levels down through the bottom of the board. Strip a piece of solid wire and bend a small hook on one end. Hang the hook on one of the center LEDs legs and guide it through a hole on the perfboard. Solder the hook end to keep the wire in place. Repeat again for the other two levels.
The next step is to build the rest of the circuit.
Step 3: Build the Circuit
The circuit is pretty simple. Each of the nine columns will connect to a pin on the Arduino through a current limiting resistor. Each of the three levels connects to ground via a NPN transistor when activated by an Arduino pin.
We'll be using 12 output pins total on the Arduino but there are 18 LEDs to power. The trick is that only a single level can be lit at a time. When a level is connected to ground, each of the LEDs on that level can be powered individually through one of the nine other Arduino pins. If we light the levels fast enough it will appear as if all three levels are lit at the same time.
Let's build the circuit.
The first step is to prepare the nine current limiting resistors. I'm using 220 ohms per pin which will draw around 22mA. The value may vary depending on the LEDs that are being used but stay between about 135 and 470 ohms. Each pin is capable of sourcing up to 40mA.
In order to save room we want to solder the resistors in a vertical position. Bend one lead down so that both leads are parallel to each other. Do this for all nine of the resistors.
Once the resistors are ready we'll solder them one by one. To make it easy we're going to solder the resistor leads directly to the other components instead of using a separate wire for each. One end of the resistor will connect to a column and the other will connect to a header. Start with the first row of LEDs which is closest to the resistors and work your way back.
Once each row is finished you can use a small piece of tape to isolate the overlapping leads in order to prevent a short. Refer to the photos and diagram to see what this will look like once it's finished.
Now that the columns are out of the way, the next step is to solder the components which control the levels. The base of a NPN transistor will be activated by an Arduino pin through a current limiting resistor of 10k (or thereabouts). This will connect the corresponding level to ground which will allow current to flow through the LEDs. Refer to the photos and diagram.
Once complete the LEDs should connect to pins 2-10 on the Arduino and the levels should connect to pins 11-13, bottom to top. The pins are also configurable in the software if you need a different setup.
The circuit is now complete, time to move on to the software!
Step 4: Using the Software
I found a few code examples floating around the 'net for controlling an LED cube. They all required large arrays of binary or hex data to control the LEDs. I figured there must be an easier way so I set out to write my own software.
My first decision was to make the software mirror the hardware. That meant addressing each LED by column and level instead of using raw port data or the traditional x, y, z. The second decision was to start with basic functions, like turning a single light on or off, and building up from there.
Lastly I decided to introduce two features which are useful for more interesting effects. One is a buffer which allows the basic functions to build up more complex patterns. The other is a sequence function which lights an array of LEDs one at a time, or all at once.
The library started as procedural code and loose functions. From there it was very easy to follow the tutorial to create a reusable Arduino library.
Be sure to download the library and unzip it to sketchbook/libraries. If set up correctly you should find an example in the Arduino software under File > Examples > LedCube > ledcube.
The code is also available on Github at gzip/arduino-ledcube.
Thanks for reading!

Participated in the
Arduino Contest
10 People Made This Project!
- Ruud33 made it!
- daniel_bisegna made it!
- mmaitlen made it!
- frodesto made it!
- AndriyM1 made it!
- JeffersonN1 made it!
- holidayv made it!
- J.W.N.R. made it!
- hackchip made it!
See 1 More
221 Comments
8 years ago on Introduction
In your README file you state you have recently introduced an online UI for programming these routines... any link? I still love mine.
Reply 8 years ago on Introduction
The link in the readme leads to another link. As you can see, the UI is based on your Instructable and is modified to work with this cube. :)
https://rawgit.com/gzip/arduino-ledcube/master/ui/index.html
Reply 8 years ago on Introduction
Got it! Thanks! Great job programming this. I showed mine today at a gathering of librarians who are interested in Arduino projects. Always gets a "wow!"
4 years ago
Nice project, and I made it!
Thanks Instructables.
6 years ago
Hi
here is my cube :) nice colors dancing to nice music :)
https://youtu.be/aTCMM69AQs8
7 years ago
hi i saw one build in witch the guy said it would be ok not to use the transistor can i do it here, can someone respond please!
Reply 7 years ago
The transistors are required to light one level at a time. They are not optional.
7 years ago on Introduction
Can somebody tell me which pin i have to connect with which pin on the arduino
7 years ago on Introduction
Great tutorial.
For the "Lights Out" function, has anyone experienced the following symptoms?
+ Constant flicker when the LED is on.
+ Only 3/4 of the LED go off before the function resets back to a full cube.
If so, any thoughts on the the cause and/or tweaks to fix?
Thanks.
Arduino IDE v.1.6.5; Windows 8.1, Mini Pro 5V; Experience: White Belt :)
7 years ago on Introduction
How can I solve this Error:
ledcube.pde: In function 'void loop()':
ledcube.pde:49:57: error: taking address of temporary array
ledcube.pde:50:57: error: taking address of temporary array
ledcube.pde:51:57: error: taking address of temporary array
ledcube.pde:52:57: error: taking address of temporary array
ledcube.pde:53:57: error: taking address of temporary array
ledcube.pde:54:57: error: taking address of temporary array
ledcube.pde:55:57: error: taking address of temporary array
ledcube.pde:56:57: error: taking address of temporary array
Error compiling.
8 years ago on Step 4
my upper two lavel is not so much light. and down level number nine led is not so much light.
8 years ago on Introduction
I downloaded your code and library. I enjoyed the soldering but these errors come up when I compile the example given:
ledcube:15: error: 'LedCube' does not name a type
ledcube.pde: In function 'void loop()':
ledcube:49: error: 'cubeFrame' was not declared in this scope
ledcube:49: error: 'f' was not declared in this scope
ledcube:49: error: expected primary-expression before ']' token
ledcube:49: error: expected primary-expression before '{' token
ledcube:49: error: expected `;' before '{' token
ledcube:196: error: expected `}' at end of input
Reply 8 years ago on Introduction
Nevermind! I found that the library had an invalid name, just a simple matter of renaming it. Perhaps its my version of the IDE or the Windows 8 it runs on.
Reply 8 years ago on Introduction
Hi,there could please give the answer step by step as i am really new to this . Would appriciate the help.
10 years ago on Step 3
What is the color code on the 220 ohm resistors? I'm short on cash and am trying to harvest a couple from any electronics I can find.
Reply 8 years ago on Step 3
also it is Red Red Brown
gold is +- 5%
Reply 8 years ago on Step 3
http://www.digikey.com/en/resources/conversion-cal...
use for any resistors
8 years ago on Introduction
that's my erreur :( help pleaz
8 years ago on Introduction
I am completely new to arduino and even with the given code, I am unable to upload and run it. Some help would be appreciated!
Reply 8 years ago on Introduction
Arduino: 1.5.8 (Windows 7), Board: "Arduino Uno"
C:\Users\Samiha\AppData\Local\Temp\build3058240577403485459.tmp/core.a(main.cpp.o): In function `main':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:40: undefined reference to `setup'
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:43: undefined reference to `loop'
collect2: error: ld returned 1 exit status
Error compiling.