After reading through some of the forums here, and building on a few examples from others, I have put together a modified version of the LPD8806 library that uses the native hardware SPI on an Arduino board to significantly increase the write speed to the strip.
I have tested the code on an Arduino Uno (16MHz), with a full five-meter strip of 160 LEDs. At this size, the original software emulation took around 200ms to update all 160 LEDs. This gave me a refresh rate of only 5fps.
This very helpful post explains how to modify the write8() function to use direct port access, which is big improvement. This got me up to 25fps at 160 LEDs, but I still needed something faster.
http://forums.adafruit.com/viewtopic.php?f=47&t=22929Using the SPI bus directly, I am able to achieve refresh rates of up to 167fps (around 37us per pixel). It's actually fast enough that the amount of calculation you do between the show() calls can affect the framerate. For example, the sample functions colorChase() or colorWipe() -- which only modify two pixels each time -- run at up to 167fps with no delay specified. If you modify all of the pixels every time, the refresh rate drops to around 140fps. If you perform other calculations -- such as the sample rainbowCycle() function -- the frame rate drops to around 85 fps.
Again... all of these tests were done on a strip of 160 LEDs. If you are only running one meter (32 LEDs), you could theoretically get even higher speeds.
Any feedback or comments are appreciated. This is my first attempt at writing and publishing low-level code, but hopefully I have given credit to the original authors where it is due.
The library is currently posted at
https://github.com/cjbaar/LPD8806