Made how you play.
A modular game controller designed for accessibility. Build your own layout from separate modules or snap them together—play from your lap, a table, or wherever works for you.
Standard controllers assume one-size-fits-all. OpenArcade doesn't.
OpenArcade breaks a controller into pieces:
- Child modules – Buttons, joysticks, D-pads in their own housings
- Parent module – Central hub that connects to your PC or console
Wire the modules together or use them independently. Arrange them however's comfortable for you—spread out on a table, held in different hands, mounted wherever works.
┌─────────────┐ BLE ┌──────────────┐ USB/Bluetooth ┌──────────┐
│ Child │ ◄──────────► │ Parent Hub │ ◄───────────────────► │ Game │
│ Module(s) │ (ESP32) │ (RPi Zero) │ (HID emulation) │ Console │
└─────────────┘ └──────────────┘ └──────────┘
Each child module (ESP32) broadcasts its inputs over Bluetooth. The parent hub (Raspberry Pi Zero 2 W) subscribes to all modules, aggregates the inputs, and presents itself as a standard game controller to your computer or console.
├── firmware/esp32/ # Child module firmware (NimBLE GATT server)
├── server/ # Parent hub BLE client (Python + bleak)
├── configurator/ # 3D controller layout designer
└── Deliverables/ # System design docs, hazard analysis, etc.
- Parent hub: Raspberry Pi Zero 2 W
- Child modules: ESP32 development boards
- Inputs: Arcade buttons, joysticks (Sanwa/Seimitsu compatible)
- Power: USB-C or battery pack
- Housing: 3D printed (see CAD files in documentation)
cd firmware/esp32
idf.py set-target esp32
idf.py -p /dev/ttyUSB0 flash monitorThe module will start advertising as "OpenArcade-XX" over BLE.
cd server
uv run runtime_main.pyThe Pi will run the async BLE runtime, subscribe to module notifications, and output the aggregated controller state.
sudo ./packaging/rpi/install-rpi.shThis installs OpenArcade under /opt/openarcade, stores persistent config in
/var/lib/openarcade/config.json, and enables three systemd services for the
USB gadget setup, the BLE/HID runtime, and the serial config service.
Open the 3D configurator to visualize module arrangements and plan your controller setup.
| Layer | Technology |
|---|---|
| Child firmware | ESP-IDF, NimBLE, C |
| Parent hub | Python, asyncio, bleak |
| Configurator | Three.js, React |
| PCB design | KiCad |
| CAD | Autodesk Inventor |
| 3D printing | Bambu Studio / PrusaSlicer |
See individual component licenses.
