Will Robertson

Small scale RGB LED matrix

Small scale RGB LED matrix

Background

LED matrix side view

This project started as a development aid for a larger LED matrix installation. Rather than hauling out and wiring up the full-size display every time I wanted to test a change, I built a compact version that could sit on my desk and give immediate feedback. It ended up being a fun desk toy in its own right.

The display is built from two 16×16 WS2812B LED panels wired in series to form a 32×16 grid - 512 individually addressable RGB pixels in a form factor small enough to fit on a desk. A Raspberry Pi sits behind the panel and handles both driving the LEDs and serving the network endpoint that clients connect to.

How it works

LED matrix rear view showing wiring

The server's job is simple: listen on a UDP port, receive frames from a client, and push each frame out to the LED strip as fast as it arrives. This keeps the display logic completely decoupled from whatever is generating the content - swapping sources is just a matter of pointing a different client at the same address.

Each frame is a compact UDP datagram: a short header carrying the frame ID and image dimensions, followed by raw RGBA pixel data. Keeping the protocol simple meant it was easy to write new clients without touching the server.

Clients

ScreenCast is a Windows utility that continuously captures a region of the desktop and streams it to the display. You resize its window over whatever you want to show - a media player, a game, a visualiser - and it handles the downscaling and transmission automatically.

RADMAT (Really Awesome Display of Meteorologic / Atmospheric Things) polls the Bureau of Meteorology's FTP server every five minutes for the latest radar frames, scales them down to fit the panel, and streams them across. The result is a perpetually-updating rain radar on the desk.

A third client, gifstreamer, plays back animated GIFs in a loop - useful for idle animations or status indicators.

Links

Copyright © Will Robertson 2012 - 2026