The go-to DIY adapters are Arduino-based (see: DaemonBite and/or the MiSTer fork of them). I wanted to see what a $4 Pico could do instead....
Apparently the CircuitPython HID libraries are more mature and performant than MicroPython at the moment. It's also really easy and delightful to use. Maybe someone will be motivated to port the Arduino code to work with the Pico's SDK (or maybe it already works and I was just too afraid to try to compile?). But either way, these scripts work great and are easily modified if you want to add some wacky macros or extra stuff.
The original code was adapted from: https://github.com/printnplay/Pico-MicroPython/blob/main/NES2USB.py
Grab the Pico UF2 image from here: https://circuitpython.org/board/raspberry_pi_pico/
And we also rely on CircuitPython's hid
library you can snag here: https://circuitpython.org/libraries
- connect the wires from a controller (or, preferably, an extension cable) to the Pico according to the notes in the relevant script.
- plug in your Pico while holding the
bootsel
button - drag the UF2 image onto the root of your mounted Pico
- the pico will reboot and remount and you'll see a
lib
folder - drag the
adafruit_hid
folder from the extracted library collection into the Pico'slib
folder - copy the relevant script from this repo into the Pico's pre-existing
code.py
https://learn.adafruit.com/welcome-to-circuitpython/interacting-with-the-serial-console
I don't have reputable numbers for you (if you want to contribute some tests, please open an issue and I'll update this section!). Anecdotally, I can tell you I'm picky and found the SNES Classic to be much too slow feeling, and these perform as well as the recommended USB DualShock4 plugged into my MiSTer.