Garrett’s DIY #1 – Persistence of Vision Device
(Garrett in Action!)

Video of Garrett’s POV:

[gv data=”Lu8iXLNsL-Y”][/gv]
The human eye is fast enough to capture most day-to-day events, but sometimes objects move a little too quickly for the eye to react. This is especially apparent when the eye is subjected to brightness and darkness in rapid succession; the light source will apparently remain for some time after it is actually gone. This effect is vital to many display devices such as CRTs, and can be used to create a simple display device. Parts List: All we need are a few LEDs (the brighter the better) and some kind of controller to strobe LEDs quickly. In this example, I’m using a Cubloc CB280 with study board ( and some bright orange LEDs from my junk box. I’ve also added a fairly generic octal Darlington array sink driver to maximize brightness without drawing too much current from the controller outputs. Individual transistors would work as well.


With an eye toward later expansion, I wanted to create a character set instead of hardcoding each message line by line. I had only seven matched LEDs (except for a big pile of UV ones), so I started with seven bit tall letters. Since I was typing each character in as a binary bitmap, I used only three rows per letter. That makes a few of the letters somewhat difficult to read, but the characters can be expanded after the proof-of-concept is up and running. The bitmaps are all stored in one Const array. The display routine is actually very simple. One loop steps through each letter in the desired message, and a nested loop steps through each row in the current character. The ASCII value “A” is 65, so I subtract 65 from the message character and multiply by three to get my starting index to the Charset array. The contents of the current location are dumped to Port 0 via the Byteout command. Once the current row is displayed, it needs to stay visible long enough for the eye to register. A Udelay command starts at 70us and adds about 16us per count, so the current row is displayed for about 1.67 milliseconds. Then the output LEDs are blanked for an equal amount of time. This blanking period is essential to getting a good POV effect, as LEDs that stay on from row to row will appear smeared. After the character is displayed, a short delay is introduced to separate the characters a little. This also powers down the LEDs enough to prevent overheating, since I left out the current limiting resistors to maximize brightness. All that’s left is to power up the study board and download the program. A little tweaking was required to get the Udelay statements set up correctly; if you have to move the device too fast, the display won’t be visible. If you have to move the display too slowly, the POV effect won’t appear.

Taking it Further…

There are many possible enhancements to this project. One would be an improved character set, other possibilities are better LED mounting solutions. I’ve already tested a simple setup that uses an accelerometer to detect which direction the device is moving, and flip the character display so that it isn’t written backwards on the return swing. An even better system would be to use the smaller CB220 controller and add batteries, then attach to a bike wheel for an easy to build light show. If combined with a motor driven platform, the POV device becomes a way to display all kinds of data. I definitely intend to explore some or all of these possibilities in the future.

Video explanation of code:

[gv data=”oq3rCY8czLA”][/gv]

Download Garrett’s CublocStudio POV code here

Please e-mail any questions to