I originally started this project because I wanted to recreate the scene in the movie the Close Encounters of the Third Kind where the humans are communicating with the Mothership via a huge color organ. So I glued various bits of software together and made some prototypes and before I knew it I was talking with the Mothership with my own color organ!
I was intrigued by the potential of the color organ, but without about 20 more years of piano lessons I would never reach that maximum potential. I wanted something more programmable, a general instrument, not a musical instrument thought, a LED instrument. I wanted something I could play, just like the idea of the color organ but with more complex patterns and animations and simpler controls. I wanted a way to add texture, color, and motion to music. I wanted a light show I could perform with, pixels to play with, a real-time playable instrument that could accompany a musical performance. I wanted it portable, scalable, easy to setup, easy to play, and so I built four PixelBrites, setup a couple of stage light trip-pods and plugged in my MIDI controller and laptop and I became the light show. Fun times were had by all!
But I knew I couldn’t be an overly protective parent and hover above my progeny all the time, I wanted the PixelBrite to act as a standalone light. I wanted to remove myself and the computer and simplify the experience. I wanted a disco coffee table and a minimalist light sculpture. I wanted to hang it on my wall and let it become part of the background. I wanted a night light, a party light, and a mood light. So I created a way to easily make animations and patterns and added a SD card slot to stream patterns without a computer. Now when I get home I get low-res ambiance without even opening my laptop.
If you ever had a Light-Brite when you were a kid then you might remember the experience of playing with light. PixelBrite is my digital version of the Light-Brite. It’s a plug-n-play light show, it’s a minimalist light sculpture, it’s a conversation starter and it’s a piece of wall décor. It’s a futuristic Ikea coffee table and a Daft Punk disco light. It’s bright, dark and colorful. It’s digital stained-glass. A center-piece or a perimeter-piece, it’s portable, playable and programmable.
Step 1: Project Overview
This will be your guide into the world of pixels. I’ll teach you a bit about color theory and display science, and then I’ll show you how I was able to make four PixelBrite LED panels. I’ll provide all the sources for building your own and provide a step-by-step guide. I’ve also included a whole bunch of pixel art patterns and animations I made with software included in this guide. I hope you find this guide useful and if you do let me know by getting in touch through my website: leonelabs.com.
Here’s the quick and dirty: tech specs, components, tool references, and downloads.
- Resolution: 10 x 10 pixels
- Operating Voltage: 5V
- Max Current: ~6A
- Max frame rate: 60fps
- Color depth: 24 bits/pixel = 16 million colors/pixel
- Size: 610mm x 610mm x 90mm
- Pixel fill factor: 90%
- Weight: <5lbs
- WS2801 RGB LED Pixel strands (25 pixels/strand, 4 strands/PixelBrite)
- Teensy Microcontroller (Atmel 32u4)
- SD card reader
- 10A DC power supply
- Acrylic panels
- MicroRax aluminum extrusion
- Painted foam waffle divider
- Custom PCB
- Misc. interface electronics (switch, button, resistor, etc…)
- Soldering iron
- Wire strippers/cutters
- PCB etchant, Developer, Acetone
- Hot glue gun
- Allen wrench
- Straight edge
All the files are available from the LeoneLabs PIxelBrite GitHub repo. This includes all the Processing and Arduino code as well as a whole bunch of content to play with.
Step 2: The Bill of Materials
I can think of no better way to sum up the PixelBrite hardware than with an awesome spreadsheet, chock-full of the most valuable information you’ll see all day. Behold!… the Bill of Materials…! This is really the one-stop-shop if you want to try and build your own PixelBrite.
Here’s the top four most expensive components
- $159.80 | RGB Pixels
- $129.10 | Laser cut foam
- $105.60 | MicroRax
- $56.82 | Acrylic
If there are better sources let me know!
Step 3: The Electronics
The electronics include off-the-shelf components and a custom printed circuit board (PCB). The circuit itself is relatively simple, the primary functionality is to read streaming pixel data from a USB port or SD card and then send it out to the LEDs.
A rocker switch turns ON and OFF the PixelBrite. When turned ON the Teensy microcontroller uses hardware SPI (serial peripheral interface) to send color information to the individual IC (integrated circuits) next to the LEDs. A push button is used as a hardware interrupt and to change the internal state of the microcontroller. The state can be changed from streaming data from the USB port to streaming pixel data from an SD card, a bit like an mp3 player but with pixels rather than sounds. On each button press, the next file in the SD card is read and displayed on the PixelBrite. The whole thing is powered from a 5V source which can come from a wall-plug or a battery pack.
This microchip is really the tentpole for this whole project. The WS2801 describes itself as a “3-Channel Constant Current LED Driver With Programmable PWM Outputs”, but in its essence the WS2801 is the magic that turns a simple RGB LED into and RGB Pixel. A WS2801 microchip sits next to each RGB LED in the strand and each one can turn a stream of high-speed ones and zeros into 8-bit grayscale color value in less than a thousand of a second(? need calc). What’s more, it passes along the data for the next pixel in the chain so everyone down the line can get their next color instruction. What’s even more amazing is that the next generation of LED controller IC’s (WS2811) are being integrated directly next to the LED as a bare die!
The power is provided by a 5V DC source and this could either an enclosed DC power supply like the one provided by Adafruit or a battery pack. I’ve tried both and both work. Depending on the pattern the current draw can be signicantly less than the rated maximum and so a batter pack can provide just enough juice for an event but not much more. I used a battery pack when using the PixelBrite as a coffee table or night light and it works well. For the stage events I’ll typically switch to a wall-plug DC power supply.
The real consideration when choosing the power supply, though, is the amount of current that they can provide. The individual LEDs can max out at around 20mA, so for 100 pixels with three LEDs per pixel that means the total system could draw upwards of 6 amps. I decided to measure the amount of current that was being consumed when a full-white image, which would correspond to max power. The results showed that rather than ~6A I was instead only drawing roughly 2.3A.
At less than half the rated maximum I’m speculating that it has something to do with the resistance of my interfaces or contact points. I’m using some pretty light crimp connections between the DC power supply jack and the PCB board which may be restricting the current draw. I’m going to poke around to see if I can’t uncover the cause of this.
Regardless, for battery powered use a lower current consumption is preferred and for most images and animations the amount of current needed is far below the maximum. The current discharge rate of the batteries will limit the maximum brightness of the system but as the video and images show, 4X AA batteries can provide enough current to turn the PixelBrite into an un-tethered coffee table, wall hanging, or mood light.
The engineer in me says there is still plenty of engineering to work out in this area. I’ll continue to see if I can’t flesh out more details in the future so stay tuned.
Step 4: LED Wiring
These RGB LED strands and strips have grown in popularity due to dropping prices, increased availability, and some good ol-fashioned open-source elbow grease. These strands provide a very convenient way for making an array of pixels and I first came across them on Adafruit which includes a ton of great resources for getting started. Be sure to check out these links if you’ve never worked with these LED strands before.
The LEDs are connected with 4 wires:
The LED strands from Adafruit come in 25-pixel sections. For the PixelBrite panel four strands are used, making a total chain of 100 pixels. The layout isserpentine rather than the typical raster scan layout used in digital displays. I chose the column-dominated serpentine layout in order for the PixelBrites to easily tiled.
The LED and populated PCB are encased in epoxy for weatherproofing. Cutting open one of the LED shells reveals the following.
For more detail: PixelBrite