

Rp commander
USB HID shortcut-key device based on the Waveshare RP2040-Zero.
- Size
- 80 × 70 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 32
- Nets
- 30
- Pads
- 115
- Tracks, vias
- 192, 23
- Pours
- 1
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 25 May 2026
- Updated
- 28 May 2026
Overview
Rp commander is an open-source printed circuit board by fpt, from the fpt/rp-commander repository on GitHub. It is a 2-layer board of 80 × 70 mm with 32 parts on 30 nets, routed with 192 tracks and 23 vias.
It is built around the RP2040-ZERO. Its parts include 8 capacitors, 6 resistors, 2 connectors, 1 IC and 1 diode. It belongs with the RP2040 boards of this library.
Main components
1README
README.mdrp-commander
USB HID shortcut-key device based on the Waveshare RP2040-Zero.
Two rotary encoders and six buttons send keyboard/mouse shortcuts to a host Mac (or PC). An ST7789 240×240 LCD shows the active app, current profile, and all button assignments. ENC1 cycles through profiles; ENC2 and the six buttons send per-profile shortcuts.
Profiles are configurable at runtime via a USB CDC serial port — no reflashing required.
Hardware
| Part | Role |
|---|---|
| Waveshare RP2040-Zero | MCU, native USB (HID + CDC) |
| ST7789 240×240 LCD | Status display (SPI0) |
| ENC1 (GP14/15) | Profile navigation |
| ENC2 (GP28/29) | Per-profile HID encoder |
| BTN A–D (GP8–11) | Per-profile shortcuts |
| BTN X (GP12) | Per-profile shortcut, left side |
| BTN Y (GP13) | Per-profile shortcut, right side |
See docs/WIRING.md for the full pin/wiring table.
Apps and profiles
| App | Profiles |
|---|---|
| Chrome | Browsing |
| Claude | Chat |
| Fusion 360 | Sketch, Modeling |
| KiCad | Schematics, PCB |
| Krita | Painting |
ENC1 cycles through all profiles in order. The top LCD row highlights the active app icon. Profiles saved to flash persist across power cycles.
Build
Requires Docker and ../pico-sdk (or set PICO_SDK_PATH).
make docker-build # one-time Docker image setup
make quick # build + flash (hold BOOTSEL on RP2040 before connecting)
make monitor # UART console via USB-serial adapter on GP0 (TX) / GP1 (RX)A GitHub Actions workflow builds the UF2 on every push to main and uploads it as an artifact.
Configuring profiles
The device exposes a USB CDC serial port ("Commander CDC") alongside the HID interface. Profiles can be read and written at runtime using either the web configurator or the CLI tool.
Web configurator (Chrome / Edge only)
Open https://fpt.github.io/rp-commander/, click Connect, and select the "Commander CDC" port.
Python CLI
pip install pyserial
python3 tools/commander.py ports # list candidate ports
python3 tools/commander.py dump profiles.json # read profiles from device
python3 tools/commander.py load profiles.json # write + save to flashAuto-detects the CDC port. Use --port /dev/tty.usbmodemXXX if detection fails.
Manually editing profiles
Edit src/profiles.c. Each profile defines ENC2 CW/CCW, X, Y, A, B, C, D actions
using the KEY(modifier, keycode, label) or SCR(delta, label) macros.
Shortcuts default to macOS (Cmd = _G). Change _G → _C for Windows.
Icon resources
Source icon images are in resources/. To replace the geometric placeholder icons
with real brand icons, convert them with the bundled script:
pip install Pillow cairosvg
make icons # generates src/icons_data.h, auto-included by src/icons.cSee CLAUDE.md for the full architecture reference.
Parts
32| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | 0.01u | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C5, C6, C7, C8 |
| 4 | MountingHole | MountingHole:MountingHole_2.7mm | H_LL1, H_LR1, H_UL1, H_UR1 |
| 4 | SW_Push | Button_Switch_THT:SW_PUSH-12mm | SW_A1, SW_B1, SW_C1, SW_D1 |
| 2 | 0.1u | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C2, C3 |
| 2 | 10u | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C4, C9 |
| 2 | 1k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R3, R4 |
| 2 | 27 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R1, R2 |
| 2 | 4.7k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R5, R6 |
| 2 | RotaryEncoder | Rotary_Encoder:RotaryEncoder_Alps_EC12E_Vertical_H20mm | SW_ROT1, SW_ROT2 |
| 2 | SW_Push | Button_Switch_THT:SW_PUSH_6mm | SW_X1, SW_Y1 |
| 1 | 1N5822 | Diode_THT:D_DO-201_P15.24mm_Horizontal | D1 |
| 1 | Conn_01x04 | MyLibrary:USB_A_Breakout | J1 |
| 1 | Grove I2C | MyLibrary:Grove I2C | J2 |
| 1 | LCD_240x240_IPS | MyLibrary:GENERIC_LCD_154_240x240 | U1 |
| 1 | RP2040-Zero | MyLibrary:RP2040-Zero | RZ1 |
| 1 | SW_DIP_x02 | Button_Switch_THT:SW_DIP_SPSTx02_Slide_9.78x7.26mm_W7.62mm_P2.54mm | SW_PULLUP1 |
Questions
How big is the Rp commander PCB?
It measures 80 × 70 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Rp commander use?
32 parts, built around the RP2040-ZERO. 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 Rp commander KiCad files?
From the fpt/rp-commander repository on GitHub, at the commit this page was made from: the board is KiCad/rp-commander/rp-commander.kicad_pcb and its schematic KiCad/rp-commander/rp-commander.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Rp commander design in my own project?
Its repository states no licence, so its author keeps all rights: ask fpt before reusing the design.
Similar boards
- 2 layers132.3 × 94.9 mm

- 2 layers321 × 92.3 mm

- 2 layers255.9 × 99.3 mm

Zerosprey42
beekeeb/zerosprey42
Zerosprey42 Keyboard is a wired, beginner friendly, choc hotswap, MonoBlockSplit (Unibody), column-staggered, DIY mechanical keyboard.
96 parts140 - 2 layers146.3 × 69.5 mm

- 2 layers54 × 64 mm

DonConIOmini
ravinrabbid/DonCon2040
RP2040 based firmware and hardware for DIY Taiko no Tatsujin Drum Controllers
96 parts66MIT - 2 layers52 × 50 mm

RP2040-TestPatternGenerator VGA
nmur/RP2040-TestPatternGenerator
A simple test pattern generator running on the RP2040 microcontroller
12 parts64GPL-3.0 - 2 layers120 × 40 mm

Buinchiez40
ChrisChrisLoLo/bunchiez40
A pocket keyboard that makes use of mouse switches to achieve a miniscule size
90 parts56GPL-3.0 - 2 layers305.2 × 76.2 mm
