Adafruit_Protomatter is a C library (with Arduino and CircuitPython front-ends) for driving RGB LED matrices (colloquially called “HUB75” matrices but that’s a vague term and not entirely accurate). We already have one such library — RGBmatrixPanel for Arduino — it’s older code that works fine for AVR chips (and a couple others) but has some limitations.
This guide was mostly to assist with porting Adafruit_Protomatter to new hardware, but has since been expanded with installation and basic use.
“Protomatter” was intended as a stand-in name until something better was decided upon, but we’d already moved in by that point.
In CircuitPython, it’s only seen by the sensible name rgbmatrix. But if working with the underlying C code or the Arduino library…sorry, you’re stuck with the awkward-to-type Protomatter name.
It originates in a quote from the character David Marcus in Star Trek III: “I used protomatter in the Genesis matrix.” Hopefully the library doesn’t develop a similar reputation as “unstable” and “dangerously unpredictable.”
Protomatter was planned with newer hardware in mind and will not be back-ported to AVR — simply use the prior RGBmatrixPanel there if you need it. The new library takes a casual approach to some things and isn’t particularly RAM-efficient, a crucial concern on AVRs. What Protomatter does provide includes:
- More flexibility in matrix chain width and height (RGBmatrixPanel only supports a few sizes).
- More flexibility in pin selection (old code was specifically designed for an Arduino UNO shield).
- Configurable bit depth, up to the maximum “565” color format used by Adafruit_GFX.
- Mostly doesn’t rely on esoteric peripherals — sticks with basic “PORT” GPIO and a timer interrupt. Some exceptions were made for ESP32-S3 and -S3.
- Mostly avoids cycle-counting.
A likely candidate device for porting will have:
- A reasonably fast 32-bit RISC core or similar (e.g. ARM, ESP32). Minimum we’ve used is a 48 MHz Cortex-M0+.
- One or more timer peripherals, 16-bit or better, with configurable period and with interrupts.
- GPIO with atomic bit-set and bit-clear registers, typically 32 bits wide…ideally tolerating writes to individual sub-bytes or words.
- RAM usage depends on matrix size, bit depth and GPIO pin selection. Minimum device we’ve used has 32 KB RAM (total for device, not all consumed by the library).
As currently written, Protomatter eschews the use of DMA or special peripherals beyond what’s described above. Goal is simply to get this working on a variety of devices with a minimum of fuss. We can tweak and optimize later.