Two firing modes
Continuous rapid fire and configurable bursts, with separate rates for each mode.
An open hardware project by pdulab
A complete ESP32-C3 firmware project for adding configurable continuous and burst R2 trigger behavior to a DualSense controller.
Current release v0.4.8 · ESP32-C3 Super Mini
Start here
Continuous rapid fire and configurable bursts, with separate rates for each mode.
Tune settings, calibrate the trigger, and apply OTA updates from your phone or computer.
OFF mode leaves the trigger input high impedance, preserving normal R2 behavior.
What you need
ESP32-C3 Super Mini
1 kΩ series resistor
Insulated hookup wire
A DualSense controller
Wiring
Keep the required 1 kΩ resistor between the R2 signal pad and GPIO0.
DualSense R2 signal ── 1 kΩ ── GPIO0
DualSense ground ────────── GND
Controller positive ────────── 5VPower note: Do not connect the controller battery positive wire and USB 5 V at the same time unless your board’s power path is verified safe. For USB testing, connect only the R2 signal and ground.
USB installer
This is the complete factory image. Use a desktop Chrome or Edge browser, a USB data cable, and an ESP32-C3 Super Mini. The installer will ask you to choose the board’s serial port.
Factory image · offset 0x0
Erases the board and installs the full firmware.
Not connected. Use Chrome or Edge over HTTPS.
1 Connect the board with USB, then select its COM port.
2 Click Install latest firmware.
3 Confirm the erase prompt and wait for “Done”.
4 Unplug/replug, then join R2-RapidFire.
If no port appears, use a data-capable cable. Hold BOOT while plugging in, release it, and try again. Web Serial requires HTTPS and Chrome or Edge.
Prefer a manual flash? Download the factory .bin and write it at offset 0x0 with esptool.
Using the firmware
Pass-through mode. GPIO0 stays high impedance and the controller behaves normally.
Repeats trigger pulses while R2 is held. Continuous SPS can be set from 1–40.
One physical pull starts a fixed burst of 1–10 shots at 1–12 SPS.
Output pulse length, 5–200 ms. Start at 25–35 ms.
Trigger travel threshold, 5–100%. Hysteresis and debounce stabilize the input.
Changes are saved in non-volatile storage and survive reboot.
Default is 5 minutes. Set to 0 to disable. Sleep Now is also available.
Upload only a matching -ota.bin file from the dashboard. Keep power connected until reboot.
Reset trigger clears the firing state; Restore defaults returns factory settings.
First-time setup
After boot, join Wi-Fi network R2-RapidFire using password 12345678. Open 192.168.4.1 in your browser.
Select OFF. With R2 released, choose Capture released. Hold R2 fully down and choose Capture pressed, then choose Apply calibration.
Start with 8–10 SPS and a 25–35 ms pulse width. Use Continuous for sustained firing or Burst for a fixed shot count.
Once running v0.4.2 or later, download the OTA image below and upload it through the dashboard—no USB required.
Firmware archive
Avoid v0.4.4 and v0.4.6: they have known firing and sleep regressions. The factory image is for USB flashing; the OTA image is only for the dashboard update screen.