Skip to the content
PCBKitNew board
2 layers30 × 30 mmModule board, the printed circuit board in 3D

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.

Size
30 × 30 mm
Copper layers
2
Thickness
1.6 mm
Parts
29
Nets
50
Pads
138
Tracks, vias
343, 41
Pours
5
Routed
Yes
KiCad
KiCad 6 (file 20211014)
Created
10 Oct 2022
Updated
18 Apr 2023

Overview

Module 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 30 × 30 mm with 29 parts on 50 nets, routed with 343 tracks and 41 vias.

It is built around the RP2040, W25Q16JVSSIQ and C0402X7R100-104KNE-CT, with the RC0402FR-7W1KL, ABLS-12.000MHZ-B4-T and UHD111A-FKA-C3K23E1L3VG5ZB3Z3 among its other parts. Its parts include 15 capacitors, 5 resistors, 5 connectors, 2 ICs and 1 diode. It belongs with the keyboards and input boards and the RP2040 boards of this library.

Main components

6

README

README.md

About

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:

  • Yu-yang Hsieh
  • Britton McLeavy
  • Caleb O'Malley
  • Merrick Ryman
  • Evan Zhang

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).

Architecture and Aesthetics

At the highest abstraction the Prototroller consists of the following:

  • Master Board
  • Module Boards
  • Component Interfaces
  • Enclosures
  • Firmware

Master Board

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

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.

Component Interface Boards

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.

Enclosures

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.

Firmware

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.

Usage

There are a few ways you may use the Prototroller.

Our Hardware, Our Software

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.

Your Hardware, Our Software

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.

Building and Flashing Master Boards

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:

  1. Ensure you have the Pico SDK cloned somewhere, such as ~/pico-sdk.
  2. Make and cd into a 'build' subdirectory, and export the Pico SDK path:
    text
    $ cd prototroller
    $ mkdir build
    $ cd build
    $ export PICO_SDK_PATH=...
  3. Generate the build targets:
    text
    $ cmake -DPICO_BOARD=prototroller ..
  4. Build all targets by running 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.
  5. This will generate the appropriate .uf2 binaries, which can be flashed by dragging onto the mount.

Building and Flashing Module Boards

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:

  1. Follow the steps listed in "Building and Flashing Master Boards" to generate the binary for the module boards.
  2. Connect SWDIO and SWCLK from debug probe to the SWD headers above the flash on the module board (labeled on rear silkscreen).
  3. Connect a common ground between the Picoprobe and the module board.
  4. Snap the module board to a powered master board (alternatively, supply 3V3 through the female header).
  5. If you are using WSL, pass-through the Picoprobe in Powershell using usbipd.
  6. Use the 'Prototroller Flash' task in VSCode, or execute the following command, where joystick-module.elf is the name of the ELF executable generated previously:
    text
    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

Roadmap

  • Proof of Concept Build
  • Basic Master/Module Firmware
  • Basic Host HID Drivers
  • Basic Component Support
  • Prototype Build
  • Interconnect Design
  • Module Board Design(s)
  • Master Board Design
  • Chassis/Module Enclosure Designs
  • Advanced Firmware
  • Advanced HID Drivers
  • Advanced Component Support
  • Finalized Firmware
  • Prototroller Artifact
  • Stretch: Wireless Support
  • Stretch: Power Optimization
  • Stretch: More types of modules

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.

Acknowledgements

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.

Parts

29
QtyValueFootprintReferences
11100nCapacitor_SMD:C_0402_1005MetricC1, C2, C5, C6, C7, C10, C11, C12, C13, C14, C15
41kResistor_SMD:R_0402_1005MetricR3, R4, R5, R6
21uCapacitor_SMD:C_0402_1005MetricC3, C4
227pCapacitor_SMD:C_0402_1005MetricC8, C9
2Conn_01x02_MaleConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ9, J10
110kResistor_SMD:R_0402_1005MetricR2
1ABLS-12.000MHZ-B4-Tprototroller_footprints:XTAL_ABLS-12.000MHZ-B4-TY1
1Conn_01x03_MaleConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ1
1Conn_01x06_Maleprototroller_footprints:Mag_Pogo_6P_P2.2mm_MaleJ5
1Conn_01x10_MaleConnector_PinHeader_2.54mm:PinHeader_1x10_P2.54mm_VerticalJ2
1LED_RGBprototroller_footprints:LED_Cree-UHD111AD1
1RP2040Package_DFN_QFN:QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mmU1
1W25Q16JVSSIQPackage_SO:SOIC-8_5.23x5.23mm_P1.27mmU2

Questions

How big is the Module board PCB?

It measures 30 × 30 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Module board use?

29 parts, built around the RP2040, W25Q16JVSSIQ, C0402X7R100-104KNE-CT and RC0402FR-7W1KL. 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.

Where can I download the Module board KiCad files?

From the roboryman/prototroller repository on GitHub, at the commit this page was made from: the board is schematics/module_board/module_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.

Can I use the Module board design in my own project?

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).

More from roboryman/prototroller

1
  • 2 layers156 × 156 mmMaster board, the printed circuit board in 3D

    Master 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.

    83 parts9MIT

Similar boards

  • 6 layers139.7 × 88.9 mmIMX6-BareBones, the printed circuit board in 3D

    IMX6-BareBones

    a1wolfe/iMX6-BareBones

    i.MX 6ULL Open Source Development Board

    558 parts
  • 4 layers99 × 64 mmWSPR ease, the printed circuit board in 3D

    WSPR ease

    alanmimms/WSPR-ease

    Easy WSPR transmitter using ESP32C3 and not much else.

    182 parts1MIT
  • 4 layers80 × 30 mmKeepsake keychain, the printed circuit board in 3D

    Keepsake keychain

    ericmcdaniel/wedding-keepsake

    The full design files and source code of the RGB LED matrix on a PCB keychain given as a keepsake party favor at my wedding.

    95 partsMIT
  • 4 layers27.4 × 17 mmMIG Flashcart, the printed circuit board in 3D

    MIG Flashcart

    sabogalc/MIG-Flash-PCBs

    MIG Dumper and Flashcart PCB files in KiCad

    37 parts69WTFPL
  • 4 layers82.6 × 82.5 mmJumperless2, the printed circuit board in 3D

    Jumperless2

    Architeuthis-Flux/Jumperless

    A jumperless breadboard

    208 parts914
  • 4 layers102.9 × 96.7 mmPicoGUS chipdown, the printed circuit board in 3D

    PicoGUS chipdown

    polpo/picogus

    Emulation of ISA sound cards and CD-ROM on Raspberry Pi Pico (GUS, SB/Adlib, MPU-401, Tandy, CMS, Panasonic CD-ROM) with USB mouse/joystick support

    99 parts805
  • 2 layers161.5 × 106 mmWaccaProtocolTranslator, the printed circuit board in 3D

    WaccaProtocolTranslator

    FizzyApple12/Waccon

    A repository for all of the files in my design for an open-source touch ring controller.

    108 parts33
  • 2 layers99.1 × 72.9 mmTone ale, the printed circuit board in 3D

    Tone ale

    lxschwalb/tone_ale

    rp2040 based guitar pedal

    57 parts19