Fully Wireless · Volume 3

The Hardware Routes — The ESP32 Port, the Nordic Boards, and the Pico W

What the ESP32-S3 port's gun and dongle actually do, read from its source; what Nordic nRF52840 and nRF54L15 boards would buy this build and what they would cost in firmware; why the Pico W's radio is not the shortcut it looks like; and the pick

3.1 Three Routes

Figure 1 — Three ways to cut the cable. Route A: an ESP32-S3 gun running the community port, ESP-NOW on a Wi-Fi channel, an ESP32-S3 dongle that clones the gun's USB identity, and the PC seeing HID and serial…
Figure 1 — Three ways to cut the cable. Route A: an ESP32-S3 gun running the community port, ESP-NOW on a Wi-Fi channel, an ESP32-S3 dongle that clones the gun's USB identity, and the PC seeing HID and serial; released today, without the fork's fixes, costing a few tenths of a watt more, on bare-chip boards. Route B: the Pico running the private fork, an nRF54L15 as a UART radio bridge using ESB or LLPM, an nRF52840 or nRF54LM20 dongle presenting HID and a CDC serial port; it keeps the fork and costs about a hundredth of a watt, on a certified module, but the firmware has to be written. Route C: a Pico 2 W or Nordic part as a Bluetooth LE HID peripheral straight to the PC's own Bluetooth: no dongle, but the host decides the interval and there is no force-feedback channel. Own work.

The link comparison in Volume 2 left two links standing, ESP-NOW and Nordic’s proprietary modes, and one that tempts everyone, Bluetooth straight to the PC. Each comes with its own hardware, and the hardware is where the project’s earlier decisions bite: the Pico (D2), the private OpenFIRE fork (D10), the separate ESP32 track (D30), and the Nordic boards already on the bench (D38).

3.2 Route A: the ESP32-S3 Port as Released

Decision D25 is to try this route; Open-Source Firmware Vol 6, 6.12 introduces the port, the parts to buy (a dongle, an ESP32-S3 gun board) and the flashing and pairing steps, and Reference Electronics Vol 2 proposes buying one ESP32-S3-DevKitC-1 N16R8 for it (P-RE23). Not repeated here. Three things have changed or become clearer since:

  • The port has grown a wireless pedal. A Waveshare ESP32-S3-Zero runs pedal firmware and pairs with the gun (not the dongle) during a 10-second window at the gun’s start-up, sending a keep-alive every 69 ms. It works only when the gun plays through the dongle.
  • A second ready-made dongle is supported, the “ESP32-S3 Pocket Dongle S3” (GNPE, N16R8 variant in the port’s build list), alongside the LILYGO T-Dongle S3.
  • The T-Dongle S3 is still sold out. LILYGO’s page (19 October 2026) lists it at $11.99 in variants with the 0.96 in LCD (K193), without (K194, K194-B) and with an external-antenna socket (K194-01), shipping only from China; its US and German warehouses show it unavailable. The DIY dongle on a Waveshare ESP32-S3-Zero or a DevKitC-1 remains the fallback.
Figure 2 — The LILYGO T-Dongle S3, front and back, in its clear case. The front carries the 0.96 inch colour LCD that the port uses to show the paired gun, player and channel; the back shows a bare ESP32-S3 c…
Figure 2 — The LILYGO T-Dongle S3, front and back, in its clear case. The front carries the 0.96 inch colour LCD that the port uses to show the paired gun, player and channel; the back shows a bare ESP32-S3 chip and its antenna on the board itself, not a shielded, certified module. Photo: LILYGO, T-Dongle S3 product page.

The port’s own reference build, PICON-AS (Volume 1, 1.6), recommends the DevKitC-1 for the gun because it has “the most powerful antenna”; the DevKitC-1 carries Espressif’s ESP32-S3-WROOM-1 module with its PCB antenna, while the Waveshare ESP32-S3-Pico it names as the alternative has “a smaller antenna and less range”. That difference matters again in Volume 6, because only the module has an FCC grant of its own.

3.3 What Reading the Port’s Source Found

