Skip to content

Releases: Bryan1club/micropython

PICO_COMPUTER_3 v0.017 -- Bluetooth speaker + USB drive support

Choose a tag to compare

@Bryan1club Bryan1club released this 27 Aug 12:16

Pico Computer 3 -- v0.017 (draft release notes)

What's new

Bluetooth Classic A2DP (stream audio to a speaker)

  • BLE activates automatically at boot; the board scans in the background and
    auto-connects to a Bluetooth speaker as soon as one is in pairing range --
    no manual steps needed if a speaker is already paired/discoverable.
  • New BT SPEAKER page: manual scan/connect/disconnect, test tone.
  • Confirmed working alongside WiFi -- both stay connected together, which
    matters if you're running more than one board (WiFi is how boards find
    each other).

USB flash drive support (machine.USBDrive, mounted at /usb)

  • Hot-pluggable, FAT32. Works alongside a keyboard/mouse on the same hub.
  • Known limitation, found and fixed this build: this board's USB host chip
    can only complete a single 512-byte sector per USB transaction --
    multi-sector reads used to silently fail. All USB reads/writes are now
    single-sector-safe, at some cost to raw throughput on very large folders.
  • Formatting a drive over 32GB to FAT32 has to be done from the board
    itself (Windows refuses FAT32 above 32GB in its own tools):
    import machine, vfs
    d = machine.USBDrive()
    vfs.VfsFat.mkfs(d)
    vfs.mount(vfs.VfsFat(d), '/usb')
  • Known open issue: on some hub/drive combinations, the USB connection
    can drop and reconnect unexpectedly during heavy use, occasionally failing
    to remount automatically. A retry-with-backoff was added this build, plus
    real error logging (previously silent), but the underlying cause isn't
    fully nailed down yet -- if you hit "USB drive mount failed" in the
    console, a physical unplug/replug clears it.

Music Player page

  • Browse /sd or /usb for .mp3/.wav/.flac, one-click play, playlists
    (add/remove/save/load/next/prev). Decoding is on-device, streamed straight
    to a connected Bluetooth speaker -- no PC-side conversion needed.
  • Large folders (100s of files) now load progressively (first ~10 entries
    show immediately, more load as you scroll) instead of blocking on the
    whole folder up front.

Resilience / recovery

  • Ctrl-C on a physical USB keyboard now reliably interrupts a stuck
    operation (e.g. a long USB read) within about a second, system-wide --
    no need to power-cycle the board to recover.
  • Keyboard-only list navigation (UP/DOWN/ENTER) as a fallback everywhere a
    mouse might be temporarily unresponsive.

Known issues going into this release

  • USB drive connection stability under sustained use is still being
    chased -- see above. Fine for casual use; a production console selling
    10+ units should treat USB storage as "usually works, has a recovery
    path" rather than "rock solid" for now.
  • No resampler in the audio pipeline -- a file whose native sample rate
    doesn't match what the speaker negotiated will play at the wrong
    pitch/speed. Not an issue for typical 44.1kHz files.

PICO_COMPUTER_3 -- USB flash drive support (mount/read/write confirmed on hardware)

Choose a tag to compare

Adds USB flash drive support to UKTailwind's PICO_COMPUTER_3 firmware (v0.16 base) -- plug a USB stick into the host port and it mounts at /usb, exactly like an SD card mounts at /sd.

Confirmed working on real hardware, 2026-08-26:

  • A USB stick auto-mounts at /usb on boot / on plug-in, with a console message and no manual steps.
  • os.listdir("/usb") lists real files correctly.
  • Both read and write confirmed (wrote a test file, read it back correctly).
  • No regressions seen in existing keyboard, mouse, Wi-Fi, or HDMI behaviour.

What's in it:

  • machine.USBDrive: a block device mountable with vfs.VfsFat, the USB counterpart to machine.SDCard.
  • pcusb.py: mounts/unmounts /usb automatically on connect/disconnect (event-driven, unlike the SD card's poll -- USB gives a real hardware signal).
  • Small keyboard.inject_report() / mouse.inject_report() groundwork hooks for a future Bluetooth keyboard/mouse feature (not yet built/wired up -- these just let a non-USB input source feed the same decoders USB input already uses).

Submitted upstream to UKTailwind as micropython PR #1.

To flash: hold BOOTSEL, plug the board in over USB, release BOOTSEL once it shows up as a drive named RPI-RP2, then copy the attached firmware.uf2 onto it. It reboots into the new firmware automatically. Back up anything important on the flash filesystem first regardless.