The vast majority of DIY LED matrix projects currently in existence are simply repeating rows of lights with little to no diffusion, thus causing uneven areas of color to appear that can make images seem far too sharp. Even worse, they are also tough to expand, meaning that tacking on some extra rows/columns can lead to some serious rewiring. David Vogt's project aims to tackle this problem by using a modular system of 3D-printed panels that can be joined together to create a much larger one. The top of each LED is also covered by a ping pong ball, which helps to diffuse and soften the light in all directions.
Because Vogt needed even spacing between the ping pong balls, which each have a diameter of 38mm, he went with a large number of individually addressable WS2812b RGB LEDs that are mounted to their own PCB. The underside of a single LED module has six pads: two for +5V, two for GND, and serial data in/out for daisy chaining. Due to the need for fast pixel processing when it comes to images or more advanced graphics, a Raspberry Pi was selected. After it completes its task of deciding which LEDs need to be lit and how, it sends that data to a Teensy 3.2 that pushes the data to the LEDs.
Each subpanel matrix is identical and is comprised of a five-by-five grid of 3D-printed "holders," which have four cutouts for running wiring across the embedded LED and back out the other side. Once the LED has been secured in the middle, a secondary 3D-printed piece is slotted in that creates an even, round surface for the ping pong ball to rest in.
Vogt was familiar with the problems posed by driving a large number of LEDs from a single power source, owing to potentially dangerous voltage drops across a wide enough panel. To fix any potential issue, the columns of wiring channels are elevated above the wiring channels running horizontally with the aim of using one axis for a larger gauge of wire and the other for smaller "branches" going to the LEDs. Finally, each subpanel has a pair of slots on its four sides that allow for a given side to connect with another subpanel. After a few tense hours of wiring everything together, he moved onto the software portion of the project.
As mentioned previously, Vogt chose to use a Raspberry Pi in order to calculate pixels colors when running animations. This not only ensures a consistent and smooth frame rate, but it also let him make an entire virtual LED matrix simulator for previewing animations. The software he wrote is based around
BufferedImage objects which allow for any typical graphical Java operations to be applied and then exported. Vogt plans to add the ability to incorporate timelines and layering in the near future as well.
The final step of this project was getting the images created on the Pi to be sent to the Teensy 3.2 for display on the matrix. In a nutshell, the Java program on the Pi opens a serial connection with the Teensy and autodetects the display. When a frame is ready to be sent, its bitmap representation is pushed over USB to the Teensy which then adds the data to its internal buffer and, in turn, sends it to the awaiting LEDs.
To read about this project in more detail, you can visit Vogt' write-up here on Hackaday.io, and his demonstration video can be seen below.