The README describes the dongle in a sentence. The source, read on 19 October 2026 (dongle/src/main.cpp, shared_lib/OpenFIRE_Wireless/ESP32/OpenFIRE_Wireless.cpp, shared_lib/TinyUSB_Devices/TinyUSB_Devices.cpp), says rather more:

  1. The dongle takes on the gun’s USB identity. “The dongle dynamically adopts the identity (VID, PID, and Manufacturer) previously sent by the lightgun, acting as an invisible hardware proxy”: it calls setID() with the gun’s vendor and product IDs and copies its manufacturer and product strings. Its USB serial number is the gun’s radio MAC address as 12 hex digits, “so that the same COM port is always mapped for each lightgun”. This answers the question left open in Open-Source Firmware Vol 6, 6.12: a dongle paired with a stock gun enumerates as vendor 0xF143, “OpenFIRE”, and MiSTer and the App will find it. It also means decision D24 applies to the dongle exactly as to the gun (Volume 6).
  2. It does not enumerate until a gun has paired. setup() blocks in the pairing routine, then waits up to 12 s for a wireless pedal, and only then starts USB. A PC sees nothing when the dongle is plugged in alone, and a replugged dongle starts pairing from scratch, which is why the README says to power-cycle the gun after it.
  3. Newest report wins. A radio task (priority 15) stores the latest mouse, keyboard and gamepad report; a USB task (priority 10) on the same core sends whichever is pending, in rotation, each time the HID endpoint frees. A report superseded before it was sent is never sent. That is the right behaviour for position data (Volume 1, 1.4).
  4. The dongle’s USB poll is 1 ms, the same as a cabled gun (TinyUSBDevices.begin(1) sets the poll interval).
  5. The PC-to-gun serial path is polled every millisecond, buffered (200 bytes) and flushed to the radio, so a burst of MAMEHooker commands is not lost at the dongle.
  6. The radio settings of Volume 2, 2.3: fixed 12 Mbps 802.11g, 17 dBm, power saving off, encryption off, channel 1 to 13 chosen by the dongle at plug-in, country set to “IT” on the gun.
  7. No sleep. No use of the ESP32’s light- or deep-sleep calls was found in the gun firmware; a battery gun stays fully awake until switched off (Volume 5).

None of this is a defect for a bench trial. Items 2, 6 and 7 are things a kit would want different.

3.4 Route B: the Nordic Boards

Nordic Bluetooth LE boards are already on hand from other work (D38); the models are not yet confirmed, and the nRF54L15 family is the likely set. What matters for this build is which chip does what, because the two most likely parts are not interchangeable:

Table 1 — Nordic Bluetooth LE boards are already on hand from other work (D38); the models are not yet confirmed, and the nRF54L15 family is the likely set. What matters for this build is which chip does what, because the two most likely parts are not interchangeable

nRF54L15nRF52840
CPU128 MHz Arm Cortex-M33, plus a 128 MHz RISC-V coprocessor64 MHz Cortex-M4F
Memory1.5 MB non-volatile, 256 KB RAM1 MB flash, 256 KB RAM
RadioBluetooth LE (Channel Sounding), 802.15.4, proprietary 2.4 GHz up to 4 MbpsBluetooth LE, 802.15.4, ANT, proprietary 2.4 GHz at 1 and 2 Mbps
Transmit power+8 dBm (CSP), +7 dBm (QFN)+8 dBm
Radio currentTX 4.8 mA at 0 dBm, RX 3.4 mA (3 V)TX 4.8 mA at 0 dBm, RX 4.6 mA (product specification 1.8)
USBNoneUSB 2.0 full-speed device
Supply1.7 to 3.6 V1.7 to 5.5 V
SCI minimum interval750 µs (Novel Bits)875 µs (Novel Bits; not in Nordic’s SCI sample list)

Sources: Nordic product pages and the nRF52840 product specification v1.8 feature list (19 October 2026). Nordic’s product briefs give somewhat higher radio currents for the nRF52840 under other conditions; the figures above are the specification’s.

The finding that decides the architecture: the nRF54L15 has no USB. Nordic’s page lists high-speed USB only on the nRF54LM20A and B. So an nRF54L15 can be the gun’s radio, but not the dongle: the PC end needs an nRF52840 (full-speed USB, plenty for HID), an nRF5340, or an nRF54LM20.

The boards a builder meets:

Table 2 — The boards a builder meets

