JPL.mp3 / ESP32 Based Modern Digital Music Player

by jpet26 in Circuits > Audio

107 Views, 2 Favorites, 0 Comments

JPL.mp3 / ESP32 Based Modern Digital Music Player

IMG_0478.jpg
IMG_0481.jpg
screenshot_2025-05-04_17-41-09.png
96c0dc_7aff9594fc6149909ef7f0fbc70eefd1~mv2.jpg
An MP3 Player for 2025? / JPL.mp3

An iPod-esque mp3 player based on the ESP32 platform, bringing modern features to a classic form factor.

All files can be found on the GitHub repository

Read more on my website


Digital music players have a distinct appeal. Put simply, a combination of tactility, portability, and security combine to create a listening experience which, in my opinion, is fundamentally better than listening via a streaming service.

For a long time, the iPod was my digital music player of choice. But intrinsic to the line of devices is their age, limitations, and cost, all of which make modifications expensive and limited in scope. The solution? Building my own digital music play from scratch.

The JPL.mp3 was born out of a desire to ​have a functional and reliable digital music player which I could use on a daily basis but also meets modern performance, connectivity, capacity, etc. standards. I've also implemented a custom organization paradigm centered around classical music implemented through a custom database.

/* technical overview */​

​This project is based around ESP32-S3, which has advance compute and IO capabilities, while also being widely supported and thoroughly documented. I've implemented the PCM5102 I2S DAC for audio, MAX1811 BMS for power, and a microSD card for storage. Meanwhile, an IPS LCD display renders graphics, and a (very fun) mechanical clickwheel takes user input. These components, along with 0603 passives, came together on a four-layer rigid PCB, manufactured by PCBWay.

After prototyping in the ArduinoIDE, I took a leap of faith and migrated to the PlatformIO development environment. It ended up being an amazing choice, as it made development much easier and more flexible. That being said, I stayed in the Arduino development framework, allowing me to leverage myriad tried and true libraries. Most of it is standard (although poorly implemented - I barely knew how to write code, let alone organize an object oriented architecture when writing it) except for my organization/database paradigm.

​Because I love classical music and planned to primarily listen to it via this device, I decided to implement my own organization database which optimizes for it. Using SQLite, I was able to create a simple database which allows for organization by Composer/Piece as opposed to Artist/Album/Song, while also allowing for alternative parameters such as conductor, orchestra, performer, era, etc..

​Although I originally had grand ambitions for the enclosure, the device's body nevertheless ended up a collection of 3D printed pieces. All components slot into the front plate, while the battery is held onto the back plate with clips, and 14 mm machine screws tie the two together, sandwiching the PCB between the two (and screws are secured into threaded inserts, of course:).

The end result is a chunky, but nevertheless functional digital music player, vaguely reminiscent of classic iPods, yet subtly modern. The clickwheel and headphone jack clash with the USB-C port and layer lines to create something uniquely contemporary - but still inspired by classic technology.

I also committed to developing all aspects of the device in Free and Open Source Software. Although this was at times painful, it was a valuable experience - with the added benefit that all source files are hyperaccessible.

Supplies

[if you'd like to make one yourself, I highly recommend you download the source files and interact with them in KiCAD, FreeCAD, and VSCode to get a full grasp of how the device comes together. Please reach out if you'd like gerbers/3D print/BOM files directly.]

Before assembling anything, you'll need to fabricate some parts. I've published all requisite parts on the GitHub repo - but you'll need to interact with the design files to get the gerbers and 3D print files.

You'll need a few things for this build:

  1. PCB (four-layer rigid 1 mm board)
  2. Components (BOM derivable from schematic - mainly chips + 0603 passives)
  3. 3D printed parts (Frontplate, Backplate, Buttons, Switch Slide, Midplate, Battery clips)
  4. Hardware (M2x14 and M1.4x2 bolts + accompanying threaded inserts)

In addition to:

  1. Standard lab tools
  2. Soldering Iron
  3. 3D printer

Assemble the PCB

96c0dc_7aff9594fc6149909ef7f0fbc70eefd1~mv2.jpg
IMG_8201.jpg
IMG_8189.jpg

Hand soldering works but is error prone and tedious (I've done it a few times though), but a stencil or even preassembly are solid options. Refer to the schematic and board design to guide component placement. Flux and patience are your friends. You don't need too small of a tip for the 0603 either - good technique will suffice.

Flash the Microcontroller

Clone the GitHub repo and open it in VSCode with PlatformIO, then use a USB-UART adapter to connect to the ESP32. Flash the microcontroller, and the firmware should upload!

3D Printing

screenshot_2025-05-04_17-32-38.png

There's six different parts you will need to print:

  1. Frontplate
  2. Backplate
  3. Buttons (x2)
  4. Switch Slide
  5. Midplate
  6. Battery clips (x4)

I used PLA with standard settings; anything should work. Place heat set inserts using soldering iron.

Assemble!

FNEUO7FMDG8WRT5.png
FRUA7ETMDG8WRRN.jpg

Place the screen into the frontplate. Screw the midplate in to hold it in place. Plug the screen's ribbon cable into the board, and align the board with the frontplate. Add the buttons and slider in now. Once everything is in place, secure the battery to the backplate, and press the backplate into place, securing it with the M2x14 bolts.