

Knobs module[
A modular macropad
- Size
- 80 × 80 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 16
- Nets
- 24
- Pads
- 81
- Tracks, vias
- 193, 30
- Pours
- 1
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 13 Sep 2026
- Updated
- 21 Oct 2026
Overview
Knobs module[ is an open-source printed circuit board by Choccy-vr, from the Choccy-vr/Modpad repository on GitHub. It is a 2-layer board of 80 × 80 mm with 16 parts on 24 nets, routed with 193 tracks and 30 vias.
It is built around the CH32V203F6P6. Its parts include 5 connectors, 4 capacitors, 2 ICs, 2 switches and 1 resistor. It belongs with the keyboards and input boards and the RISC-V boards of this library.
Main components
1README
README.mdModpad
An open-source, hot-swappable modular macro pad system with live browser-based key mapping.
Modpad combines hardware and software to create an adaptable modular macropad. Rather than locking users in a fixed, rigid layout, keyboard layout, or proprietary config software, Modpad allows users to magnetically hot-swap satellite modules into a main module and reconfigure key actions and layout all in real time.
Configurator URL: https://modpad.vercel.app/ Demo Video: https://youtu.be/VHo8qCPebk0
Features
- Dynamic Module Discovery: Automatically identifies and polls attached satellite modules using i2c
- Zero-Install Configurator: Uses web serial to read active layouts, update bindings, and provide real-time input status all with a website.
- Dynamic Remapping: Keymaps are refreshed directly in the microcontroller's RAM; no need to restart every time.
- Full HID & Consumer Control Support: Emulates standard keyboard keystrokes, modifiers, and media controls (Volume, Play/Pause, Brightness).
Modules
- Macro: The standard-sized macro pad. 6 completely remappable buttons.
- Knobs: 2 Rotary Encoders. Perfect for volume and brightness.
- More in the works
Protocol
The web configurator and the main module communicate over USB serial (115200 baud) using newline-delimited JSON. Each message is a single JSON object ending in \n.
| Message | Direction | Description | Example |
|---|---|---|---|
get_layout | Web -> Board | Requests the keymap of every module | {"cmd":"get_layout"} |
layout | Board -> Web | Returns each module's keymap as a list of actions | {"status":"layout","modules":{"Macro":[{"code":4,"mod":0,"consumer":false}, ...]}} |
get_modules | Web -> Board | Requests which modules are currently connected | {"cmd":"get_modules"} |
modules | Board -> Web | Returns the connection state of each module | {"status":"modules","modules":{"Macro":true,"Knobs":false}} |
set_key | Web -> Board | Rebinds one key or knob direction in RAM | {"cmd":"set_key","module":"Macro","index":2,"code":4,"modifiers":0,"consumer":false} |
ok / error | Board -> Web | Reply to set_key | {"status":"ok"} / {"status":"error","msg":"invalid_key_or_module"} |
press | Board -> Web | Sent whenever a button or knob is used | {"status":"press","module":{"name":"Macro","index":2,"type":"button"}} |
log | Board -> Web | Debug message, so the serial stream stays pure JSON | {"status":"log","msg":"..."} |
Fields
code: HID keyboard usage ID, or a consumer usage ID whenconsumeristrue(for example0xE9for Volume +).modifiers/mod: Modifier bitmask (0x01LCtrl,0x02LShift,0x04LAlt,0x08LGui,0x10RCtrl,0x20RShift,0x40RAlt,0x80RGui).index: Position in the module's keymap. It's the same index forset_keyandpress.
Pictures
Configurator
Main Module
Schematic
PCB
PCB 3D model
CAD
Macro Module
Schematic
PCB
PCB 3D model
CAD
Knobs Module
Schematic
PCB
PCB 3D model
CAD
Built
Parts
16| Qty | Value | Footprint | References |
|---|---|---|---|
| 3 | 4.7uF | Capacitor_SMD:C_0805_2012Metric | C2, C3, C4 |
| 2 | RotaryEncoder_Switch_MP | Rotary_Encoder:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mm | SW1, SW2 |
| 2 | SolderJumper_2_Open | Jumper:SolderJumper-2_P1.3mm_Open_Pad1.0x1.5mm | JP1, JP2 |
| 1 | 100nF | Capacitor_SMD:C_0805_2012Metric | C1 |
| 1 | 10k | Resistor_SMD:R_0805_2012Metric | R1 |
| 1 | Bottom Modular Port | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J6 |
| 1 | CH32V203F6P6 | Package_SO:TSSOP-20_4.4x6.5mm_P0.65mm | U1 |
| 1 | Conn_02x05_Odd_Even | Connector_PinSocket_2.54mm:PinSocket_2x05_P2.54mm_Vertical | J1 |
| 1 | Left Modular Port | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J5 |
| 1 | Right Modular Port | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J4 |
| 1 | Top Modular Port | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J3 |
| 1 | XC6206PxxxMR | Package_TO_SOT_SMD:SOT-23-3 | U2 |
Questions
How big is the Knobs module[ PCB?
It measures 80 × 80 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Knobs module[ use?
16 parts, built around the CH32V203F6P6. 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 Knobs module[ KiCad files?
From the Choccy-vr/Modpad repository on GitHub, at the commit this page was made from: the board is PCB/knobs_module[/knobs_module[.kicad_pcb and its schematic PCB/Main Module/modpad.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Knobs module[ design in my own project?
Its repository states no licence, so its author keeps all rights: ask Choccy-vr before reusing the design.
More from Choccy-vr/Modpad
1- 2 layers47.7 × 20.6 mm

Similar boards
- 2 layers240 × 47 mm

- 2 layers55 × 30 mm

- 2 layers26 × 51 mm

- 4 layers14.8 × 14.8 mm

- 2 layers85.5 × 54 mm

RTN Badge NL-2026
holly-hacker/RTN-Badge-2026NL-PCB
The open source hardware of the 2026 RTN badge (NL edition)
90 parts - 2 layers140.5 × 30 mm

Type e
google/mozc-devices
Circuit diagrams and firmware source code for Gboard DIY keyboards
16 parts3kApache-2.0 - 2 layers41.4 × 14.5 mm

U2f zero
conorpp/u2f-zero
U2F USB token optimized for physical security, affordability, and style
16 parts2.4k - 2 layers77.5 × 33.7 mm

Breakout 72pin 1123038-2-Connector
rusefi/rusefi
rusefi - GPL internal combustion engine control unit
16 parts1.2k