BoardChipUse hereNotes
nRF52840 Dongle (PCA10059)nRF52840The PC-side dongleUSB-powered; “there is no debug support on the Dongle, only support for programming the device and communicating through USB” (Nordic); 15 GPIOs on castellations; Nordic staff on Nordic’s forum have described it as a development tool, compliant but not certified. Price to be read at order time (distributor pages refused automated reading on 19 October 2026)
nRF54L15 DKnRF54L15Gun-side development; can emulate the nRF54L10 and L05Has an on-board debugger; about $39 at distributors by a search summary, not confirmed on a seller’s page
Seeed XIAO nRF54L15nRF54L15The gun-side radio in a build or kit$9.99 (Seeed, 19 October 2026, in stock); thumb-sized XIAO format; ceramic antenna plus a switchable external antenna socket; on-board battery charging; its USB-C reaches the nRF54L15 through a small bridge chip (a SAMD11 appears on its debug pins), so it is a programming port, not a HID device; FCC ID Z4T-XIAONRF54L15, single modular, “Device meets SAR Exclusion for Portable use” (Volume 6)
nRF54LM20 DKnRF54LM20A future single-chip dongle with SCI and high-speed USBIn Nordic’s nRF Desktop as “mouse, LLPM dongle, or HID SCI dongle”
Figure 3 — The Seeed Studio XIAO nRF54L15: a thumb-sized module with a USB-C socket, two buttons, a U.FL antenna socket beside the ceramic antenna, castellated edge pads, and a shield can printed with its mod…
Figure 3 — The Seeed Studio XIAO nRF54L15: a thumb-sized module with a USB-C socket, two buttons, a U.FL antenna socket beside the ceramic antenna, castellated edge pads, and a shield can printed with its model, FCC ID Z4T-XIAONRF54L15 and Japanese radio certification number. Photo: Seeed Studio, XIAO nRF54L15 product page.

3.5 Route B’s Architecture: a Radio Bridge Behind the Pico

Figure 4 — Route B in detail. The Raspberry Pi Pico runs the private OpenFIRE fork unchanged in its camera, buttons, maths and solenoid sequencing, and sends its reports to a XIAO nRF54L15 over a UART, receiv…
Figure 4 — Route B in detail. The Raspberry Pi Pico runs the private OpenFIRE fork unchanged in its camera, buttons, maths and solenoid sequencing, and sends its reports to a XIAO nRF54L15 over a UART, receiving serial commands back the same way. The XIAO frames the reports for ESB or LLPM and sends them across 2.4 GHz to an nRF52840 Dongle or nRF54LM20 board, which presents three HID reports and a CDC serial port to the PC with a vendor ID per D24. What has to be written: a UART transport in the fork selected when VBUS is absent, a bridge that sequence-numbers and resends the newest report and carries serial both ways, and a dongle that presents the gun's identity, starting from Nordic's ESB, LLPM and nRF Desktop samples. What it buys: the fork stays the one firmware and the Pico pin map stays; radio power about 0.01 W instead of about 0.35 W; a module whose FCC grant covers portable use. Own work.

The idea is to change as little of the gun as possible. The fork already assembles the three HID reports and parses serial commands; at the bottom of the stack it hands bytes to TinyUSB. Route B adds a second transport underneath:

  • In the fork: when VBUS is absent at start-up, send the same report bytes, framed, over a UART to the radio bridge, and read serial commands back from it. The Pico already senses VBUS on GPIO24, the same signal Wireless Power Only Vol 3, 3.3 uses to fix TinyUSB’s forced pull-up; a battery Pico gun needs that fix anyway. The traffic is small: 209 updates a second of at most three reports of roughly 10 to 20 bytes is a few kilobytes a second, under a tenth of a 1 Mbaud UART. One spare UART pair is needed on the carrier; whether the kit-camera board has two free pins was not checked against Reference Electronics Vol 2’s pin budget, and it is the first thing to check.
  • On the gun-side Nordic part: take frames from the UART, keep only the newest of each report type, and send it, with a sequence number, by ESB (on demand) or LLPM (at each 1 ms event). Serial bytes from the PC arrive in ESB acknowledgement payloads or LLPM notifications and go out on the UART.
  • On the dongle: receive, present a composite USB device (three HID report IDs with OpenFIRE’s descriptors, plus a CDC-ACM serial port), and copy the gun’s identity strings and product ID as the ESP32 port’s dongle does, so that player numbers stay with guns.

