RGB-POV

24-bit gamma-corrected persistence of vision device

When I added multiplexing support to my TLC5940 library, I wanted to test the limits of how fast it could go, so I whipped up a quick program that read and displayed columns of 64 pixels stored inside the ATmega328P's flash memory, along with a companion program for the desktop that could transform a PNG file into a header file to be included with the firmware.

I showed this off to a bunch of people, and everyone asked me if I could have it instead display a series of images stored on a microSD card. I looked at the available SD libraries, but none of them met my memory or speed requirements, so I developed my own SD library from scratch based only on the SD Simplified Physical Layer Specification, and then wrote my own lightweight FAT 12/16/32 layer from scratch based only on the Microsoft Extensible Firmware Initiative FAT32 File System Specification.

In order to run the ATmega328P at its maximum clock speed (or overclocked to 30 MHz) I needed to run it at 5 Volts, but the microSD card requires 3.3 Volts. I purchased a microSD breakout board with a built-in level-shifter, but in practice (and confirmed by its datasheet) I found that its level-shifter could not keep up with the SPI clock speed I was using. So during the development process, I ended up designing my own microSD card breakout board based on a faster level-shifter. I also took this opportunity to include a voltage regulator that allows the level-shifter and microSD card to be fully powered down for maximum power savings, but which also gives the firmware the ability to hard power-cycle the microSD card for those rare instances when it stops responding to a soft-reset command. This was also my first time working with surface mount parts. It took two revisions, but I eventually got it working (shown here) and was confident that I would be able to lay out a circuit board containing a mix of both through-hole and surface mount components for the RGB-POV project. I figured that the controller board might undergo multiple revisions, so I designed the system to be modular, made up of a control board and a display board that could be plugged together. I also wrote a companion desktop software program that takes a directory of PNG files, converts them into a format that the TLC5940 chip expects, and creates a RGB-POV.TLC file which can be written to the microSD card. The RGB-POV.TLC file is basically a custom filesystem within a file which can be copied to a FAT-formatted microSD card, or it can be directly written to the microSD card at sector zero as if it were a disk image. Here are photos of the controller and display board:

And here are photos of it in action:

You usually don't see LEDs making brown light, but gamma-correction makes that possible:

I trans-coded the entire DVD of Wreck-It Ralph, and wrote its RGB-POV.TLC file to a microSD card as a disk image, because its file size ended up being 6.5 GB, which is larger what what a FAT filesystem can support. Here is the device displaying a couple frames from the movie:

And finally, since I soldered together three controller boards and three display boards, I modified the firmware on two of them to support synchronization, so together they can display images 128 pixels (30 inches) tall.

Here is a photo of two synchronized RGB-POV devices displaying a photo of my wife: