The internet is sullying its collective pants over these animatronic eyes, and for good reason: a tiny color OLED screen provides a moving iris…the animation and intense colors are striking, like nothing you’ve seen.
Australian maker David Boccabella’s been posting his progress to the Stan Winston School of Character Arts forums, adding features and improving performance…though he’s hit a bottleneck recently…fortunately one that I recognized and may have a solution for…
In the progress videos you can see the pupil and iris “stuttering” as the background image — a BMP image file — is re-loaded off an SD card. The muscle contraction effect of the later video (using multiple image frames) is impressive in its realism, but the slow updates put a bit of a damper on the fun.
Something I (painfully) learned while working on the NeoPixel Painter project is that SD cards have two operating modes: a high-speed 4-bit parallel mode used by most consumer devices like cameras and card readers, and a serial (SPI) mode usable by more modest devices like microcontrollers. It turns out the SPI mode is inherently speed-limited…not just by the speed of the microcontroller or the SPI bus, but that the SD card itself can only issue blocks so fast over that interface…about 500KB/second if you’re really lucky.
David’s using the potent PJRC Teensy 3.1 microcontroller along with a small Freetronics OLED. The Teensy 3.1 has half a megabyte of flash program space…that’s huge. Not enough to store all the animation frames that were on the SD card…but given the speed of this microcontroller, it’s not necessary. By doing a lot of math up-front and placing the results in the Teensy’s copious program space, it’s only necessary to store a single iris image and apply some mathematical distortion to this in real time to create the muscle contraction effect.
I didn’t have the same OLED on-hand, so this was prototyped using a small TFT LCD display that operates on similar principles…the colors aren’t as nicely saturated but it proves the idea is sound…
In the Teensy 3.1’s ‘optimized-and-overclocked’ setting, this can manage 40 frames per second. Without overclocking, still a respectable 30 frames/second. No stuttering!
This was a quick-and-dirty test and the code is an embarrassing mess, there’s still a lot of room for some space optimizations and cleaning up some of the math. But if you’re interested in seeing how it works, I’ve posted the code on Github. Halloween’s coming and the world needs more monsters!