Nordic’s SDK supplies the starting points: the ESB transmitter and receiver samples, the LLPM sample (which builds for both the nRF52840 Dongle and the nRF54L15 DK), and nRF Desktop, which already implements a HID dongle with bonding, four LLPM connections and USB HID (Volume 2, 2.6). What none of them has is OpenFIRE’s report descriptors and the serial bridge.

This is not the “stock OpenFIRE plus a second microcontroller for the extras” that Our Firmware Vol 6 rejected (FW-8). That option put features on a co-processor and failed because the features live in the main loop. Here the second processor carries only bytes; every feature stays in the fork.

The alternative, a Nordic-only gun (OpenFIRE ported to run on the nRF54L15 itself, no Pico), would save a chip and some current. It is a port of about 10,000 lines to Zephyr plus new camera drivers, which FW-8 already weighed and rejected for a rewrite, and it would leave the fork. Not proposed.

3.6 What the Nordic Boards Buy, and What They Cost

What they buy the project, against the ESP32 route:

Table 3 — What they buy the project, against the ESP32 route:

Route A, ESP32-S3 portRoute B, Pico fork + Nordic
Firmware the gun runsThe port, pre-release, not the fork (D30)The fork (D10), plus a small bridge
Fixes made in the fork (aiming, calibration, sequencing)Not present unless portedPresent
Pico pin map, carrier, kit camera routeReplaced by an ESP32-S3 boardKept; one UART added
Radio and controller power~0.30 to 0.38 W more than a Pico gun (Volume 5)~0.01 W more
Idle and sleepReceiver always on; no sleep in the portRadio can sleep between reports; system-off in microamps
Latency the link adds~0.8 ms mean (Volume 4)~0.8 ms (ESB) or ~1.3 ms (LLPM) mean
Channel useOne Wi-Fi channel, 4.6 % per gunESB: chosen by the application; LLPM: hopping
FCC position for a hand-held kitModule grant excludes portable use without new approval; bare-chip boards have no grant readXIAO nRF54L15 grant: single modular, SAR-excluded for portable use
Firmware to write before the first shotNoneA fork transport, a bridge and a dongle
Cost of boards, as of 19 October 2026Dongle $5.49 to $11.99; gun board $8.99 to $9.99 (Open-Source Firmware Vol 6)XIAO nRF54L15 $9.99; nRF52840 Dongle at order time

So the Nordic boards are not the faster route to a wireless gun; they are the better-founded route to a wireless kit. Their immediate value is as test equipment: with two Nordic boards and Nordic’s own samples, the link’s latency and loss can be measured on the ADP3450 this week, without writing any light-gun code (Volume 6, test W5). If the numbers are as Volume 4 predicts, route B is worth its firmware; if the ESP32 trial then shows the link is good enough to play on, the project knows which link to build for the kit.

3.7 Route C: the Pico W and Pico 2 W

The RP2040 and RP2350 have no radio. Raspberry Pi’s answer is the Pico W and Pico 2 W, which add an Infineon CYW43439: Wi-Fi 4 on 2.4 GHz and Bluetooth 5.2, Classic and LE, central and peripheral, on an SPI link to the microcontroller “typically” at 33 MHz (Pico 2 W datasheet). Adafruit lists the Pico 2 W at $7.00 (product 6087, out of stock on 19 October 2026). The arduino-pico core offers KeyboardBLE, MouseBLE and JoystickBLE with “the same API as their USB versions”, at a cost of “around 80KB of flash and 20KB of RAM”.

It looks like the shortcut: the same board family, one chip more, no dongle. It is not, for four reasons:

  1. OpenFIRE ships its Pico W builds with Bluetooth off (-noBT) because of a known issue in which “TinyUSB/Serial fails to initialize properly” with Bluetooth enabled (Reference Electronics Vol 2). The port’s shared USB library contains a Classic Bluetooth HID path for the Pico W, but it is compiled out.
  2. Bluetooth HID to the PC has no serial path and a host-chosen interval of 7.5 ms or more (Volume 2, 2.4).
  3. The wireless chip takes over pins the fork uses. On the Pico 2 W, GPIO23 to GPIO25 and GPIO29 run the wireless chip; VBUS sense moves from GPIO24 to the wireless chip’s own WL_GPIO2, and the LED to WL_GPIO0. The fork’s debug event pin, GP25 on a Pico (FW-6), is the wireless chip-select on a W, and the VBUS-sense fix of Wireless Power Only Vol 3 would have to read the sense line through the wireless chip. These are not header pins on either board, so the carrier’s pin map survives; the firmware’s assumptions do not.
  4. Its FCC grant assumes 20 cm. The Pico 2 W’s grant (FCC ID 2ABCB-PICO2W) is a single-modular grant that requires the antenna “to provide a separation distance of at least 20 cm from all persons” (Volume 6). A gun is held.

