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.

Welcome to my Instructable, I hope you enjoy.

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.

Technical Specifications:
  • 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
Hardware Components:
  • 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...)
Build Tools:
  • Soldering iron
  • Wire strippers/cutters
  • Dremel
  • Hacksaw
  • PCB etchant, Developer, Acetone
  • Caulking
  • Hot glue gun
  • Scribe
  • 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.
<p>I'm going to attempt to make this using a Raspberry Pi as the controller and including Amazon Alexa to make it voice activated.</p>
<p>Hi ! Very good idea could you tell us if you succeed in working the code on raspberry please ? thx !</p>
I have a hard time with the programming stuff. I have never done any before and I taught that I could just download the libraries and the code and simply run it into the Teensy 2.0, but it seems like the codes have some errors...<br> <br> In the LeoneLabs_PixelBrite_v1 code, it says &quot; 'istream' has not been declared.&quot;<br> <br> How can I simply run the codes all together into the Teensy? I have all the libraries (SDfat and WS2801) in the Arduino libraries folder, but there is always those errors appearing in the software... I just want it to run like it did for you... Please guide me here.<br> <br> Thank you,<br> <br> William
istream is used in the SDFat library. You may want to try reinstalling that library or try a slightly older version. I believe I built the PixelBrite software with sdfatlib20120709 and Arduino 1.01. What version of SdFat are you using? Also what version of Arduino? Also are you able to load samples on the Teensy using the Teensyduino software from PJRC<br><br>MLeone
<p>Hi I am having the same problem and I cannot find the sdfatlib20120709. I am using the link you provide here. Could you give me advice on how I would go about addressing this issue?</p>
<p>Hi Leone, Thanks for this amazing instructable. </p><p>I'm trying to use PixelPal software alone but I only have a grey screen. Nothing more appear. When I tried to lauch the software directly form Processing, I have the message &quot;No library found for ws2801&quot;.</p><p>I have the last Java and Processing and I have installed ControlP5 and GifAnimation library but notthe WS2801. The link you give in you instructable is the library for the Arduino, not the Processing. Moreover, in the Library manager, the WS2801 doen't exist. Where I'm wrong. Thanks for your help. </p><p>Best regards</p><p>PierreD</p>
<p>Thank you for the nice instructable</p><p>Rima</p>
<p>Got a question about the acrylic. I'm not getting really any transparency through the acrylic. I have the ACRYLITE&reg; LED (P95), sheet, Black/White 9H04 SC mounted with the matte side facing the LEDs and the glossy side facing out. But I get almost no light pass through.</p>
<p>I actually am really getting zero light. I've held it up to multiple light sources in the dark and I get zero transmission. Is this truly the acrylic you used? From the picture it looks more like something with much more transparency.</p>
<p>I would try flipping the acrylic around!</p>
<p>I recently made this, hooked an arduino to a matrix of 150 LEDS. Made it into a coffee table. I enhanced the project with a spectrum shield, so instead of using a SD card for preloaded content I can stream music for a visualizer. To further enhance the project I connected a Raspberry Pi via i2c and made a web app running on the Pi to change the color of the lights. This tutorial is an amazing starting point to create your own ideas. Thank you for it!</p>
<p>That is really Effing Cool.</p>
<p>Hey all, thinking of making this, The wiring seems a bit complicated , wondering if I do get suck if someone would be able to help me through Skype or something. Just want to make sure that if I do make this that I have a contact that will be able to help me XD </p><p>Thanks.</p>
<p>Is there anyway you could briefly explain how exactly the &quot;Streaming&quot; portion of your code works? As far as i can decipher the LEDStream function simply stores the data to the SD card, it doesnt actually stream to the pixelbrite? i havnt finished the construction of my own version yet so i havnt been able to verify this yet... Thanks!</p>
<p>In the Arduino Sketch, it says in the beginning it is compatible with PCB v2. Were can I find the layout for the second version of the PCB? I'm asking because running the sketch with the v1 I have downloaded here does not seem to work properly. </p><p>Thanks,</p><p>WP</p>
<p>In fact, what happens is, when I power up the PB, it shows briefly: Full Red, then Full Green, then Full Blue. I assume this is the Rainbow in the opening setup. But then, it turns black and the full white rather than just black. Few pixels don't even light up in the full white. Also, when I try to switch between SD and USB with the momentary switch, it doesn't do anything... </p><p>I changes the NUMpixels to 49 since I'm using 7x7. I would like to put some animations on an SD card and stream it. Can you explain to me the process ?</p>
<p>Very nice job! Can this work with an Arduino UNO and WS2812 LEDs?</p>
<p>So I decided to give this a try and test it out on a breadboard first. I edited the fritzing file of your PCB and arranged everything in the breadboard view so it should (!) work when I put it together. I'd apprechiate it if somebody cold check the breadboard layout though .. before I accidentally fry something :) - might be even helpfull for other people who want to give this a try, too. (Its been ~10 years since I last fiddled with a breadboard but this project seems worth the trouble)<br>Updated Fritzing file with my breadboard attempt: http://www.upl.co/upload/w5Jb9Wg2B<br><br>Also, while going through your fritzing files I noticed that two wires in the schematic view were not actually connected even though they visually appear to be (Pin5 [D0] with the screw terminal/resistor and a wire from the molex connector to the switch)</p>
<p>I love your Project gonna build it for school soon :D</p><p>But I have a Question: Why isn't the SD Adapter connected to the standard SD Pins on the Teensy and where are your custom Pins declared? </p>
<p>The &quot;standard SD Pins&quot; are hardware SPI pins within the microcontroller. I decided to use them instead for the SPI-like interface to the WS2801 LED pixels rather than the SD card. I thought this might help performance but I've never confirmed it. The custom pinout is declared in the sdfatconfig.h file, where the pin numbers can be changed under the &quot;software spi&quot; section.</p>
lovely project. <br>what's the grid of the PixelBrite circa2010 made of? it looks semi transparent
Great project! You mentioned a madrix script that you wrote to stream data to the pixelbrite via your software. How does it work?
Is there a way to swap the RGB data to be used with strips with BGR ordering? I was able to modify the ws2801.h library file but that only fixes the SD stream. Is there anywhere in the pixel pal source files that can alter the ordering for the usb stream?
Did you find the acrylic fit perfectly for you or did you have to do any adjustments? I'm finding that with the tri-corner brackets all snug and flush with the rails the acrylic won't slip in. Looks like I need to shave a mm or two off. Can I run this stuff through the table saw?
I progress in the project, but I can't display pictures from the SD card. <br>The main problme come with this line in SDstream : <br>myFile.read(pixelbuf,numPixels*NCOLORS) <br> <br>How does it works, because we don't specify the type of file or anything ? What kind of picture must I use ? I have a 10x10 matrix. <br> <br>Thanks
The SDstream code relies on SDFat.h library, so be sure you have that installed.<br> <br> Included in the SDFat library is the SdFatConfig.h file which includes some code for defining which pins are being used to communicate with the SDcard reader via a Software SPI interface. The code in the SdFatConfig.h file will look something like this (minus my comments). You'll need to make sure these pin values match the physical pin values you are trying to use with your setup.<br> <br> #define USE_SOFTWARE_SPI 1 // define software SPI pins so Mega can use unmodified 168/328 shields<br> /** Default Software SPI chip select pin */<br> uint8_t const SOFT_SPI_CS_PIN = 6; //ML - was 21<br> /** Software SPI Master Out Slave In pin */<br> uint8_t const SOFT_SPI_MOSI_PIN = 8; //ML - was 19<br> /** Software SPI Master In Slave Out pin */<br> uint8_t const SOFT_SPI_MISO_PIN = 9; //ML - was 18<br> /** Software SPI Clock pin */ uint8_t const SOFT_SPI_SCK_PIN = 7; //ML - was 20<br> #endif // SdFatConfig_h<br> <br> The myFile.isOpen() line in the SDStream code will open the files that are in the root directory of the SDcard. You don't need to specify the name but you do need to be sure the proper naming convention is used. This naming convention is called &quot;8.3&quot; ( here's a <a href="http://en.wikipedia.org/wiki/8.3_filename" rel="nofollow">wikipedia link for reference</a>)&nbsp;which means the filenames need to &lt;8 characters and the extension needs to be &lt;3 characters.<br> <br> The files which are saved in the PixelPal software are just binary files, the contents is just a big string of numbers, there's no header information. So for instance if you try to display a 10x10 PixelBrite pattern on a 20x10 PixelBrite display the image will look scrambled. You can generate the PixelBrite patterns from the PixelPal software.<br> <br> Hope this helps. Let me know if you have any more questions. Cheers.
Ok have already configured the sdfatconfig.h, but How can I made a compatible file for my 10x10 matrix from a PNG picture ? Or how can I edit the binary files ? <br> <br>Thanks for your answers <br> <br>PS : When I use the pixelbrite software, only 21 leds are illuminated in a random way. Do you know anything about this problem ?
Awesome project! Still working on my build but when setting up the software, I'm having problems with defining the size of my array in PixalPal. Changing from 10x10 to anything else doesn't seem to do anything. It doesn't change the player window the way it does in your video.
Hmm... you have to press ENTER when you put in a new value in the textbox. Did you try that?
Ha I could have sworn i tried that...working now:)
I found cheaper led pixels, 10 dollars cheaper each on <br/><br/>http://www.adafruit.com/products/322
Hi leonelabs, <br> <br>I'd like to begin by congratulating you on an exceptional project and great instructions. <br> <br>I'm in the process of starting this wonderful project but i'm having a hardtime opening any of the files on GitHub, could you please tell me what pograms i should be using to open all the files. especially the fritzing or pcb file as i wish to etch my own pcb but cant seem to get anything to open. <br> <br>Thankyou kindly. Dave <br>i can be contacted on dbholdsworthgmail.com
Thanks for the support! <br> <br>To download all the files, use the &quot;download ZIP&quot; button in the lower right corner of the GitHub page. <br> <br>Then you'll need to download Fritzing (http://fritzing.org/download/) to open up the PCB layout.
Superb creation. I made one.<br> <br> I have the Teensy/SD reader working on a breadboard.&nbsp;<br> <br> I hand cut the waffle out of foam core. Came out better than I expected but took forever.<br> <br> I do have one question - (disclaimer - I'm a microcontroller/teensy/arduino novice) - I'm good with c and electronics.<br> <br> I couldn't get the SD card readerto work on the pins in the schematic. I had to use B0-B3 for the card (and move the lights to 6 &amp; 7). Is this because of my environment, or do I need to make changes to core_pins, or other include file?&nbsp; core_pins.h is a teensy creation and contradicts the info card that came with the Teensy 2. It's for the C language side of the info card, not the arduino side (which is how Pixelbright is implemented)<br> <br> Still working on this but any insight appreciated. Is it OK to leave it this way? (B0-B3 for card, lights on 6 &amp; 7)<br> <br> Soon, I will try to get it working with a DMX-SPI convertor/controller. Any thoughts on this?<br> <br> Excellent project and thank you to Leone Labs for the idea!
Thanks for pointing this out. I forgot to include this in the Instructable, the software SPI pins need to be changed in the sdfatconfig.h file that's included with the SDFat library in order to match the wiring schematic. Here's what I ended up using. <br> <br>#define USE_SOFTWARE_SPI 1 <br>// define software SPI pins so Mega can use unmodified 168/328 shields <br>/** Default Software SPI chip select pin */ <br>uint8_t const SOFT_SPI_CS_PIN = 6; //Leonelabs - was 21 <br>/** Software SPI Master Out Slave In pin */ <br>uint8_t const SOFT_SPI_MOSI_PIN = 8; //Leonelabs - was 19 <br>/** Software SPI Master In Slave Out pin */ <br>uint8_t const SOFT_SPI_MISO_PIN = 9; //Leonelabs - was 18 <br>/** Software SPI Clock pin */ <br>uint8_t const SOFT_SPI_SCK_PIN = 7; //Leonelabs - was 20 <br>#endif // SdFatConfig_h <br> <br>Let me know if I can help any further. I'd be curious to see how you incorporate DMX.
Thanks for the helpful reply. I'll plunge back in Saturday morning. <br> <br>Why did you make this change? I googled around a bit for SOFT SPI etc etc. But nothing specific yet. <br> <br>Do you have pointers to more info about this, or a quick explanation? <br> <br>Thanks, I know this isn't Arduino 101 class. I appreciate your help.
I decided to use the hardware-based SPI for the LED control and the software-based SPI for the SD card because I believe the hardware-based SPI can achieve higher speeds for the case of streaming from the USB (not the SD card), which is what I want for video frame rates(&gt;30fps). The term &quot;hardware-based SPI&quot; refers to the fact that the SPI protocol is essentially hardwired into certain pins of the microcontroller. The term &quot;software-based SPI&quot; refers to the fact that the SPI protocol can be mimicked by &quot;manually&quot; toggling the outputs of any set of digital IO pins via a set of software instructions. Hope this helps. Cheers.
hey Leonelabs, very very nice working. I Wondering, you use teensy for microcontroller, can i use arduino instead of teensy (because teensy not available here and i also already ordered 6 months ago which never came) ? also do i need to tweak the code for arduino ? thanks a lot
Would it be better to put some gloss on the paint or is it not necessary ?
&quot;Gloss&quot; won't really help. Gloss might give you more specular reflections rather than diffuse/scattering reflection but it won't increase the amount of light be reflected.
This looks really great. I just wish I had the money for all the materials. :x
Simply incredible... I now want to do the ceiling of my apartment like this :D <br> <br>Looks like the biggest expences were the LED's themselves and the laser cutting service. <br> <br>if you dont count your personal time and skill to the end expenditure, one could fabrivate the &quot;waffle&quot; with a straight edge and a Xacto knife.
Your quite right, in fact the very first prototype I cut the waffle grid by hand, although it was only a 5x5 grid rather than a 10x10.
That's pretty amazing! <br>I have a question.. How could you (if it is even possible) make the LED's sound/music reactive? I mean, like adding a mic, and then if you say, play the guitar or piano in front of it, the LED's would react to it.. Is that possible? and how? :) <br> <br>Thanks for this! I will have to try it myself, can't wait!
The PixelBrite is kind of like a secondary display so if you have a laptop or tablet you could plug the Mic into that and use your own music visualizer to stream a pattern to the PixelBrite via USB. Good luck. <br><br>Cheers, <br>LeoneLabs
Just A.M.A.Z.I.N.G ! :-O <br>Count me in for a kit and/or crowd funding campaign supporter... can't stand waiting :-P
Thanks for the support. Let's cross our fingers that we can reach escape velocity and get the PixelBrite in orbit!
Another future &quot;shut up and take my money&quot; supporter for a kit reporting in. =o

About This Instructable




Bio: I'm an artist and engineer living in Jackson, WY.
More by LeoneLabs:PixelBrite Laser Ball 
Add instructable to: