
Module board
roboryman/prototroller
A full-stack modular controller that is feature-rich, usable, responsive, and robust. Can be used for any HID-compliant purpose, but we focus on developing swappable modules that can form customizable gamepads.

A full-stack modular controller that is feature-rich, usable, responsive, and robust. Can be used for any HID-compliant purpose, but we focus on developing swappable modules that can form customizable gamepads.
Master board is an open-source printed circuit board by roboryman, from the roboryman/prototroller repository on GitHub, published under the MIT licence. It is a 2-layer board of 156 × 156 mm with 83 parts on 95 nets, routed with 959 tracks and 175 vias.
It is built around the SC0914(13), W25Q16JVSSIQ and NCP1117LPST33T3G-MS, with the C0402X7R100-104KNE-CT, RC0402FR-7W1KL and RC0402FR-7W49R9L among its other parts. Its parts include 17 capacitors, 16 resistors, 5 ICs, 3 connectors and 3 switches. It belongs with the keyboards and input boards and the RP2040 boards of this library.
The Prototroller is a modular controller that is full-stack, feature-rich, responsive, and robust. The controller could be used for any HID-compliant purpose, but we focus on developing hot-swappable modules that can form customizable gamepads.
A potential use case is general hardware level remapping for quality of life. Another is rapidly prototyping different controller layouts for games or simulations in development.
Our team consists of 5 members:
This project is developed in conjunction with the UF CpE Capstone program (Fall 2022 - Spring 2023). This project is self-funded. As such, donations are appreciated in this educational pursuit (hardware is not cheap nowadays).
At the highest abstraction the Prototroller consists of the following:
The master board handles the data store of connected modules, transfers and receives data with modules over SPI, transfers and receives HID data over USB with the host, rescans modules, has buttons for various functions, etc. Most of the master board also serves as the the 4x5 grid of module slots the user can snap modules to using magnetic pogo-pin connectors.
The master board has buttons for rescanning, resetting, and flashing. There are header pins for interfacing with haptic feedback motors. A 3-pin JST-SH header (1.00mm) is available for serial wire debug. There is a USB-C receptacle (2.0) for power and data connection with the host.
The connection interface between the master board and module boards uses 6-pin magnetic pogo-pin connectors. These carry VCC, GND, and SPI signals, while maintaining a solid physical connection. The master board feeds modules with 3.3V.
Module boards are generic and constrained at 30x30mm with no direct user interface (except for the connector and SWD headers). On the sides are headers providing 14 signals to a component interface board that would sit above. This way there are no unique module boards for each component, and we simply offload the task to the component interface board by hand.
The component interface boards are veroboards sitting above the module board headers. We may freely route signals from the module board to a component, the direct user interface.
This would not be a very comfortable controller to use without enclosures.
The master board is enclosed by a chassis and grips. The master board is screwed to the chassis.
The module enclosures contain the module board and component interface boards, but do not cover the component.
Each type of module has its own assosciated firmware that can be flashed via the SWD header pins with picoprobe firmware. The master board can be flashed via the normal way of "dragging" the binaries. See below for more details on flashing. The Prototroller has been extensively tested on Windows systems, but will likely work on Mac, Linux, and generally any OS that supports HID gamepads.
There are a few ways you may use the Prototroller.
Recommended. This combines our hardware listed above with the firmware to do the job. The end result is a full-stack modular controller.
Our recommended PCB supplier is JLCPCB, and we are working on formalizing our recommendations for ordering.
If you want to develop your own hardware to use with our software, that is excellent! In fact, we are curious to see your designs.
You may use our designs as a starting point. For example, you may want to make the modules slightly larger.
You may use the provided VSCode launch debug configuration and flash task. This requires a Picoprobe, OpenOCD, and Cortex Debug. Instructions are available in /ide.
An easier way is to use the USB receptacle to mount and flash RP2040 binaries (.uf2), accessible by holding down BOOTSEL and performing a reset. If you are using VSCode, you can simply edit settings.json for your SDK path, build the target, and proceed to step 5. Otherwise, the process to generate the binary is as so:
~/pico-sdk.$ cd prototroller
$ mkdir build
$ cd build
$ export PICO_SDK_PATH=...$ cmake -DPICO_BOARD=prototroller ..make. To build only host, master, or module targets, cd into the respective directory (generated by the cmake command above) and execute make. In this case, you can just cd into master and execute make..uf2 binaries, which can be flashed by dragging onto the mount.The module boards do not have a USB receptacle. You must use SWD in conjunction with a debug probe. We recommend the official Raspberry Pi Debug Probe ($12), or a Pico flashed with the Picoprobe firmware.
Instructions are available in /ide. This is how you might do it after setting up Picoprobe, OpenOCD, etc:
usbipd.Prototroller Flash' task in VSCode, or execute the following command, where joystick-module.elf is the name of the ELF executable generated previously:
sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000" -c "program build/module/joystick-module.elf verify reset exit"If all went well, the module board should be flashed. You can safely remove the SWD wires and set the debug probe aside.
Documentation for the official Raspberry Pi Debug Probe: https://www.raspberrypi.com/documentation/microcontrollers/debug-probe.html
Alternatively, here is an excellent tutorial to setting up and using Picoprobe if you have a Pico available: https://github.com/robotdad/piconotes
Ideas for future modules: Trigger, D-Pad, Accelerometer, Gyroscope, Rounded Buttons. Could also do some cool things non-gaming related, such as an IR blaster and Bluetooth TX/RX modules. Adding new types of modules only requires the firmware and custom backpack.
Thank you to our stakeholder Carsten Thue-Bludworth for his infinite wisdom. His assistance keeps the project grounded and evolving in the best way possible.
Thank you to Dr. Blanchard and the UF CpE Capstone program for direction and usage of lab space.
Thank you to the Raspberry Pi community for the hardware and software that made this project possible.
Thank you to Phil's Lab on YouTube for the excellent courses and tutorials on hardware design.
Thank you to user testing participants for valuable feedback. Their insights and suggestions have helped us refine our design and ensure that our final product meets the needs and expectations of its intended users.
Thank you to families, friends, and loved ones for their unwavering support and encouragement. Their belief in our abilities and commitment to our success has been a constant source of motivation and inspiration.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 20 | Conn_01x06_Male | prototroller_footprints:Mag_Pogo_6P_P2.2mm_Female | M0, M1, M2, M3, M4, M5, M10, M11, M12, M13, M14, M15, M16, M17, M18, M19 +4 |
| 13 | TestPoint | TestPoint:TestPoint_Pad_2.5x2.5mm | TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13 |
| 11 | 100n | Capacitor_SMD:C_0402_1005Metric | C3, C4, C5, C8, C9, C10, C11, C14, C15, C16, C17 |
| 5 | 1k | Resistor_SMD:R_0402_1005Metric | R1, R2, R3, R12, R13 |
| 4 | 49R9 | Resistor_SMD:R_0402_1005Metric | R4, R5, R15, R16 |
| 4 | MountingHole | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 10k | Resistor_SMD:R_0402_1005Metric | R8, R11, R14 |
| 3 | SW_Push | prototroller_footprints:Switch_D6C40F1LFS | SW1, SW2, SW3 |
| 2 | 10u | Capacitor_SMD:C_0805_2012Metric | C1, C2 |
| 2 | 1u | Capacitor_SMD:C_0402_1005Metric | C6, C7 |
| 2 | 27R4 | Resistor_SMD:R_0402_1005Metric | R9, R10 |
| 2 | 27p | Capacitor_SMD:C_0402_1005Metric | C12, C13 |
| 2 | 5k1 | Resistor_SMD:R_0402_1005Metric | R6, R7 |
| 2 | 74HCT154PW,118 | Package_SO:TSSOP-24_4.4x7.8mm_P0.65mm | U4, U5 |
| 1 | ABLS-12.000MHZ-B4-T | prototroller_footprints:XTAL_ABLS-12.000MHZ-B4-T | Y1 |
| 1 | Conn_01x03_MountingPin | Connector_JST:JST_SH_BM03B-SRSS-TB_1x03-1MP_P1.00mm_Vertical | J1 |
| 1 | Conn_01x04_Male | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J3 |
| 1 | LED_RGB | prototroller_footprints:LED_Cree-UHD111A | D1 |
| 1 | NCP1117-3.3_SOT223 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | U1 |
| 1 | RP2040 | Package_DFN_QFN:QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mm | U2 |
| 1 | USB_C_Receptacle_USB2.0 | Connector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal | J2 |
| 1 | W25Q16JVSSIQ | Package_SO:SOIC-8_5.23x5.23mm_P1.27mm | U3 |
It measures 156 × 156 mm and has 2 copper layers, 1.6 mm thick.
83 parts, built around the SC0914(13), W25Q16JVSSIQ, NCP1117LPST33T3G-MS and C0402X7R100-104KNE-CT. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the roboryman/prototroller repository on GitHub, at the commit this page was made from: the board is schematics/master_board/master_board.kicad_pcb and its schematic schematics/5_32_decoder/5_32_decoder.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

roboryman/prototroller
A full-stack modular controller that is feature-rich, usable, responsive, and robust. Can be used for any HID-compliant purpose, but we focus on developing swappable modules that can form customizable gamepads.



Cimos/etchy
Fast, trustworthy PCB visual and geometric diff tool (Rust). Successor to gerber-diff.



dennowiggle/ESP32_Interface
Facilitate learning the Z80 Retro! hardware and software.

