
Bgkeeb
sadekbaroudi/bgkeeb
This is a reversible 100mm x 100mm pcb with support for mx or choc switches (no hotswap), per key led, rotary encoders, and exposes the SDA/SCL/GND/VCC lines in the form of the pimoroni trackball pins (meaning you can…

20 key mechanical macropad with encoders, per-key RGB, and color display
Macropad pcb is an open-source printed circuit board by nolanwon, from the nolanwon/macropad repository on GitHub, published under the MIT licence. It is a 2-layer board of 101 × 151.3 mm with 71 parts on 73 nets, routed with 810 tracks and 172 vias.
It is built around the 1N4148W and SK6812MINI-E. Its parts include 40 diodes, 3 switches, 2 ICs, 1 capacitor and 1 resistor. It belongs with the keyboards and input and lEDs and displays boards and the RP2040 boards of this library.
A fully custom, numpad-sized mechanical macropad with a custom PCB, hand-soldered assembly, 3D-printed enclosure, and firmware written from scratch. Features a color TFT display with a full menu system, per-key RGB backlighting, dual rotary encoders, and a built-in dual-core game mode.
Images (top to bottom, L to R): Assembled macropad showing now playing view, 2048 game, Bare PCB, Display showing main menu
This is a 5×4 (20-key) macropad built end-to-end: schematic and PCB layout in KiCad, fabrication and partial assembly through JLCPCB, a 3D-printed SolidWorks enclosure, and custom C firmware on an RP2040 running on the Pico SDK and TinyUSB (no QMK), no third-party keyboard firmware.
Highlights
| Component | Details |
|---|---|
| MCU | Adafruit Feather RP2040, socketed via machine-pin strips (removable, no direct soldering) |
| Switches | 20× Cherry MX-compatible, Kailh CPG151101S11 hotswap sockets, 5×4 grid at 19.05mm pitch |
| LEDs | 20× SK6812 MINI-E per-key RGB (reverse-mount, shining up through the PCB and switch housing) |
| Display | ILI9341 2.4" SPI TFT, 320×240, landscape |
| Encoders | 2× EC11 rotary encoders with push-button click |
| PCB | Custom design in KiCad, fabricated and partially assembled by JLCPCB |
| Enclosure | SolidWorks-designed, FDM 3D printed parts: top shell, 1.5mm switch plate, removable bottom panel |
| Fasteners | M2 brass heat-set inserts and standoffs |
| Function | GPIO |
|---|---|
| Key matrix: rows | 9, 10, 11, 12, 13 |
| Key matrix: columns | 26, 27, 28, 29 |
| Encoder 1 (top): A / B / SW | 6, 7, 8 |
| Encoder 2 (bottom): A / B / SW | 24, 25, 0 |
| Per-key LED data | 1 |
| Display: SCK / MOSI / MISO | 18, 19, 20 |
| Display: D/C / CS | 2, 3 |
| Display: RESET | shared with MCU reset (no dedicated GPIO) |
Written from scratch in C on the Raspberry Pi Pico SDK with TinyUSB, targeting adafruit_feather_rp2040.
src/
├── macropad.c main loop, screen/input wiring
├── matrix.c/.h 5x4 key matrix scan, per-key debounce, Fn layer
├── encoders.c/.h dual EC11 quadrature decode + debounced click
├── usb_descriptors.c TinyUSB composite HID descriptors
├── led/ SK6812 per-key RGB driver (PIO) + config layer
├── display/
│ ├── ili9341.c/.h SPI display driver
│ ├── font.c/.h hand-authored 5x7 bitmap font (full ASCII)
│ ├── render.c/.h character/string drawing
│ ├── statusbar.c/.h uptime clock status bar
│ ├── menu.c/.h scrollable iPod-style menu
│ ├── theme.c/.h color theme system
│ └── screen.c/.h screen manager / state machine
└── game/
├── game2048.c/.h single-core, turn-based 2048
├── game_snake.c/.h dual-core, real-time Snake
└── game_select.c/.h scrollable game-select menuEnumerates as a composite HID device with two report IDs: a standard keyboard report and a consumer-control report (used for volume via the top encoder). No USB serial/stdio, the display serves as the primary feedback and debug surface.
init / draw / on_encoder / on_click / on_leave function pointers, switched via screen_switch_to() and unwound with a context-aware screen_manager_go_back().Driven over a single GPIO via PIO, with a decoupled led_config layer (power, brightness, hue/saturation/lightness, live HSL→RGB preview) exposed through the LED Settings screen.
A dedicated key combination suspends normal HID output and hands key events to the active game instead:
multicore_fifo. A blocking start/stop handshake between the cores guarantees clean handoff of the SPI bus with no display corruption on exit.The game-select screen is a scrollable list, built to accept additional games beyond the two included.
Prerequisites
lib/tinyusb)Steps
git clone https://github.com/nolanwon/macropad.git
cd macropad
# open in VS Code with the Raspberry Pi Pico extension, or:
mkdir build && cd build
cmake -DPICO_BOARD=adafruit_feather_rp2040 ..
ninjaFlash the resulting macropad.uf2 by holding BOOT while plugging in the Feather (or double-tapping reset), then copying the .uf2 to the mass-storage device that appears.
Note: avoid building from a path containing spaces or parentheses, and avoid OneDrive/Dropbox-synced folders since both are known to cause build issues with this toolchain.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 20 | 1N4148W | Diode_SMD:D_SOD-123 | D1, D2, D3, D4, D5, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20 +4 |
| 20 | MX_SW_HS | PCM_marbastlib-mx:SW_MX_HS_CPG151101S11_1u | MX1, MX2, MX3, MX4, MX5, MX10, MX11, MX12, MX13, MX14, MX15, MX16, MX17, MX18, MX19, MX20 +4 |
| 20 | SK6812MINI-E | LED_SMD:LED_SK6812MINI-E_3.2x2.8mm_P1.5mm_ReverseMount | D21, D22, D23, D24, D25, D26, D27, D28, D29, D30, D31, D32, D33, D34, D35, D36 +4 |
| 4 | , , , | ||
| 2 | RotaryEncoder_Switch | Rotary_Encoder:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mm | SW1, SW2 |
| 1 | 100nF | Capacitor_SMD:C_0603_1608Metric | C1 |
| 1 | 330 | Resistor_SMD:R_0603_1608Metric | R1 |
| 1 | Adafruit-Feather-RP2040 | PCM_marbastlib-various:Adafruit-Feather-RP2040 | U2 |
| 1 | CR2013-MI2120 | Connector_PinSocket_2.54mm:PinSocket_1x14_P2.54mm_Vertical | U1 |
| 1 | SW_Reset | Button_Switch_THT:SW_PUSH_6mm | SW3 |
It measures 101 × 151.3 mm and has 2 copper layers, 1.6 mm thick.
71 parts, built around the 1N4148W and SK6812MINI-E. 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 nolanwon/macropad repository on GitHub, at the commit this page was made from: the board is kicad/macropad_pcb/macropad_pcb.kicad_pcb and its schematic kicad/macropad_pcb/macropad_pcb.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).

sadekbaroudi/bgkeeb
This is a reversible 100mm x 100mm pcb with support for mx or choc switches (no hotswap), per key led, rotary encoders, and exposes the SDA/SCL/GND/VCC lines in the form of the pimoroni trackball pins (meaning you can…


sadekbaroudi/barobord
I have spent a lot of time and money designing prototypes, testing, developing, etc. Any contributions would be greatly appreciated!

sporkus/le_chiffre_keyboard_stm32
Le Chiffre keyboard pcb with stm32F072

Bastardkb/Charybdis-EC11
EC11 PCB to be used in place of the trackball in the Charybdis keyboard.



WillACosta/wlfkbd
The WLF is a 40-key split keyboard (20 keys per half) with a column-staggered matrix and a splayed thumb cluster.