The PCB
A Raspberry Pi Pico, an I/O expander, and a row of connectors. No proprietary protocol anywhere on it.
The board is built around an RP2040 running CircuitPython. It talks to the PC over USB-C as a plain HID joystick, and every input on it is a switch closing to ground. The design is public on EasyEDA, so you can read the schematic, order the board yourself, or fork it.
- Microcontroller
- RP2040 (Raspberry Pi Pico)
- I/O expander
- TCA9555 on I2C, address 0x20
- Connection
- USB-C on the box, USB-A at the PC
- Digital inputs
- 38 independent
- Analog inputs
- 4
- Backlighting
- 8 x 25 lm LEDs
- Connectors
- JST 1.25mm, 2 pin
Where the inputs come from
Not every input pin is a direct GPIO. The RP2040 does not have enough of them, so a TCA9555 expander sits on I2C and provides the rest. The firmware probes the I2C bus at boot and picks the pin map for the board revision it finds.
rev1
27 inputs. D1 to D14 on the expander, D15 to D24 direct GPIO, A6 to A8. Backlight PWM on GP12.
rev2
42 inputs. D1 to D22 direct GPIO, A1 to A4, D23 to D38 on the expander. Backlight PWM on GP2.
All inputs use internal pull-ups and are active low, so a switch closes to ground. The A pins are read as digital inputs like the D pins, but they are not part of the default passthrough, so use them as explicit rule inputs.
If the expander is missing or fails, the box does not stop working. The firmware degrades to GPIO-only inputs and reports it over serial.
Encoders
Encoders are decoded in hardware where possible, using rotaryio or PIO, with an automatic software fallback. They have to sit on direct GPIO pins, which poll at a sub-millisecond rate. Expander inputs are read over I2C at roughly 1 ms, fast enough for switches and buttons but not fast enough to track a turning encoder, so an encoder plugged in there will not work at all. The box supports up to 10 encoders.
Backlight
The LEDs run off a PWM pin with a perceptual brightness curve, and any axis can drive it. Point an encoder at that axis and you have a brightness knob. Set an axis to backlight-only mode if you want the knob to control brightness without also reporting an axis to the sim.
Building your own board
Nothing in the firmware requires this specific PCB. It needs an RP2040, switches wired to ground, and optionally a TCA9555 at address 0x20. The Printables parts list puts it plainly: the SIMINPUT BoxBoard PCB, or whatever the hell you want to use. The EasyEDA project is linked from the files and links page.