5x5x5 LED Cube

Table of Contents
  1. Background
  2. Building the LED Cube
    1. Schematic
    2. LED Cube
    3. Controller Circuit
  3. General Library
    1. Download

Background

A while ago, I wanted to start a project that would involve basic electrical engineering and circuitry, as I had no knowledge and very little experience in it, but wanted to be able to do some cool things with circuits later on. After looking through the internet for ideas, I settled on building a LED cube that displays programmed light patterns in a three-dimensional space.

Although being my first project involving circuitry and electrical engineering, I created the project from scratch after doing quite a bit of research on the topic. I decided to do a 5x5x5 LED cube (totalling 125 LEDs) and use a Teensy LC as the microcontroller. The LED cube is programmed with different patterns, and has a button to switch between the patterns.

Below is a video of the LED cube running a few programmed patterns. The spoiler box under the video describes each pattern shown in the video.

+Patterns in Video

Pattern:

Time 

Pattern Name

Description

0001

00:00

random_set

randomly turn on all, randomly turn off all

0010

00:26

border_bounce

bounce planes between borders

0011

00:34

rain

shows rain pattern

0100

xx:xx

(cut from video)

0101

00:40

send_voxel

sends voxels between edges

0110

00:53

border

shrink/grow border

0111

00:57

firework

shoots firework pattern

1000

01:06

stream

creates a stream of voxels travelling down the cube

1001

01:35

border_spin

spins voxels around border

Building the LED Cube

I had to do a lot of research for this project since I had never done anything like it before. After examining many different constructions on the internet, I made my design to use SN74HC595 shift registers to be able to control all of the LEDs using only a handful of pins.

The LED cube uses persistence of vision and an LED matrix to display each pattern. The cube only controls one level (25 LEDs) at a time, turning each level on and setting them according to the pattern. Each level is cycled very quickly, so fast that our eyes can't see the levels turning on and off, and instead see it as if the entire cube is on at once. In the video, each level switches every 2 ms, or 500 times/sec, which makes it look constantly on. The LEDs are set up in a matrix so we don't have to use one pin for every LED.

Parts List

The parts list of what I used and where I got each part from can be downloaded here. I had some materials already at home, so I didn't purchase everything on the list. For wiring, I stripped down some Cat 5 cables and used the wires inside. This project cost me about $45 total.

file icon parts_list.csv2.2 KB

Schematic

Here is the schematic, created with EasyEDA Designer. I'm not really sure how to organize a schematic, so it's a bit of a mess.

Download Schematic:

file icon led_cube.json105 KB
Figure 1: Schematic of LED cube circuit. The black dots represent the repeated pattern of the LED array shown below them.

Figure 1: Schematic of LED cube circuit. The black dots represent the repeated pattern of the LED array shown below them.

(click to enlarge)

The Teensy uses pins 11, 12, and 13 for controlling each level of the cube at a time (25 LEDs), while pins 0-4 are used to set each level on/off. The pins 16, 17, 18, 19, and 20 are status LEDs showing what pattern is currently displayed. Pin 23 is for receiving input from a button to switch to the next pattern.

Shift registers are able to take in serial input and turn it into parallel output, which is how I controlled 25 LEDs at a time with only 3 pins. Taking input DS from pin 11, and a clock SH/CP from pin 13, the shift register will output the bit values on Q0-Q7 after the latch ST/CP from pin 12 is set. The overflow pin, Q7/2, is fed into the input pin DS of the next shift register, creating a chain.

LED Cube

The LED cube part of this project took longer than I had expected it to. Building the LED Cube took a little over a week, and each level took a few hours each day to finish, although it didn't feel like it. I had to wrap copper around the cross-rods on each level, as the rods weren't being held well with the solder. The cube ended up not as straight as I had hoped, but I was still pleased with the result.

The LED cube is 6 in x 6 in x 6 in (15.24 cm x 15.24 cm x 15.24 cm), with a 1.5 in (3.81 cm) space between each LED.

Controller Circuit

The circuit was slow work, where I had to make sure each wire I soldered in was in the right place and there weren't any shorts anywhere. The wiring ended up being a lot messier than intended. I didn't leave a lot of room for putting in the ICs in the sockets, which was annoying to pop in.

The only real issue I had was that I couldn't figure out why the cube didn't display the right pattern, until I realized that I had forgotten to solder the CLOCK wire to the Teensy. It's a good thing I didn't run into any circuitry problems because I don't think I would've been able to diagnose the problem.

General Library

To control the LED cube, I wrote a general library for Arduino microcontrollers to write pattern data to the shift registers. I actually wrote the library before building the LED cube, and used a terminal for testing the pattern output. It was first written in C, and later ported to C++ around 5 months later.

The library is able to display frames and create animations from changing the LEDs (voxels) powered state. It can manipulate the cube by frames per voxel, column, or plane. It has some built-in patterns, as shown in the video above. The library also has the feature to display text and characters to create messages.

A more in-depth description and documentation of the library can be found here.

Compiling the Library

Some library configuration is determined at the preprocessor level by defined macros and their values. Preprocessor directives can be easily placed at the top of cubehead.h. Pin numbers can be changed in pins.h. To change these values, the library must be recompiled. This can be done by running make on the library's root directory. Note that Arduino actually requires the source code files for its libraries and not the compiled versions to run. To create a zip file of the changed library, run make zip.

Installing the Library

The library can be easily installed on Linux machines by using make install, which takes the zipped library in the current directory and puts it in $HOME/Arduino/libraries/libledcube/.

Download

The library, documentation, and examples can be found here on GitHub.