Record Players for Wendell and Ansel
Overview
I was pondering the kinds of toys that I want Wendell to be able to play with when I realized that he’s currently in love with a set of books that play songs when he pushes buttons on each page.
I thought to myself, wouldn’t it be cool if he had something like a miniature record player where he could choose the songs he wants to listen to?
And then it occured to me that I can make one! And more, that it would be awesome to make one for Wendell’s cousin, Ansel, too!
Features
- Small box with clasped lid, with minimal external alterations
- RFID/NFC reader to recognize music disks placed on top
- Internal MP3 player to play the music from
- Stylized buttons for interactivity (volume/track skipping, etc)
- A status light for feedback
- A turntable platform to place the records on
I ended up paring down some of the original feature goals I had – it turns out it was too complicated to take RFID/NFC readings on a spinning disk, and I didn’t have enough pins to control a motor driver… I also couldn’t get my capacitive touch buttons to reliably recognize long presses vs short presses, so the buttons only have a single operation (volume control)
Materials & Components
- Two small boxes – a wooden cigar box for Ansel and some kind of cd case for Wendell
- Xiao ESP32C6
- 4000 mAh LiPo battery
- PN532 RFID/NFC reader
- NFC stickers
- Mini vinyl record coasters
- DFPlayer Mini MP3 player
- 32 gb microSD card
- 3 W 8 Ω mini speakers
- RGB LED, common cathode
- Capacitive touch buttons & cool bolts
- A ton of silicone caulk (a requirement for any of my projects)
Assembly
I started by assembling a breadboard version of the electronics for this project, slowly building up from the mini MP3 player & speaker, adding the NFC reader, adding the RGB status light, and then finally the buttons.
The wiring for the NFC reader is slightly annoying, and I noticed that there were a lot of weird connectivity issues with it… That sort of persists into the final product(s), but after a ton of fiddling it is now work mostly-reliably.
After I felt confident that the wiring was all correct and that I had the basic electronic features I wanted to include (somewhat limited by the pinout space on the Xiao C6 board), I decided to get started with a more permanent perf-board version of the electronics.
I felt that it was crucial that each of the peripherals could be disconnected via plug to help with assembly and any future repairs. I ended up using almost all of my little plugs, and was forced to cobble together a combination of different types of plugs… Sort of annoying that I couldn’t just use all the same types of plugs throughout, but at least it’s a little more challenging to plug things into the wrong place?
I then did some drilling and gluing to make spaces for each of the peripherals – the status light sticks through the top of the box and is held in place with silicone, the NFC reader and speakers are screwed in, the capacitive touch buttons are held on with some cool brass bolts I found (externally the buttons are just the heads of the bolts, which I think is a very cool look!).
I crafted a little felted cardboard cutout that snugly fits over the electronics and makes for a kind of inner lining for the box. My hope is that the disks can be stored in here. However, this is probably going to kill the box in the end… I did a terrible job planning the routing for the wires to the upper part of the box – the bundles status light and the NFC reader just kind of dangle down, and they get folded in the same spots over and over every time the box opens and closes… They’re going to inevitably break, and it’ll be a sad day when that happens.
This was part of why I wanted everything to be unpluggable – when stuff breaks, I figure I can just yoink it out and replace it!
The second box
The next task was to just re-do everything entirely – a new perf board PCB, wiring up all the peripherals, misusing a drill – for the second box! I found this second one and am just so much more pleased with how this one works for this project.
The biggest boon with this box is that the split is directly in the middle – which makes for a very deep space that fits all the electronics on one half of the box, with no wires crossing the hinge. This makes for a much, much cleaner appearance and honestly will likely last a lot longer!
Code
This was by far the most complicated little embedded project I’ve worked on. There’s a long list of peripherals that need to be initialized and managed; the loop has to assess battery levels, check for new disks and extract the NFC payload, handle button presses, check peripheral health; the MQTT topics are publishing state information and receiving/handling commands… I guess that’s pretty much everything, but it felt a lot more complicated while I was cobbling it all together.
Some code was borrowed from GitHub repos and product wikis – like for the DFPlayer Mini wiki, which has a ton of info on the possible input functions, such as Player.play(xx), or Player.stop(), or Player.readState(). I’m chagrinned to admit that once again I needed to lean on ChatGPT to help write some of the functions to extract the NFC payload to get the folder/song to play on the disk; someday I’ll know enough C++ to figure these things out on my own, but for now it was immensely useful to get working prototypes that I could modify.
A piece of what made this feel so complicated is that I tried to use header files to keep things organized – the config.h, helpers.h, peripherals.h, secrets.h, all got somehow more unwieldy in the end…
Home Assistant Integration
I know Ansel’s house does not have Home Assistant, but I thought it would be fun to integrate Wendell’s into my HA instance – that way I can control the volume and skip tracks from my phone, if things are getting a little crazy.