The Pico 2 W could still be the gun side of a dongle link (Bluetooth LE to a Nordic dongle), but then it competes with a $9.99 XIAO nRF54L15 that draws less, has a portable grant, and is the platform the dongle’s firmware is written for anyway.

3.8 Why This, and Why Not the Others

Criteria: answers the D25 question soonest; keeps the fork (D10) and the Pico (D2) for the finished gun; adds little power; a legal path for a hand-held kit (D11); firmware effort.

Table 4 — 3.8 Why This, and Why Not the Others

OptionVerdictWhyWhy not
Route A: ESP32-S3 port + dongleRun now, as the D25 trial (D30)Works today with nothing written; answers “is a radio good enough to play on”Not the fork; pre-release; ~0.35 W more; channels 12 and 13; no portable grant on the module or boards read
Route B: Pico fork + XIAO nRF54L15 bridge + nRF52840 dongleProposed as the kit route; bench the link first with Nordic samples (WL-2)Keeps the fork and the pin map; ~0.01 W radio; ESB’s ACK payload carries force feedback; a module with a portable grant; uses the boards on handThree pieces of firmware to write; no existing light-gun code
Route B with an nRF54LM20 dongleLaterOne chip with SCI and high-speed USB; in nRF Desktop as an SCI dongleNewer part; nothing gained over an nRF52840 at full speed for HID
A Nordic-only gun (OpenFIRE ported to nRF54L15)RejectedOne chip fewerA port of the whole firmware; leaves the fork (FW-8)
Route C: Pico W / Pico 2 W Bluetooth to the PCRejectedNo dongle; same board familyBluetooth disabled in OpenFIRE’s W builds; no serial; host interval; pin assumptions; 20 cm grant condition
Pico 2 W as the gun side of a dongle linkRejectedSame family as the PicoA XIAO nRF54L15 is cheaper to own in power and certification and matches the dongle’s platform

Sources

  1. Alessandro Satanassi, OpenFIRE-Firmware-ESP32: dongle/src/main.cpp, dongle/README.md, dongle/platformio.ini, pedal/README.md, shared_lib/OpenFIRE_Wireless/ESP32/OpenFIRE_Wireless.cpp, shared_lib/TinyUSB_Devices/TinyUSB_Devices.cpp — https://github.com/alessandro-satanassi/OpenFIRE-Firmware-ESP32 (read 2026-10-19).
  2. LILYGO, T-Dongle S3 — https://lilygo.cc/products/t-dongle-s3 (read 2026-10-19).
  3. Nordic Semiconductor, nRF54L15, nRF52840 and nRF52840 Dongle product pages; nRF52840 Product Specification v1.8 — https://www.nordicsemi.com/ (read 2026-10-19).
  4. Seeed Studio, XIAO nRF54L15 product page and wiki — https://www.seeedstudio.com/XIAO-nRF54L15-p-6493.html, https://wiki.seeedstudio.com/xiao_nrf54l15_sense_getting_started/ (read 2026-10-19).
  5. FCC ID Z4T-XIAONRF54L15 grant summary — https://fccid.io/Z4T-XIAONRF54L15 (read 2026-10-19).
  6. Raspberry Pi, Raspberry Pi Pico 2 W Datasheet — https://datasheets.raspberrypi.com/picow/pico-2-w-datasheet.pdf (read 2026-10-19).
  7. Adafruit, Raspberry Pi Pico 2W, product 6087 — https://www.adafruit.com/product/6087 (read 2026-10-19).
  8. Mohammad Afaneh, Novel Bits, Bluetooth LE Shorter Connection Intervals: A Hands-On Guide with the nRF54L15, 16 December 2025 (read 2026-10-19).
  9. Nordic Semiconductor DevZone threads 39464 and 41155 on nRF52840 Dongle certification (forum; secondary).

Comments (0)

  1. Loading…

Comments are held for moderation — nothing appears until approved.