DeVayu's Raspberry Pi Pico LED Matrix Controller Drives 2,048 LEDs at 28 Frames Per Second via Wi-Fi
Pseudonymous maker "DeVayu" has turned a Raspberry Pi Pico into a high-performance driver for a 64x32 RGB LED matrix — and added Wi-Fi support through a companion Espressif ESP8266, offering updates at up to 28 frames per second wirelessly.
"My original plan was to use a Raspberry Pi 3 [Model] A+ to drive this matrix using the overpriced marxist Adafruit HAT. While it worked okay-ish it was quite glitchy, especially when streaming the image over MQTT because the kernel interrupts destroyed the precise timings the matrix requires," DeVayu explains.
"Then a few days ago, I had the idea to use a Pico which should be better because it has no kernel to wreck the timings and because of PIO [Programmable Input/Output] it should be fast enough."
Using an example LED matrix driver script provided with the Raspberry Pi Pico Software Development Kit (SDK) as a base, DeVayu worked to get the performance up over a wireless connection — handled by an Espressif ESP-01 module connected to the Raspberry Pi Pico via UART. "One core [of the RP2040 microcontroller] just refreshes the panel at about 500Hz, the other listens for TCP data. The Pico is overclocked to 250[M]Hz, BTW.
"Because I didn't want to implement the MQTT protocol (again), I'm using a simplified protocol for transmitting the data. To improve frame rates I'm compressing everything using ZSTD, which was quite a challenge to get working due to memory constraints.
The finished system is able to play back animations over the entire matrix — 2,048 individual RGB LEDs — at a rate of around 28 frames per second, with the clever compression approach near-doubling the peak frame rate. "10 FPS was easy," DeVayu explains, "but when I pushed the baud rate of the ESP, the corruption increased, so I only got to about 15 FPS. ZSTD reduces the size of each frame to about 5 percent, which is how I was able to get the 28 FPS."
More details are available on DeVayu's Reddit thread, while the source code — plus "some very bad documentation," the maker admits — has been published to GitHub under the permissive BSD three-clause license.