Raspberry Pi zero portable music player

Public Chat
Similar projects worth following
This is a portable music player based on a Raspberry Pi Zero. The first version was made using common modules this made it quite a mess, big and fragile. That's why I designed a PCB for it that has all the electronics on it.

The music player interface uses VLC as backend for playback and Pygame as frontend.

The assembled PCB can be bought on Tindie:

Why did I build this?

I made this music player because I wasn't satisfied with the current playback methods that are available. The music streaming services available started to feel like radio stations with the same music repeating, they are also depended on an online internet connection while there might be offline functionality it is still limited by the available storage on your phone.

Since most vinyl records come with a download code for MP3 files a dedicated portable music player with my own offline music collection seemed like a good option. Storage has become cheaper and cheaper in recent years so there should be a couple of music players with a lot of storage, right? Well that's not the case, there are a couple of high end players with enough storage, but these are a couple of hundred bucks. That's why I build the first version using parts I had laying around for a few bucks. Since then I've remade it a couple of times and I've finally come to a version that works completely and could be built for about €80, - including 64GB storage (depended on local pricing).



The display on this board has a resolution of 320 by 240 pixels with a screen diagonal of 2.2”. It is connected to the Raspberry Pi using the SPI bus.

I2S Audio output

This board includes the PCM5102A a 24-bit I2S DAC with a 3.5mm jack. This IC is used to generate high quality audio without a hum like you would get if your using the onboard PWM as audio source.

User controls

On the board are controls for navigation, volume control and backlight control. There is also a slide switch on top to select between the USB output (off position) and battery output (on position).

Battery protection and charging

The battery is charged using the TP4056 charger with a charge rate of 1000 mA. It is also protected by the DW01 battery protection circuit, this IC protects against: overcharge, overdischarge and overcurrent.

Battery monitoring and charging detection

Battery monitoring and charging detection are implemented using a ADS1015 ADC. The ADS1015 is a 12-bit ADC that is connected using I2C to the Raspberry Pi. Channel 0 is connected to the USB connection and channel 1 to the battery using a voltage divider, channels 3 and 4 are not being used but are broken out to two test pads next to the ADC.

Battery booster

The nominal voltage of 3.7v outputted by the battery is converted to a steady 5v output by the MT3608 step-up converter. The MT3608 include under-voltage lockout, current limiting, and thermal overload protection.


  • 1200 or 2000 mAh battery
  • 2.2" TFT display
  • 24-bit DAC (PCM5102A)
  • Safe shutdown on low battery (not implemented yet)
  • Navigation, volume and power buttons
  • Music player interface
    • Index music from /Music folder
    • Sorting by artist, album and tracks
    • Volume control
    • Queueing
    • Queue shuffling
    • Sleep mode (Backlight off)
    • Display artist name, album title and track title

Battery selection:

The case design allow a max battery dimension of 67x37x8mm. This 1200mAh batteryfrom Adafruit fits in the case and they also sell a 2000mAh version that theoretically should fit. An other option would be to source it from a battery bank or to buy one from Aliexpress.


Ethernet gadget:



Standard Tesselated Geometry - 458.77 kB - 08/05/2018 at 18:58


Standard Tesselated Geometry - 596.27 kB - 08/05/2018 at 18:58


Standard Tesselated Geometry - 206.14 kB - 08/05/2018 at 18:58


Standard Tesselated Geometry - 298.71 kB - 08/05/2018 at 18:58


Standard Tesselated Geometry - 327.23 kB - 08/05/2018 at 18:58


View all 8 files

  • 1 × Raspberry pi Zero
  • 1 × 2.2" TFT display
  • 1 × PCM5102 Data Converters / Digital to Analog Converters (DACs)
  • 1 × ADS1115 ADC to measure battery voltage and detect charging
  • 1 × DW01 Battery protection IC

