Continuum is a light art display that is continuously in motion, with options to move quickly, slowly, or incredibly slow. The RGB LEDs in the display are updated 240 times per second, with unique colors calculated each update. A slider on the side of the display controls if the LEDs play back the content - currently Animated GIFs - in realtime, 1000x slower than realtime, or anywhere in-between.
The frame is powered by the Teensy 4.1, and the SmartMatrix Library, using the SmartLED Shield for Teensy 4. The LED panels are 32x32 pixel P5 (5mm pitch) RGB HUB75 panels combined to make a 96x96 pixel 480mm (18.9") square display that fits into an Ikea Ribba shadowbox frame. HUB75 panels require constant refreshing with data to display an image at a high rate: refreshed at least 100 times a second to look flicker-free to most people, and at least 200 times a second to look good on camera. The SmartMatrix Library and SmartLED Shield are designed to refresh HUB75 panels quickly and with high quality graphics, using up to 48-bit color depth to avoid the stepping effect seen when making subtle color changes with low color depth. Normally the SmartMatrix Library works with source content that is updated much slower than refresh rate, for example 30 frames per second for videos and a single image at a time. With this project, the library looks at two images at a time for each refresh, and creates a new image to refresh using linear interpolation. This wouldn’t be possible without the powerful Teensy 4, which has enough memory to store the additional pixel data and do all the computation necessary to calculate unique pixels for a 96x96 HUB75 display and refresh the display 240 times per second.
In addition to driving HUB75 LEDs, I’m using the APA102 LED support in SmartMatrix Library, and the JST-SM cable and 5V buffers built into SmartLED Shield to drive two meters of 60 LED/meter APA102 LED strip to light up the wall behind the frame in an Amibilight-like effect. APA102 LEDs are a good choice for this compared to WS2812/Neopixels as they have a 5-bit Global Brightness Control setting per LED, allowing them to be driven with pseudo 39-bit color depth vs 24-bit WS2812/Neopixels. This allows for smooth color changes without stepping seen with lower color depth LEDs. The colors for the APA102 LEDs are taken from the edges of the images driven to the panel, and interpolated over time just like the main panels.
The display’s controls are intentionally simple, with a mixer-style slider (linear potentiometer) for controlling the playback speed, and two rotary encoders: one for changing the content, the other for controlling brightness.
The LEDs are diffused with a frosted acrylic panel spaced far enough away from the LEDs that adjacent lights blend together a little bit. It dramatically improves the look of certain types of content, giving the display a very unique look.
I had the general idea for this display for some time, inspired by the Very Slow Movie Player project, and the smooth linear interpolation used by the Fadecandy LED controller. I really liked the idea behind the Very Slow Movie Player: a display that appeared to be stationary but when you looked at it again could be displaying new content. Unlike that project, I wanted to hide the transitions so even if you were staring directly at the display as it transitioned to a new frame, you wouldn’t be able to see the transition, or any movement at all.
See more details and build instructions here.