Turn your Pico 2 W into a DualSense 5 dongle.
Turn a Raspberry Pi Pico2W (or other compatible board) into a wireless adapter for the DualSense (DS5) controller.
This repository only implements the core functionality of DS5Dongle — making a wireless controller appear as a wired connection. For additional features, please refer to Community Fork
This project enables the Raspberry Pi Pico2W (or other compatible board, e.g. the Waveshare RP2350B-Plus-W) to function as a Bluetooth bridge for the DualSense controller, allowing wireless connectivity with enhanced haptics support.
You have two options:
.uf2 — grab the newest
Releases build (ds5-bridge-<version>.uf2; other board
builds are bundled in other board.zip; config_tool.py is attached there
too). No tools needed.The firmware also supports a reboot-to-BOOTSEL command: the Reboot to Bootloader button in the web config reboots the dongle into BOOTSEL mode without holding the physical button.
You may need to replug the Pico when the controller is in pairing mode.
While the firmware is running, the Pico's BOOTSEL button doubles as a controller and reset control — no unplugging or re-flashing needed:
.uf2, without holding BOOTSEL while
plugging in.Triple click is a software path into the bootloader; you can also still enter it the hardware way by holding BOOTSEL while plugging in the Pico (see Flashing Firmware above). All of these act on click / double / triple / long-press while the firmware is already running.
You can modify the Pico settings via the web config.
Adds real-time haptic feedback generated from game audio. The Pico listens to the sound stream and converts bass and impact sounds into DualSense rumble — no game-side haptic support needed.
More customization features, such as adjusting audio, haptics, trigger strength, lighting, button remapping, and shortcuts.
OLED Edition is a fork of awalol/DS5Dongle (upstream) that adds an optional Pico-OLED-1.3 128×64 display add-on with 11 screens (status, 4-slot multi-controller pairing, lightbar color picker with favorites and effect presets, trigger test, gyro tilt, touchpad, diagnostics, CPU/clock, BT signal strength, audio VU meters, and a persistent settings menu), plus a DS5 button-combo soft-reboot.
Building on Awalol's and Loteran's work to expand simulated haptics and add new features like native haptics anti-aliasing, audio-leak, trigger vibrations, trigger resistance, gyro-aiming, automated profile loading. Detail Introduction
Firmware for the Raspberry Pi Pico 2 W that works for DualShock 4. Inspired by DS5Dongle with headset and microphone support and configuration abilities.
The Pico device will only be visible to the system after the controller is connected
Some behaviors depend on reconnection cycles to take effect
The controller microphone is exposed as a USB audio input — "Headset Microphone" on Windows. After selecting it as your recording device, raise its input/capture level in your OS: Windows in particular often defaults it to 0 (or very low), which makes the mic seem dead even though it is working.
When the connected DualSense reports its battery at or below 10% (and it is not charging), the Pico onboard LED switches
from solid-on to a 1 Hz blink so you can see the warning at a glance. The LED returns to solid-on as soon as the
controller is plugged in or its reported level rises again. The blink also fires when disable_pico_led is set — the
warning is treated as critical and overrides the LED-off preference; the LED returns to its disabled (off) state once
the battery recovers or the controller starts charging.
To opt out at build time, configure with -DENABLE_BATT_LED=OFF. Default is ON.
Pico W only has haptics support, no speaker. You can enable Pico W firmware compilation with -DPICO_W_BUILD=ON, or
download precompiled firmware from GitHub Actions.
The Waveshare RP2350B-Plus-W is an RP2350B-based board with the RM2 wireless module (same CYW43 silicon as the Pico 2 W), 16 MB QSPI flash, and a USB-C connector. Build with:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DPICO_SDK_PATH=<sdk> -DWAVESHARE_RP2350B_PLUS_W_BUILD=ON
cmake --build build --target ds5-bridge
Or download precompiled firmware from GitHub Actions.
Wake-on-PS is now built into the standard firmware — there is no separate feat/usb-wake branch or ds5-bridge-wake.uf2
build. It is disabled by default; turn it on with the Wake PC from sleep on PS button toggle in the
web config. When enabled, the dongle presents a HID keyboard interface and advertises USB remote
wakeup so a controller button can wake the PC; when disabled, that interface is not enumerated. See
Wake-on-PS for setup.
It is recommended to read #60 and #61 before using this feature.
The audio path — libopus encode/decode, the resampler, and the Bluetooth/USB packet handling on the hot path — executes from RAM instead of flash. This removes flash-fetch (XIP cache miss) stalls from the time-critical audio loop, which previously forced the RP2350 to be overclocked just to keep up with audio encoding.
As a result, the firmware runs the full audio path (haptics, speaker, 3.5 mm output, and microphone) at the stock 150 MHz clock — no overclock and no core-voltage bump.
Earlier releases required 320 MHz @ 1.2 V; overclocking is no longer needed. If you build for a different board and it fails to boot, reduce the CPU frequency (and/or raise the voltage) in
CMakeLists.txt.
You don't even need to clone this repo. Download just
tools/build-windows.ps1 to any folder and run
it in PowerShell:
powershell -ExecutionPolicy Bypass -File .\build-windows.ps1
(If you already have a checkout, run tools\build-windows.ps1 from the
repo root instead — it detects and uses your local checkout.)
The script installs every prerequisite (CMake, Ninja, Python, Git and the
ARM GNU toolchain — via winget, falling back to portable downloads if
winget is unavailable), clones the project (if not run from a checkout)
plus the pinned Pico SDK + TinyUSB into %USERPROFILE%\.ds5-build, builds
the firmware, and drops ds5-bridge.uf2 next to the script and on your
Desktop. It is safe to re-run; already-installed tools are skipped.
Build a fork or a specific ref with -Repo <url> / -Ref <branch|tag>.
Build a variant with -Variant debug.
To build from source manually:
Install the Pico SDK 2.3.0 and switch its TinyUSB submodule to tag 0.21.0 i.e. Update TinyUSB in the Pico SDK to the latest version
Initialise this repo's submodules: git submodule update --init --recursive
Configure and build with the standard Pico SDK toolchain:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DPICO_SDK_PATH=<sdk>
then cmake --build build --target ds5-bridge
Update TinyUSB in the Pico SDK to the latest version
Compile using standard Pico SDK toolchain
On macOS, tools/build-macos.sh can prepare a repo-local Pico SDK checkout, prompt to install missing Homebrew build
tools, initialize submodules, pin TinyUSB, and build the firmware:
tools/build-macos.sh
Use tools/build-macos.sh --clean to rebuild from scratch, or
--sdk-dir <path> to use an existing SDK checkout. When using --sdk-dir, the script asks before checking that SDK out
to the required Pico SDK and TinyUSB versions. If Homebrew's arm-none-eabi-gcc formula is installed without standard C
headers, the script asks to install the complete gcc-arm-embedded cask and points CMake at that toolchain.
The PS button = Xbox Game Bar toggle in the web config maps the controller's PS button to keyboard shortcuts, sent over the same HID keyboard interface used by Wake-on-PS:
Win+G, which opens the Xbox Game Bar overlay.Win+Tab, which opens Task View.The toggle is off by default, and the keyboard interface is only enumerated while it (or wake) is enabled.
If the Game Bar overlay opens but does not respond to controller inputs, Windows may be missing the modern input stack. Installing or updating Microsoft GameInput will resolve this and restore controller navigation. You can install the service directly by opening an elevated command prompt and running `winget install Mi
No open issues yet, or sync has not completed.