I decided to build a super-bright multi-color LED light. I started out by buying a bunch of Adafruit LED matrices and a BeagleBone black single-board computer.
Adafruit 8x8 NeoPixel LED Matrix
BeagleBone Black (Adafruit)
I also bought a piece of aluminum (check out Aluminum on Amazon.com) and drilled it so I could run the wiring to the LED panels. The photo below shows the 5V 90A power supply (check out TRCElectronics) I am using, the drilled piece of aluminum, and one of the four wiring harnesses I assembled to connect the LED panels. The aluminum plate helps distribute the heat from the LEDs. Even still, they should not all be operated white at full brightness, continuously, for a long period of time. However, they stay cool enough the way I use them to animate things. I attached the LED panels onto the aluminum using a sheet of 3M 300LSE double-sided adhesive.
The photo below shows a bunch of the LED panels and the BeagleBone Black with a "cape" with a level shifter on it, driving rainbow colors. The panels are only being driven to about 5% of their full brightness. There are two dark panels because the LEDs are very sensitive to latchup. This means you need to be very careful that their signal input is not driven before you apply 5V power, or you will blow out an LED. The LEDs are all daisy-chained together, so the whole panel will go dark. I had to rewire my level shifter to power it from the LED power supply to fix this problem (duh). The panels are arranged in four strings of four panels each, or 256 LEDs per string and 1024 LEDs total. With all the LEDs on full brightness, the array will consume about 325W, 65A at 5V. The Adafruit LED panels have lots of decoupling capacitors on board making this whole design pretty simple from an electronics perspective.
Eventually, I wrote some software that could render graphics and text. Here is my first test of text. The font is from luser droog's post at this link: Banner Command (techques.com) The photos don't really show it, but the completed LED panel is blindingly bright. If you look carefully, you can see a reflection in the lens of the camera because the light is so bright.
Here is a cool animated target thing based on sines. I got the algorithm for this from:
All the software is written in C++, except for the BeagleBone Black PRU assembler code. I started with this code on GitHub: https://github.com/osresearch/LEDscape which got me started using the PRU on the BeagleBone Black to generate signals. After some modification, I got the BBB to be able to reliably drive AdaFruit NeoPixel LED panels. This simple logic analyzer tool was very helpful: USB Logic Analyzer (sparkfun) although the WS2812 LED waveforms just about max out its frequency capabilities.
At first I developed the software onboard the BeagleBone Black over USB using the linux command line, but after I got the basic LED output working on the BBB using vi and gcc, I ended up writing a simple iPhone app (in Objective-C++) that rendered the display framebuffer. From that point on, I could code and debug the C++ graphics code in Xcode (using the iPhone simulator) on the Mac and move it over to the BeagleBone and recompile to show it on the LED array. Using Xcode on a Mac is a really cushy development environment for embedded work so that was nice.
The software has a demo class which has a library of graphics functions and a list of scenes. The demo class steps through each scene and calls the render function 60 times per second until it is done. The scenes only have a constructor and two other functions, void start_scene(void), and bool render(demo *). There are nine types of scenes so far.
I'm pretty happy with the project except for the final resolution which is only 32x32 pixels. That is not enough resolution for anti-aliasing to look right, or to be able to render more than 4 characters of text across. I kind of wanted to do an analog wall clock, but I can't figure out how to make it look okay in a 32x32 pixel format.
Here is a video of the LED panel running:
The code to set up the scenes for that looks like: