8x8x8 multiplexed LED cube with an Arduino Mega 2560

I've shown my circuit design to a friend who really knows about electronics. HE had two remarks/questions:

  1. Will it not be a problem that the SCK and SS signals coming from the Arduino are connected to 9 shift registers? He says that the SCK and SS signals are probably carried by weak currents (10-20 mA) and if this gets divided into 9 parts, it might be a problem. He also says that he looked at the datasheet of the TPIC6B595 shift registers and that they can work with very low currents, so maybe it's not a problem after all. I thought I'd ask your opinion anyway, just to be on the safe side. According to my friend, if this is a problem, I could employ some buffers like the 74HC125 in order to get around the problem, but I'm not sure what that means in our case.

  2. What is the frequency of the MOSI/SCK/SS signals coming from the Arduino? It seems that if the signals have a high frequency, the circuit design becomes more complicated. Now, I'm sure that the signals cannot be faster than 16 MHz, which is the CPU frequency of the Arduino, but I wonder how high is the actual SPI frequency. If it is too high, do I need to take into consideration some additional things? He mentioned something about impedance, but that's a bit high-level for me at the moment...

I've found an article about the Arduino SPI, here: http://arduino.cc/en/Reference/SPISetClockDivider It seems that the SPI frequency can be set from software. The default is 4 MHz. I wonder what the optimal value is. You don't want it to be too slow, because it will become visible in the cube. You don't want it to be too fast because high frequency signals complicate things...

1 & 2: I have daisy chained 20 TPIC6B595 shift registers spread over 2 boards. The up-to-40mA capable IO pins had no problems driving them at default SPI speed of 4 MHz.

I don't know how your new program does a ground plane, ground pour, or what it might call it. In eagle, you draw a polygon covering the area you want and then Name it GND. I do on the top & bottom layer because iteadstudio does 2 sided boards as standard. 1-sided is usually just home board creaters - I won't be bothered doing that when compex designs can be had & silkscreened & solder masked & have plated thru vias, all for $25 for 10 boards. (10cm x 10cm)

I've made a dual-layer version of the circuit :) Unfortunately it's very late again and I haven't had time to properly verify it. Maybe tomorrow...


Back - Mirrored:


The ground plane really has helped a lot. The board size has decreased from 180 x 120 mm to 140 x 100 mm :) Thanks for the tip, CrossRoads!

The front/top is the ground plane? Looks like it, just confirming.

Yepp, the top/front is the ground plane :) I'm not quite sure yet about how the pads (round and rectangular connection areas) are connected to the whole ground plane (which is mostly all a big copper rectangle), as they seem to have some isolation circle or rectangle around them, but I'll figure that out...

I have a really basic, but important question. The Arduino has some pins marked 5V and GND. See the group of pins which is leftmost on the bottom of the following image:

My question is: Are those 5V/GND pins directly connected to the power jack of the Arduino or the current passes through some circuitry in the Arduino before it reaches the 5V and GND pins? I'm asking because I want to determine whether I can feed my LED Cube Driver circuit from these 5V/GND pins of the arduino or I need to connect my LED Cube Driver to the real power supply's 5V and GND. As you know, my LED Driver Circuit can work with currents up to 1.3A and I'm wondering if it's safe to take that much current from the Arduino's 5V/GND pins... It would be nice if I could feed my custom circuit from the 5V/GND pins of the Arduino because that way I would have only one power connector (on the Arduino), I would only need to solder some pin headers on my own custom circuit.


Im not sure about the mega, but the 328 based units seem to be limited to 500ma at the 5v pin. My guess is that 1.3a is going to too much, even for the mega. I think that the 5v pin limit is from the specific voltage regulator that is used (the part right next to the external power socket.)

Hippynerd: Im not sure about the mega, but the 328 based units seem to be limited to 500ma at the 5v pin. My guess is that 1.3a is going to too much, even for the mega. I think that the 5v pin limit is from the specific voltage regulator that is used (the part right next to the external power socket.)

