This is the gadget from the channel banner — the one that started as a cloud-bubble sketch and ended up living on my desk playing music with a glowing pixel face.
The idea
I wanted a radio that felt like a little creature instead of a boring box. The rules I sketched on day one:
- An LED matrix face that reacts to the music
- A big satisfying volume knob (the clicky kind)
- Small enough to sit next to my keyboard
- 100% printable on a mini printer bed
Designing it
The enclosure took three tries. Version 1 had no vent holes, so the speaker sounded like it was underwater. Version 2 fit everything except — oops — the actual speaker. Version 3 is the one in the banner: two-tone purple and grey, prints without supports, and the front grid snaps in so the LED matrix floats behind it.
The blueprint phase is where I learned the most important maker lesson so far: measure your parts before you model the case around them.
Wiring it up
The ESP32 talks to the LED matrix over SPI and streams audio out through the I2S amp. The rotary encoder handles volume, and pressing it switches stations. Everything solders onto one small perfboard so it doesn’t turn into a spaghetti monster inside the case.
The code
The face is just an 8×8 bitmap that swaps between frames. This is the heart of it:
// Pixel Radio — face frames (1 = LED on)
byte faceChill[8] = {
B00000000,
B01100110,
B01100110,
B00000000,
B10000001,
B01000010,
B00111100,
B00000000
};
void drawFace(byte frame[8]) {
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, frame[row]);
}
}
When the music gets loud, the mouth frames swap faster and the eyes go wide. That one feature took longer than the whole enclosure — and it was worth it.
What I’d do differently
- Add a battery so it isn’t tied to a USB cable
- Print the knob in TPU so it grips better
- Maybe… a second face on the back? Two-face radio?
The full build — sketch to solder to final test — is coming to the channel. Subscribe so you don’t miss it.