You are browsing as a guest. Sign up (or log in) to start making projects!

3h 10m 16s logged

Quick heads-up before I dive in: I had some trouble getting devlogs to actually post for a while, so this is my first one even though the project’s already finished. Because of that I’m packing everything into this single post — the whole build, start to finish, with the details for each stage.

What it is
Hexpad is a 6-key macropad (a 3×2 cluster) with a rotary encoder up top, running on a Seeed XIAO RP2040. It’s a clipboard/editing pad with a volume knob — front row is Copy/Paste/Cut, rear row is Undo/Redo/Save, and the encoder does volume (press to mute).

Step 1 — The case (CAD)
The enclosure is a 3D-printed top plate + bottom case. The plate holds the MX switches (standard 14 mm cutouts), has a 7 mm hole for the EC11 encoder, and four corner posts that the bottom case screws into with M2 screws.
This is where I hit my first real problem. My original top-plate model was malformed — the plate solid had a stray slab fused 74 mm beneath it, so in the slicer the plate looked like it was floating/sinking. There was no source file to go back to, so I reverse-engineered the actual dimensions straight from the STEP geometry and rebuilt the entire plate as a clean part. Now the whole thing generates — plate is 76 × 74 mm, 3 mm thick, switches on a 19.05 mm grid, mounts at ±31 mm. I also engraved “Hexpad” into the front margin of the plate, 0.6 mm deep.
Step 2 — The electronics (schematic + PCB)
Because there are only 7 inputs (6 keys + 1 encoder), I skipped the matrix completely — every switch wires straight to its own GPIO using the RP2040’s internal pull-ups, so there’s not a single diode on the board. The pin map:

Switches → D0, D1, D2, D3, D6, D7
Encoder A/B/push → D8, D9, D10
D4/D5 (SDA/SCL) left free in case I ever add an OLED

Instead of hand-drawing the board, I generated the PCB programmatically with KiCad’s pcbnew API from one coordinate spec — same numbers that drive the CAD. That guarantees the switches, encoder, and mounting holes line up exactly with the printed plate, no manual alignment. I did the schematic the same way, then went back and added wire stubs so the net labels actually read cleanly instead of piling on top of the symbols.
The board is 2-layer, 76 × 74 mm (well under the 100 mm limit), DRC clean (0 errors, 0 unconnected), with “Hexpad” on the silkscreen and the Gerbers exported and zipped, ready for fab.

Step 3 — The firmware
KMK (CircuitPython) on the XIAO RP2040. The keymap just maps each GPIO to a keycode and the encoder to volume up/down + mute. Easy to remap since it’s all in one code.py.
Where it’s at
Everything’s done and in the repo: parametric CAD, generated PCB + Gerbers, clean schematic, KMK firmware, and a full BOM. Next up is ordering the board, printing the case, and soldering it all together.
Sorry again for the radio silence on devlogs — at least this one covers the whole story in one go. 🚀

0
2

Comments 0

No comments yet. Be the first!