That and when using USB power there is a 500ma thermofuse that limits the maximum 5V current one can draw.


Too bad... Well, then I'll just connect the LED driver board directly to the power supply unit.

Un4Seen: Too bad... Well, then I'll just connect the LED driver board directly to the power supply unit.

Always a better way to go. The arduino boards are great at controlling stuff but are pretty wimpy at powering things.


5V & Gnd are connected to the output of the 5V regulator, which is rated at 800mA,and is fed by a 1A rated diode from the barrel jack connector, or 500mA from the USB port. For 1.3A, you need an external source for sure.

Extrenal 5V/GND connector it is then :) This makes me wonder, though... the fact that I need to connect the Arduino's GND pin to the ground of the LED circuit still holds true, right?

Yes, Gnds must be connected. Arduino, LED "shield", power supply.

I have perfected the dual layer design. Here is the result:

Front (ground layer):

Back (Mirrored):

The power supply is supposed to connect through a barrel jack identical to the one on the Arduino (this should be soldered onto the LED cube driver board's front). The MOSI, SCK, SS and GND of the Arduino are supposed to be connected via standard pins (breakable pins soldered onto the front of the circuit, either male or female). The anode planes and cathode columns are supposed to be connected to the board via standard pins (male/female pin headers soldered onto the front of the board).

If any of you guys want to try producing a real board from the design, I'm happy to send you the Sprint Layout file or some exported results (PDF, Gerber file, drill data, isolation milling, PCB outline milling, etc.). Please keep in mind that this has never been tested (except virtually inside Sprint Layout), so there's a chance that it has some bugs :)

Nice. See you figured out how to run some traces on the top too. What's the size of the board now?

Thank you, CrossRoads :) It may not seem like it, but there's a lot of work in that dual layer design :) That's why I would happily share it with anybody who wants to use it. Of course, it would be nice if I could first prove that it's correct by building a board myself. I'm afraid that's going to take months, because soldering the 8x8x8 cube together is a tedious task. But it will be done one day and I'll be back here to inform you about it!

In the meantime, I've finished putting together the circuit today for the 4x4x4 test cube. I've done it on 3 solderless prototyping boards, without any soldering. I hope it will work. It also includes variable resistors to the LED cathode columns, so we'll know exactly just how much current we'll need for the big cube. The 4x4x4 test cube is also soldered together and ready to go. It will take a few more days to write some basic software for it. I'm hoping that in about one week from now I will be able to show you some nice video about the 4x4x4 cube working. Perhaps I'm too optimistic, it will be a miracle if everything will work on the first go. Actually, I'm hoping that at least it will do something, even if not exactly what is expected and I'll be able to debug it. If no LED will light at all, that won't be funny... let's hope it does not happen.

Ok, good luck! I'd like to try a cube myself some day, not enough hours in the week right now tho.

Yeah, I know the feeling... if only there was enough time for all the projects that I can come up with...


I've started writing the code for the LED cube and I've bumped into a question which might be very basic, but it's also important. An SPI transfer begins by setting the SS pin to LOW and ends by setting it back to HIGH. In between you transfer the bytes with calls to SPI.transfer(). My question is: when exactly does the transferred data become live on the cube? Immediately after it's written with SPI.transfer(), or only after the SS pin is set back to HIGH?

I'm planning on transferring the data of an NxN horizontal plane like this:

void displayCurrentPlane ()
    digitalWrite (PIN_SS, LOW); //Start transferring data
    SPI.transfer (0xFF);  //Turn off the current plane (in fact all planes)(all 1s)
    digitalWrite (PIN_SS, HIGH); //Done transferring data

    digitalWrite (PIN_SS, LOW); //Start transferring data

    for (byte i = N - 1; i >= 0; --i) //Set up the LEDs inside the current plane
        SPI.transfer (cubeData[currentPlaneIndex][i]);

    SPI.transfer (~(1 << currentPlaneIndex)); //Turn on the current plane (current plane's bit 0, all other bits 1)

    digitalWrite (PIN_SS, HIGH); //Done transferring data

Does this seem correct?