My latest side project, has been a mobile device based on an Pi Pico 2 (RP2350). Past projects I’ve done have used CircuitPython, but for this - I don’t think that’s the route I want to go.
This project was an evolution of my post earlier this year, on building a retro-computer with an RP2350. However, I have changed two things. First - I’m going to try and build a self contained and iPod-classic sized device, with a screen with input controls and some useful peripherals. Phase 2 will be to bring some of the stuff I experiment with here, (like the BASIC interpreter I describe below), back to the Fruit Jam.
My current plan, is to have this be able to play MP3 files, FM radio, and even have onboard WiFi and GPS. Being an outdoors person, the thought of having a lightweight GPS that yields coordinates and compass headings is kind of cool. Doubly cool, would be to embed a simple BASIC interpreter so you can program it by editing files on an SD card. Maybe, I’ll see about messaging!
The main challenge with this project - is likely going to be the MP3 (or other format) playback. I grabbed an I2S audio module along with some of the other components from Adafruit, so if I can decode the MP3 files from the an SD card, I should be good to go.
Maybe, if this works well - I’ll delve into sourcing the individual components and making a PCB for it. We shall see, as there’s something nice about being able to take all off the shelf components and building something, without needing for custom stuff beyond printing a case.
For software, I’m programming this in rust, and heavily using the embassy framework, and flashing the Pi pico via picotool. I built a firmware upgrade button into my test interface, so I can reboot into BOOTSEL mode without needing to unplug and press the button (unless I crash it!).
Current Parts List
- Pi Pico 2 W
- Adafruit SD1351 128x128 OLED & EYESPI Breakout
- PA1010D GPS
- I2C ANO Rotary Encoder
- I2C FM Radio
- USBC/Solar Charger
- 2500MaH Battery
- I2S DAC - NOT YET TESTED
- Accelerometer/Magnetometer - NOT YET TESTED
- Adafruit ST25DV16K I2C RFID EEPROM - I got this to experiment with, not sure if I’ll include it
- Also, Misc jumper wires, breadboard, STEMMA QT / Qwiic wires.
Current Test Board

Progress / Plan
Tech Tests
- ✅ Hello World over serial for debugging
- ✅ Get the SD1351 OLED screen working
- ✅ Get the Adafruit ANO Seesaw working for user input
- ✅ Get FM Radio working
- ✅ Get SD Card read/write working
- ✅ Get GPS working
- Mp3 Read off SD and play via I2s
- Get compass / accelerometer working
- Figure out use cases for the NFC/RFID breakout
- Can we do/integrate something like this to listen for ADSB?
- How can we hide the fm antenna?
Once I get the base setup working with all the hardware, I’ll turn to fine tuning the interface and UX:
- GPS/Compass Application
- FM Application
- Messaging Applications
- Can I get a bare-bones bitchat implementation to work?
- Or, meshtastic connection over bluetooth? If embedded it, would need to be a separate co-processor to run it, which might be too big.
- Can we embed a BASIC interpreter to run programs off the SD?
- Can we compile native programs, load into ram, and run them?
- Games
- Breakout
- Snake
- Maze (can we use the accelerometer like in the iPod version?)
- Can we emulate any popular games?
Block Diagram (current)
Constraints
The RP2350 has a dual core architecture, so my initial thought for how to tackle audio decoding is have core 0 deal with user input, I/O, and commands, while the 2nd can be put into different modes and run code depending on file formats the user selects. I might have core 1 put audio data into memory, where core 2 can decode without needing to go off-task.
One constraint I’m seeing is the fact that the current SD card I have, is sharing an SPI bus with the screen. That, and the screen refresh seems to be pretty slow. If I want to use the other core to read off the SD card, I might need to use a 2nd SPI bus and separate card reader instead of the one integrated in the screen.
I also spent a while debugging why my PA1010D GPS was returning nonsense over i2c. It turns out having both the FM radio and the GPS on the same I2C bus was causing the GPS to not be able to work properly. Removing the FM radio solved this, so I’I likely need to move that to the 2nd bus, or try to use an i2c multiplexer.
Rust Library Support
Rust has a fairly good ecosystem for the hardware on the Pi Pico. I have been basing most of my stuff on the embassy framework, which provides an abstraction layer that allows us to program the Pi’s hardware.
Being a more community driven thing, some of the software I have run into hasn’t been totally in sync. Seems like there’s been a lot of iteration on the HAL side, so I had to upgrade some of the libraries to get them to work. I will publish the rest of forks once I get further with testing.
adafruit-seesawRDA5807MFM radioPA1010D(this, I wrote from scratch to work withembedded_hal)- I found a working fork of
shared_bus, which works with embedded_hal 1.0 (non alpha)
More to come
I’ve been hacking on this in my spare time - my next steps, are to get the FM radio AND gps working properly, and to start investigating how to integrate MP3 decoding / playback over I2S. I have found a couple libraries that appear to do something similar to what I want, so supposing I can dedicate a core to decoding and streaming over I2S to my DAC module, it might work!
Also, will be experimenting with the other modules I have got, to see what other features I can add in!