View all 8 components

  • Update #11 quick update on new image and case version

    bram09/20/2018 at 20:53 0 comments

    Disc image

    There is a new version of the PiPod image available right here, this version has a few improvements:

    • Quicker boot time ~30sec thanks to disabling the network
    • It's easier to copy music to the device
    • The updating of the software is easier
    • Using your own Python launcher is made easier

    New case files

    The next PiPod board will have a thicker PCB to make the device more rigid. The STL files for the case are already available on Thingiverse. These files are named: Top_1.6mm_.stl and Bttom_1.6mm_.stl. There's also a new frame for the inside available this frame is more rigid and fits the 1.6mm and 0.6mm board.

  • Update #10: Fusion design files, disc image and software tweaks

    bram08/19/2018 at 20:37 1 comment

    Music player interface update

    I have been working on a new version of the music player interface. In this version, I switched from PyGame mixer to VLC because the support for more file types and to resolve some bugs that came from Pygame.  I've also switched the library to read the metadata and implemented a new software structure.

    Interface features

    The current features include:

    • Playing and indexing of MP3, M4A, WAV and WMA files
    • Queuing of tracks, artists and, albums
    • Displaying track metadata (song, artist and, album) 
    • Displaying song length and progress
    • Detect charging state and displaying battery voltage

    These are the most important features currently supported. It's pretty straightforward to add extra functionality that is in VLC player because it's used as backend (Thanks for the tip @Craig Hissett !).

    Disc image

    This new version of the music player interface is included in the disc image that I uploaded. This image has everything configured to start using the PiPod (except for the music ;) ). The buttons are configured using Retrogame, the display driver is loaded using modprobe and the musicplayer interface is started using systemd.

    Fusion360 design files

    The links to the Fusion360 design files have been added to the list of external sources. With these files you can tweak the components to make it fit your needs.

    Instructions update

    The instructions have been updated to include the disc image and have been tweaked a bit to fix mistakes.

  • Update #9: Final PCB

    bram08/02/2018 at 17:32 0 comments

    I have received and assembled the final version of the PiPod PCB in this version I replaced the CS4344 DAC with the PCM5102A, added the ADS1115 ADC to measure battery voltage and detect if it is charging and I redid the boost converter layout. I have also submitted the design of this board to the second PCB design challenge on PCBWay.


    I started assembling the bottom part of the board and used some 3D printed standoffs to easily assemble the top part. The information to assemble one of these board can be found on Github.

  • Update #8: New case and docking station

    bram07/05/2018 at 15:37 0 comments

    I have been working on a case for the new PCB and a docking station. The files for the docking station can be found on Thingiverse. I will release the design files for the case when I have a fully working PCB along with the PCB files.

    More pictures and details of the docking station can be found here.

  • Update #7 Fully assembled PCB

    bram06/12/2018 at 17:30 1 comment

    I have finally assembled a complete PCB, there are few change I will make on rev 2 but I have a prototype working. The power down function on this prototype isn't working yet and is kinda fixed by adding a slide switch. I've also decided to switch back to a PCM5102 DAC because I couldn't get a good enough clock pulse from the RPi to provide the CS4344 DAC with a MCLK. If I want to use this DAC I will have to add an external clock and for this I would have to redo the PCB and hope that I could get the drivers working. That's why I have decided to go back to the PCM5102 DAC on this prototype the DAC is sandwiched between the PCB and the RPi.

  • Update #6 First PCB received

    bram05/16/2018 at 19:18 1 comment

    Today I received the first version of the PiPod PCB from PCBWay surprisingly I received it earlier than the PCB's I ordered from Oshspark.  I first wanted to test parts of the circuit with the boards from Oshspark but because the board from PCBway was very cheap I decided to order it. So here they are:

    As you can see I ordered 0.8mm black PCB's this didn't cost anything extra. The boards come with HASL finish and an ENIG finish does cost extra but for this first prototype it doesn't really matter. When you select these options, the price is about the same as the Aisler and Oshspark boards the only difference is the quantity. The quality of these boards look good, the only quality issue I've found are the holes that aren't completely covered.

    Here are some more close-ups:

    I am still waiting on a couple of parts and when it has arrived I will assemble it further, for now I've soldered on the buttons to test the case.

  • Update #5 mockup of V2

    bram05/14/2018 at 20:57 0 comments

    Exploded view of the design

    Compared to V1 and my phone

  • Project details V1

    bram05/14/2018 at 20:14 0 comments


    • 1200 mAh battery
    • 1.8" TFT display
    • 24-bit DAC
    • Dimensions: 92mm x 70mm x 13,5mm
    • On/Off switch
    • 5 control buttons
    • Music player interface
      • Index music from /Music folder
      • Sorting by artist, album and tracks
      • Control volume
      • Queueing
      • Shuffling the queue
      • Sleep mode (Backlight off)
      • Display artist name, album title and track title

    Why did I build this?

    I had some spare time when I heard Apple was discontinuing their Ipod line. While I was reading about it I remembered that I had most part to build a MP3 player laying around, so I decided to build one.

    Project cost

    The price of this project is an approximation because I had most of the parts laying around.

    Raspberry Pi zero€ 5,50
    I2S DAC€ 3,00
    1.8" TFT display€ 4,00
    Powerboost 500C€ 17,95
    1200 mAh battery
    € 11,95
    64GB SD card
    € 30,99
    Other small bits and pieces€ 5,00
    Total€ 78,39


    Ethernet gadget:


  • update #4: Power button and custom PCB's

    bram05/05/2018 at 23:03 0 comments

    I am currently working on a single PCB PiPod. This new version of the PiPod will have a higher resolution display(2.2" 320x240), a bigger battery and a safe shutdown button. I have designed three small modules for the new parts that I want to use on this version these are currently being produced by @oshpark . While I am waiting on the PCB's and parts to arrive I am working on the final version that I want to verify with these small modules. These modules are also a great way to practice using my new reflow station before using it on the PiPod ;)


    Boost circuit
    Boost circuit
    DAC - CS4344
    DAC - CS4344

    Safe shutdown

    This power button circuit will make the Raspberry pi boot while the pi is booting it will turn on a GPIO that turns on  the booster circuit and a LED to indicate that the power button can be released.

  • Update #3: Better audio

    bram09/18/2017 at 20:46 0 comments

    Audio output

    Recently I milled a PCB with the audio circuitry on it from the original RPi and when I received the little I2S DAC from China last week I compared both the boards on audio quality.

    The quality of the dead bugged together solution was okay but it had a bit of white noise, I hoped that most of that white noise would be gone with the milled PCB but that wasn't the case. If the milled PCB wouldn't have had the white noise it would have been the perfect board because the audio quality was good enough (I only use it with earbuds) and it would have fitted better then the I2S DAC.

    I was really surprised with the quality of the I2S DAC, it is really small and the audio quality is great. I have edited the case so it would fit this board, I had to make the walls a bit thinner at the top to have the extra space needed for the board but that is unnoticeable. I also moved the power switch to make some room for the component of the DAC and with all that extra room I added a extra screw hole because I noticed on the first version that the case didn't close properly. The updated case can be found on Thingiverse.

    All the electronics inside

    What's next?

    The front part of the case is currently outdated but it still fits so I will keep it until I have decided what I am going to use as input method. I am currently looking at capacitive touch buttons and I will soon receive a kit of different kind of buttons I could try. If I have decided I will print a new front and mill a PCB for the buttons.

View all 12 project logs

  • 1
    Bare board assembly (for RPi placement skip to step 2)

    Recommended tools and supplies

    • Hot air reflow station
    • Soldering iron
    • Solder paste
    • Flux pen
    • Tweezers

    Component placement

    Start by soldering the SMD components to the board using a hot air reflow station. The names on the silkscreen (images bellow) can be matched using the part list.

    While placing the SMD components pay attention to the orientation of the MT3608(B6287z) and DW01 IC, below you can find pictures of the orientation.

    Booster circuit
    Battery circuit
    DW01 orientation
    Silkscreen Top
    Silkscreen Top
    Silkscreen Bottom
    Silkscreen Bottom
  • 2
    Aligning the Raspberry pi

    Align and solder the Raspberry Pi to the PiPod board with the 3D printed spacers. These make sure that the RPi is spaced 4mm from the PiPod board to fit the case.

    1. Get all the parts

    • 4x m2 screws
    • 1x RPi spacers
    • 1x RPi zero
    • 1x PiPod board

    2. Put a screw in the hole that is circled red

    3. Screw down the spacer

    4. Align the edges of the two PCBs and solder down the RPi

  • 3
    Case assembly

    1. Place the top down

    2. Put the navigation buttons in place

    3. Put the PiPod board on top (make sure you've put in the screw between the RPi and PCB circled in red)

    4. Put the side buttons in place and make sure they have a loose fit. If they are too tight you might want to file them down.

    5 & 6. Put the frame on top and screw it in place, make sure you don't overtighten them.

    7a. Screw the frame into the RPi frame using the red screws.

    7b. Place the printed rings under the RPi and screw down the blue screws.

    8. Solder the USB data connections

    9. Before putting it all together remove the support from the countersunk holes. After the support has been removed use a screw and soldering iron to clean it up / make the top of the screw flush with the surface.
    Put the bottom part in place and test if the buttons aren't too tight. If this is the case file down the bottom part.

    If everything fits nicely screw the part down.

View all 4 instructions

Enjoy this project?



Martin wrote 01/26/2023 at 14:44 point

Hey Bram, did you considered to put Spotify in it like this  ? That will be sooo awsome!

  Are you sure? yes | no

apocsantos wrote 09/29/2019 at 15:07 point

Since the project is retired on tindie, how about making the board  pcb design availiable for those of us still wanting to make a pipod ?

  Are you sure? yes | no

bram wrote 10/05/2019 at 14:05 point

Hey apocsantos, the pcb design can be found on the github page (

  Are you sure? yes | no

Martin wrote 07/21/2019 at 13:06 point

Hey Bram, i tried to install all dependencies seperately, but with no luck so i installed your image instead . Everything looks nice and works great! Question: how to run this tft on diferent OS (volumio,moode,rune)? fbturbo ? How to turn this lcd completely off? Regards

  Are you sure? yes | no

bram wrote 07/21/2019 at 14:06 point

Here's a nice instructable that shows you how to enable the TFT display on raspbian.

This should pipe the console to the display, this makes it possible to run everything that you would normally display on a HDMI display.

The display used is the TM022HDH26 this is the same display as the adafruit 2.2" TFT and the backlight can be controlled using GPIO 23.

  Are you sure? yes | no

drhatch wrote 01/21/2019 at 03:36 point

Bram -- thanks for the project. I built it, and it boots and runs perfectly. I get the playback screen and everything. Question: How to move files onto the SD card? I see the name is "usbpi" but PuTTY keeps saying "Connection refused." Thanks.

  Are you sure? yes | no

bram wrote 08/31/2018 at 20:56 point


That's an interesting idea for sure! but I've heard these are quite fragile and expensive compared to the LCD I'm using.

  Are you sure? yes | no

t0mg wrote 08/31/2018 at 21:54 point

Well some eink phats are less than $20 nowadays. I have also heard that some are very fragile (not sure if all are the same, my old kobo is indestructible). 

Looking at your project, it just felt like a great use case for that kind of tech: the eink screen's power draw is close to zero in standby (and if you don't show anything moving while playing songs - like a timer, that means almost all the time), and you can also make partial updates (eg only a small timer) that are drawing less power than a full screen refresh; so basically full refreshes could be reduced to menu navigation and when a new song is playing. Of course the UI would be slow, monochrome and minimalist - which is all fine for such a project.

And personally, if that makes a significant difference in the battery life (no clue at this point) I think it might be worth the extra money :)

Anyway congrats, very cool project !

  Are you sure? yes | no

bram wrote 08/31/2018 at 20:54 point

@mitcoes thanks for the suggestions.

I have been looking into battery options, what I would like to do is to add a JST connector for easy replaceability and to make a version of the case with an easy to replace 18650 cell.

The USB A ports would be a nice feature, but I think this would take up too much space.

  Are you sure? yes | no

Josh B wrote 08/30/2018 at 20:24 point

Awesome project. I'm building it for nostalgic purposes (mp3). 

  Are you sure? yes | no

Dave wrote 08/29/2018 at 20:28 point

Would this be able to work with the Zero W, as well? I'd love to add bluetooth functionality to this

  Are you sure? yes | no

bram wrote 08/31/2018 at 20:44 point

Hi Dave,

Using a RPi Zero W shouldn't be a problem, the only downside of using a RPi zero W is the higher power usage.

  Are you sure? yes | no

peter jansen wrote 08/19/2018 at 07:00 point

This is a really interesting project!  Do you mind if I ask how long the battery lasts for?

  Are you sure? yes | no

bram wrote 08/19/2018 at 09:50 point

Thanks, I haven't done proper testing to know how long the battery lasts, but I have used it for awhile and it lasts the ~5 hours a day I normally use it (with a 2000mAh battery). I have done a quick power usage test and while playing music it uses ~220 mA without the backlight on.

  Are you sure? yes | no

mitcoes wrote 08/31/2018 at 07:44 point

I think you must offer this results in the main product description: 5 hours battery with 2000 mAh model, also offer  the battery size - if there would be higher mAh batteries available and if it is removable - great deal, because having 2 solves autonomy problems for real music hooked. Also charging time and if they are fast charge internal and or externally - with a charger -.

Also I would add a internal or integrated USB2 - A port - to plug it as if it were batteries - to make it even more popular and easy to plug in music as USB pendrives are much bigger in Gbs each day and are easier to carry 2 or 3  than the very small SD cards - and there is no secondary SD card slot. And the big A connector much easier to plug without fear of disconnection than the little USB C one.

And I bet once it is finished is worth of thousands of sells even in Amazon but I would start to sell it in any crowdfunding platform - with a 10.000 units goal, asking price in China for that amount -  

I will back you for sure   

  Are you sure? yes | no

t0mg wrote 08/31/2018 at 12:38 point

Have you considered using an eink display instead of the TFT screen? With a UI that's designed to take advantage of eink, the power savings could be interesting.

  Are you sure? yes | no

Craig Hissett wrote 08/26/2017 at 00:13 point

This is phenomenal! Great project.

I need to build this.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates