RGB LED Matrix visualizer
For HUB75 modules, running on Raspberry Pi and Pico W
Project started on September 05, 2023.Last updated on March 08, 2024.
I initially bought a 32x32 RGB LED matrix in 2018. Back then the idea was to fit it onto a bag, as some kind of wearable device, for 35C3. But it never really worked out. So in preparation for CCCamp23 I noticed the LED panel again and decided to order some more of them.
These are the 32x32 4mm pitch RGB LED Matrix Panels from Pimoroni, with either the Interstate 75 W or the Adafruit RGB Matrix Bonnet to run them with a RP2040 or a Raspberry Pi, respectively.
Everything runs from a single Python codebase, either simulated in a GUI window on a development PC, on the Raspbian Python interpreter or directly on the Pico MicroPython environment.
For portability I'm simply using a voltage regulator to connect a 4S LiPo battery. I made one of them from recycled single-use vape batteries, but I also used some of my RC-model batteries.
On the software side I wrote some code to show static images, GIF animations, scroll text across the matrix, etc. I also implemented Snake, Tetris and Breakout, as well as some other utilities, like OTA updating for the Pico, a Telegram bot integration, a weather widget and a service checking if a device is reachable on the network.
Right now the 64x64 panel is placed next to the TV in my livingroom, randomly cycling through some animations and games.
I wasn't really able to get breakout into a playable state before CCCamp23. But luckily I also got a patch set (1, 2, 3, 4) from Jannis that fixed the collision behaviour of the ball in breakout! We met on the camp and had a very nice time together. And soon afterwards the patches appeared in my inbox and actually made the game playable! This was really awesome 😊💪 Thanks again!
Here are my notes for installing everything on a Raspbian OS.
sudo apt-get update sudo apt-get upgrade sudo apt-get install python3-pip git vim htop git clone https://github.com/adafruit/Raspberry-Pi-Installer-Scripts cd Raspberry-Pi-Installer-Scripts sudo ./rgb-matrix.sh # Answer y, Bonnet, Quality (and solder the mentioned link on the board) cd .. git clone https://git.xythobuz.de/thomas/rgb-matrix-visualizer sudo pip3 install Pillow bdfparser "qrcode[pil]" evdev cd Raspberry-Pi-Installer-Scripts/rpi-rgb-led-matrix/bindings/python pip3 wheel --no-deps -w dist . sudo pip3 install dist/rgbmatrix-0.0.1-cp39-cp39-linux_armv7l.whl sudo apt-get install libopenjp2-7 # append isolcpus=3 to /boot/cmdline.txt cat <<EOF | sudo tee /etc/modprobe.d/blacklist-rgb-matrix.conf blacklist snd_bcm2835 EOF sudo update-initramfs -u sudo reboot # test python bindings work cd rgb-matrix-visualizer sudo ./pi.py sudo sh -c 'echo enable_uart=1 >> /boot/config.txt'
Although I'm currently still having some problems getting the wetterdienst
dependency running on the Raspberry Pi.
I also want to give a shout-out to Pimoroni. I managed to rip-off the power connector on one of the panels. They sent a replacement without any additional cost, but I took the chance and ordered some more spare panels.
The modules bought this year have pretty consistent color reproduction. But compared to the one module I bought five years earlier, there is a very noticable difference. On these pictures both modules show the same RGB values.
I added some simple compensation to mostly adjust for this issue.
# For some reason the red and green LEDs on older Pimoroni panels # are far brighter than on newer panels. # Adjust this by multiplying rg channels with 0.75 and b channel # with 0.85, depending on hard-corded coordinate ranges. class MapperColorAdjust(MapperNull): def set_pixel(self, x, y, color): # second panel from the left, with 32 <= x, # is "old" type with brighter LEDs. # rest of panels to the left are less bright. # so adjust brightness of other panel channels down. if x >= self.gui.panelW: color = (int(color[0] * 0.75), int(color[1] * 0.75), color[2] * 0.85) self.gui.set_pixel(x, y, color)
I also planned to build a large LED matrix based on WS2812 LED strips. They can be driven easily with a Raspberry Pi.
I was even able to get a basic frame finished before CCCamp23. But that's where time ran out.
I haven't yet given up that plan completely, but I have to think of a solution for diffusing the light first. The LEDs are too small and spaced too far apart to look good in this configuration.