BT2N64 — Bluetooth to N64 Adapter¶
BT2N64 turns a Raspberry Pi Pico W or Pico 2 W into a wireless Bluetooth-to-N64 controller adapter. Pair any supported Bluetooth controller and play N64 games wirelessly with rumble support.
Features¶
- Wireless Bluetooth controllers on real N64 hardware
- Rumble pak emulation (rumble forwarded to BT controller)
- Controller pak identification (games see a rumble pak)
- 3 button mapping profiles (Default, FPS, Mario)
- Cold boot detection (works from console power-on)
- BOOTSEL button: click to scan for new devices, hold to clear all bonds
Supported Controllers¶
Pico W / Pico 2 W (Classic BT + BLE)¶
| Controller | Status |
|---|---|
| DualSense (PS5) | Supported |
| DualShock 4 (PS4) | Supported |
| DualShock 3 (PS3) | Supported |
| Xbox One / Series | Supported |
| Switch Pro | Supported |
| 8BitDo controllers | Supported |
| NSO GameCube | Supported |
| Generic BT HID | Basic support |
Hardware¶
Requirements¶
- Raspberry Pi Pico W or Pico 2 W
- N64 controller extension cable (cut one end) or custom wiring
- 3 wires: Data, 3.3V, GND
Wiring¶
| Pico W Pin | N64 Controller Port |
|---|---|
| GPIO 2 | Data |
| 3V3 (OUT) | 3.3V |
| GND | GND |
N64 Controller Port Pinout¶
Looking at the front of the console's controller port:
___________
/ 1 2 3 \
| 4 5 6 |
\___________/
Pin 1: GND
Pin 2: Data
Pin 3: 3.3V
Pin 4: N/C
Pin 5: N/C
Pin 6: GND
Firmware Files¶
| Board | File |
|---|---|
| Pico W | joypad_*_bt2n64_pico_w.uf2 |
| Pico 2 W | joypad_*_bt2n64_pico2_w.uf2 |
Installation¶
- Hold BOOTSEL button while connecting Pico W/2W via USB
- Drag and drop the
.uf2file to theRPI-RP2(Pico W) orRP2350(Pico 2 W) drive - Drive auto-ejects when complete
- Connect to N64 controller port
Pairing¶
- Power on the N64 with the adapter connected
- The adapter automatically scans for controllers on boot
- Put your Bluetooth controller into pairing mode
- Once paired, the controller reconnects automatically on subsequent use
- Click BOOTSEL to start a 60-second scan for additional devices
- Hold BOOTSEL to disconnect all devices and clear all bonds
LED Status¶
The onboard LED indicates adapter status:
| Pattern | Meaning |
|---|---|
| Fast blink (100ms) | N64 console not communicating (check wiring) |
| Slow blink (400ms) | N64 OK, no Bluetooth controller connected |
| Very fast blink (50ms) | N64 OK + BT connected, but no data flowing |
| Solid on | N64 OK + BT connected + data flowing |
Controller Profiles¶
Switch between optimized button mappings. Hold Select for 2 seconds, then press D-Pad Up/Down to cycle profiles. The controller rumbles to confirm.
Default Profile¶
Standard N64 mapping with right stick mapped to C-buttons:
| BT Input | N64 Output | Notes |
|---|---|---|
| Cross/A (B1) | A | |
| Square/X (B3) | B | |
| Circle/B (B2) | C-Down | |
| Triangle/Y (B4) | C-Left | |
| L1/LB | L | |
| R1/RB | R | |
| L2/LT | Z | |
| R2/RT | C-Right | |
| Select | C-Up | |
| Start | Start | |
| Guide/Home | Start | |
| Right Stick | C-buttons | Threshold-based |
| Left Stick | Control Stick | |
| D-Pad | D-Pad |
FPS Profile¶
Optimized for GoldenEye, Perfect Dark, and other N64 shooters:
| BT Input | N64 Output | Notes |
|---|---|---|
| Cross/A (B1) | B | Attack |
| Circle/B (B2) | A | Action |
| Square/X (B3) | C-Down | |
| Triangle/Y (B4) | C-Up | |
| R1/RB | Z | Shoot (easier reach) |
| L1/LB | R | Aim/targeting |
| L2/LT | L | |
| R2/RT | Z | Alternate shoot |
| Right Stick | C-buttons | Strafe/look |
Mario Profile¶
Optimized for Super Mario 64 and platformers:
| BT Input | N64 Output | Notes |
|---|---|---|
| Cross/A (B1) | B | Punch/attack |
| Circle/B (B2) | A | Jump |
| Square/X (B3) | C-Down | Camera |
| Triangle/Y (B4) | C-Up | Camera |
| L1/LB | L | Crouch camera |
| R1/RB | R | Shoulder camera |
| L2/LT | Z | Crouch/ground pound |
| R2/RT | Z | Alternate Z |
| L3 (left stick click) | Walk modifier | 50% stick sensitivity |
Rumble¶
N64 rumble pak is emulated. When a game activates rumble, the vibration is forwarded to the Bluetooth controller. The adapter identifies itself as having a rumble pak inserted, so games that check for accessories will detect it.
Rumble intensity is scaled for Bluetooth controllers:
- Left (heavy) motor: ~50% when N64 rumble is active
- Right (light) motor: gentle vibration
Technical Details¶
Dual-Core Architecture¶
- Core 0: Bluetooth stack (BTstack/CYW43), input processing, main loop
- Core 1: Joybus protocol (timing-critical, runs entirely from RAM)
On Pico 2 W (RP2350), Core 0's CYW43 driver periodically locks flash for Bluetooth bonding storage. Core 1's joybus handler is fully RAM-resident to avoid flash contention.
N64 Joybus Protocol¶
- Single-wire bidirectional protocol at 250kHz
- Open-drain with pull-up resistor
- Implemented via RP2040/RP2350 PIO state machine
- Standard clock speed (no overclock needed, unlike GameCube)
Cold Boot Detection¶
The adapter detects N64 console power-on and responds to the PIF's initial controller probe. This works whether the adapter powers on with the console or is already running when the console starts.
Troubleshooting¶
N64 doesn't detect controller (fast LED blink):
- Check wiring: Data (GPIO 2), 3.3V, GND
- Ensure connections are solid (no loose wires)
- Try pressing the N64 reset button
LED slow blink (no BT controller):
- Put your controller into pairing mode
- Click BOOTSEL to start a 60-second scan
- Hold BOOTSEL to clear bonds and re-pair from scratch
Buttons not responding in game:
- Verify the correct profile is active (try cycling with Select + D-Pad)
- Check that the LED is solid (data flowing)
- Some controllers may need specific BT pairing mode (Classic BT vs BLE)
Rumble not working:
- Not all games use rumble pak
- Verify with a known rumble game (e.g., Star Fox 64, Mario 64 Shindou)
- Check that your BT controller supports vibration
Controller disconnects frequently:
- Move closer to the adapter (BT range is ~10m)
- Ensure controller battery is charged
- Hold BOOTSEL to clear bonds and re-pair