Settle the numpad layout: 25 keys, one encoder

Six by five. Arrows on the outer column, PgUp/PgDn beside them, no Num key.
The scroll wheel is dropped - no good physical implementation - which also
removes the pointing-device path from the firmware entirely, frees a USB
endpoint, and retires the detentless-EC11 sourcing risk. The freed 2u at the
top takes a single volume encoder with room for a full-size knob.

BOM: diodes and sockets 26 -> 25, encoders 2 -> 1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
William Rickert
2026-08-27 14:43:40 -05:00
co-authored by Claude Opus 5
parent a9e550e065
commit f8d22252ad
3 changed files with 66 additions and 9 deletions
+22 -5
View File
@@ -12,7 +12,15 @@ Status: **design**. No boards ordered, no firmware written.
| Board | Qty | Keys | Carries |
|---|---|---|---|
| `hardware/half` | 2 (mirrored) | TBD — layout not designed | MCU, matrix, USB-C, SBU split link |
| `hardware/numpad` | 1 | 26 (17 numpad + 9 nav) | MCU, matrix, 2 encoders, **CH334R hub**, 3 downstream ports |
| `hardware/numpad` | 1 | 25 (16 numpad + 9 nav) | MCU, matrix, 1 encoder, **CH334R hub**, 3 downstream ports |
**Numpad layout is settled** — see `docs/numpad-layout.svg`. Six columns by five
rows, ~114 × 95 mm. Arrows take the **outer** left column on the principle that
the most-used keys go furthest out, PgUp/PgDn sit beside them, and Del/Home/End
fill the rest of the two nav columns. **No Num key** — the firmware resolves
keypad vs number-row at press time, so the pad never needed one. The 2u that
frees up at the top holds the single volume encoder, which means a full-size
knob fits rather than two cramped ones colliding at 19.05 mm centres.
Cabling:
@@ -189,10 +197,19 @@ Plan is belt-and-braces:
Only eleven keys need this (19, 0, `.`). `KP_SLASH`/`ASTERISK`/`MINUS`/`PLUS`/
`ENTER` mean the same thing either way.
**Encoders:** volume wants a **detented** EC11; scroll wants a **detentless** one,
because hi-res scrolling (`POINTING_DEVICE_HIRES_SCROLL_ENABLE`, resolution
multiplier, 1/120 tick) fights physical detents. Confirm the detentless SKU from
the datasheet — vendor descriptions are unreliable.
**One encoder, volume only.** The scroll wheel was dropped — no good physical
implementation. That removes more than it looks like:
- No `POINTING_DEVICE_ENABLE`, no `MOUSEKEY_ENABLE`, no hi-res scroll resolution
multiplier. **The numpad stops enumerating as a mouse entirely** — it's a
keyboard plus consumer control and nothing else.
- One fewer USB endpoint, which matters because the L103's USBFS has eight and
QMK's composite device was going to be tight against that.
- The detentless-EC11 sourcing risk is gone. A stock EC11 is detented, which is
exactly what volume wants, so `C2991196` is simply correct with nothing to
verify.
Rules file is now just `ENCODER_ENABLE` + `EXTRAKEY_ENABLE`.
---
+3 -4
View File
@@ -22,9 +22,8 @@ HALF,Split,D-ESD,1,ESD 5V bidirectional,PESD5V0S1BA,C2827694,SOD-323,Extended,0.
HALF,Split,J3,1,3-pin header DNF,JST SH,-,-,Consigned,0.02,"*** DNF INSURANCE *** VCC/GND/DATA fallback if SBU proves flaky (bad cables). 3 pads cost nothing"
HALF,Split,-,-,SBU1+SBU2 TIE,-,-,-,-,0.00,"Tie A8 and B8 together on the board. SBU is CROSSED in the cable, so this makes it orientation-proof and doubles the conductor"
NUMPAD,DNF,J1/U3/R3/R4/R5,0,DO NOT POPULATE,-,-,-,-,0.00,"*** From the ALL block: numpad MCU has NO connector of its own. Its D+/D- route internally to hub downstream port 1. No connector = no ESD part and no CC resistors needed. Saves ~$0.19"
NUMPAD,Matrix,D1-D26,26,1N4148W,1N4148W,C81598,SOD-123,Basic,0.011,"26 keys: 17 numpad + 9 nav"
NUMPAD,Encoder,ENC1,1,EC11 detented,EC11L1525G01,C2991196,THT,Extended,1.27,"VOLUME - wants detents. THT: hand-solder or JLC THT surcharge"
NUMPAD,Encoder,ENC2,1,EC11 detentless,verify variant,-,THT,Extended,1.27,"SCROLL - wants NO detents for hi-res scroll. Confirm detentless SKU"
NUMPAD,Matrix,D1-D25,25,1N4148W,1N4148W,C81598,SOD-123,Basic,0.011,"25 keys: 16 numpad (no Num key) + 9 nav"
NUMPAD,Encoder,ENC1,1,EC11 detented,EC11L1525G01,C2991196,THT,Extended,1.27,"VOLUME - detented, which is what a stock EC11 already is. Occupies a 2u cell so a full-size knob fits. THT: hand-solder or JLC THT surcharge"
NUMPAD,Hub,U4,1,USB2.0 4-port hub,CH334R,C4154405,QSOP-16-150mil,Extended,0.50,"Ports: 1=own MCU (internal FS) 2=left half 3=right half 4=spare"
NUMPAD,Hub,Y2,1,12MHz crystal,X322512MSB4SI,C9002,SMD3225-4P,Basic,0.101,"CH334 has built-in load caps - verify internal value vs this 20pF CL crystal; fit DNF cap pads"
NUMPAD,Hub,C12-C14,3,100nF 0402,CL05B104KO5NNNC,C1525,0402,Basic,0.006,"hub decoupling"
@@ -37,6 +36,6 @@ NUMPAD,Hub,R8-R13,6,56k 0402,FRC0402F5602TS,C2906875,0402,Extended,0.0018,"Rp pu
NUMPAD,SBU,-,-,SBU PASS-THROUGH,-,-,-,-,0.00,"*** Passive trace *** Tie SBU1+SBU2 on J5 (left half) and on J6 (right half), then connect the two nets together. Carries QMK split_common UART between the halves. Numpad MCU does NOT touch this net"
NUMPAD,SBU,D-ESD2,2,ESD 5V bidirectional,PESD5V0S1BA,C2827694,SOD-323,Extended,0.036,"One per half-port SBU net"
HALF,Switches,SW-,1,MX hotswap socket,CPG151101S11,C41430893,SMD 14.5x5.9mm,Extended,0.037,"One per key. BOTTOM SIDE. Alt: C49352235 (CPG151101S11-2)"
NUMPAD,Switches,SW-,26,MX hotswap socket,CPG151101S11,C41430893,SMD 14.5x5.9mm,Extended,0.037,"One per key. BOTTOM SIDE"
NUMPAD,Switches,SW-,25,MX hotswap socket,CPG151101S11,C41430893,SMD 14.5x5.9mm,Extended,0.037,"One per key. BOTTOM SIDE"
NOTE,Assembly,-,-,SINGLE-SIDED,-,-,-,-,-,"Put ALL SMD on the BOTTOM: sockets, MCU, passives, diodes, and any reverse-mount SK6812MINI-E. Top face bare except switch holes. Keeps JLC to one assembly pass"
NOTE,Mechanical,-,-,PLATE REQUIRED,-,-,-,-,-,"Hotswap needs a switch plate or socket pads tear off during switch insertion. FR4 plate = just another JLC board"
1 Board Section Ref Qty Value MPN LCSC Package JLC Unit USD Notes
22 HALF Split J3 1 3-pin header DNF JST SH - - Consigned 0.02 *** DNF INSURANCE *** VCC/GND/DATA fallback if SBU proves flaky (bad cables). 3 pads cost nothing
23 HALF Split - - SBU1+SBU2 TIE - - - - 0.00 Tie A8 and B8 together on the board. SBU is CROSSED in the cable, so this makes it orientation-proof and doubles the conductor
24 NUMPAD DNF J1/U3/R3/R4/R5 0 DO NOT POPULATE - - - - 0.00 *** From the ALL block: numpad MCU has NO connector of its own. Its D+/D- route internally to hub downstream port 1. No connector = no ESD part and no CC resistors needed. Saves ~$0.19
25 NUMPAD Matrix D1-D26 D1-D25 26 25 1N4148W 1N4148W C81598 SOD-123 Basic 0.011 26 keys: 17 numpad + 9 nav 25 keys: 16 numpad (no Num key) + 9 nav
26 NUMPAD Encoder ENC1 1 EC11 detented EC11L1525G01 C2991196 THT Extended 1.27 VOLUME - wants detents. THT: hand-solder or JLC THT surcharge VOLUME - detented, which is what a stock EC11 already is. Occupies a 2u cell so a full-size knob fits. THT: hand-solder or JLC THT surcharge
NUMPAD Encoder ENC2 1 EC11 detentless verify variant - THT Extended 1.27 SCROLL - wants NO detents for hi-res scroll. Confirm detentless SKU
27 NUMPAD Hub U4 1 USB2.0 4-port hub CH334R C4154405 QSOP-16-150mil Extended 0.50 Ports: 1=own MCU (internal FS) 2=left half 3=right half 4=spare
28 NUMPAD Hub Y2 1 12MHz crystal X322512MSB4SI C9002 SMD3225-4P Basic 0.101 CH334 has built-in load caps - verify internal value vs this 20pF CL crystal; fit DNF cap pads
29 NUMPAD Hub C12-C14 3 100nF 0402 CL05B104KO5NNNC C1525 0402 Basic 0.006 hub decoupling
36 NUMPAD SBU - - SBU PASS-THROUGH - - - - 0.00 *** Passive trace *** Tie SBU1+SBU2 on J5 (left half) and on J6 (right half), then connect the two nets together. Carries QMK split_common UART between the halves. Numpad MCU does NOT touch this net
37 NUMPAD SBU D-ESD2 2 ESD 5V bidirectional PESD5V0S1BA C2827694 SOD-323 Extended 0.036 One per half-port SBU net
38 HALF Switches SW- 1 MX hotswap socket CPG151101S11 C41430893 SMD 14.5x5.9mm Extended 0.037 One per key. BOTTOM SIDE. Alt: C49352235 (CPG151101S11-2)
39 NUMPAD Switches SW- 26 25 MX hotswap socket CPG151101S11 C41430893 SMD 14.5x5.9mm Extended 0.037 One per key. BOTTOM SIDE
40 NOTE Assembly - - SINGLE-SIDED - - - - - Put ALL SMD on the BOTTOM: sockets, MCU, passives, diodes, and any reverse-mount SK6812MINI-E. Top face bare except switch holes. Keeps JLC to one assembly pass
41 NOTE Mechanical - - PLATE REQUIRED - - - - - Hotswap needs a switch plate or socket pads tear off during switch insertion. FR4 plate = just another JLC board
+41
View File
@@ -0,0 +1,41 @@
<svg width="100%" viewBox="0 0 680 470" role="img" xmlns="http://www.w3.org/2000/svg">
<title>Numpad board, settled layout</title>
<desc>Six columns by five rows. Arrows on the outer left column, page up and down beside them, the numpad on the right without a Num key, and a single volume encoder spanning two cells at the top.</desc>
<text class="th" x="18" y="24">Numpad board &#8212; settled</text>
<text class="ts" x="18" y="44">25 keys and one encoder. Arrows on the outside, no Num key, no scroll wheel.</text>
<g class="c-purple"><rect x="212" y="70" width="123" height="59" rx="4" stroke-width="0.5"/></g>
<g class="c-purple"><circle cx="274" cy="100" r="25" stroke-width="0.5"/></g>
<text class="ts" x="274" y="104" text-anchor="middle">Volume</text>
<g class="c-teal"><rect x="148" y="70" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="178" y="104" text-anchor="middle">Del</text></g>
<g class="c-teal"><rect x="148" y="134" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="178" y="168" text-anchor="middle">Home</text></g>
<g class="c-teal"><rect x="148" y="198" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="178" y="232" text-anchor="middle"></text></g>
<g class="c-teal"><rect x="148" y="262" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="178" y="296" text-anchor="middle"></text></g>
<g class="c-teal"><rect x="148" y="326" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="178" y="360" text-anchor="middle"></text></g>
<g class="c-teal"><rect x="212" y="134" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="242" y="168" text-anchor="middle">End</text></g>
<g class="c-teal"><rect x="212" y="198" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="242" y="232" text-anchor="middle">PgUp</text></g>
<g class="c-teal"><rect x="212" y="262" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="242" y="296" text-anchor="middle">PgDn</text></g>
<g class="c-teal"><rect x="212" y="326" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="242" y="360" text-anchor="middle"></text></g>
<g class="c-coral"><rect x="276" y="134" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="306" y="168" text-anchor="middle">7</text></g>
<g class="c-coral"><rect x="276" y="198" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="306" y="232" text-anchor="middle">4</text></g>
<g class="c-coral"><rect x="276" y="262" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="306" y="296" text-anchor="middle">1</text></g>
<g class="c-coral"><rect x="276" y="326" width="123" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="338" y="360" text-anchor="middle">0</text></g>
<g class="c-coral"><rect x="340" y="70" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="370" y="104" text-anchor="middle">/</text></g>
<g class="c-coral"><rect x="340" y="134" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="370" y="168" text-anchor="middle">8</text></g>
<g class="c-coral"><rect x="340" y="198" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="370" y="232" text-anchor="middle">5</text></g>
<g class="c-coral"><rect x="340" y="262" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="370" y="296" text-anchor="middle">2</text></g>
<g class="c-coral"><rect x="404" y="70" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="434" y="104" text-anchor="middle">*</text></g>
<g class="c-coral"><rect x="404" y="134" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="434" y="168" text-anchor="middle">9</text></g>
<g class="c-coral"><rect x="404" y="198" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="434" y="232" text-anchor="middle">6</text></g>
<g class="c-coral"><rect x="404" y="262" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="434" y="296" text-anchor="middle">3</text></g>
<g class="c-coral"><rect x="404" y="326" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="434" y="360" text-anchor="middle">.</text></g>
<g class="c-coral"><rect x="468" y="70" width="59" height="59" rx="4" stroke-width="0.5"/><text class="ts" x="498" y="104" text-anchor="middle">-</text></g>
<g class="c-coral"><rect x="468" y="134" width="59" height="123" rx="4" stroke-width="0.5"/><text class="ts" x="498" y="200" text-anchor="middle">+</text></g>
<g class="c-coral"><rect x="468" y="262" width="59" height="123" rx="4" stroke-width="0.5"/><text class="ts" x="498" y="328" text-anchor="middle">Ent</text></g>
<g class="c-teal"><rect x="18" y="414" width="13" height="13" rx="3" stroke-width="0.5"/></g>
<text class="ts" x="37" y="424">Nav · 9 keys</text>
<g class="c-coral"><rect x="223" y="414" width="13" height="13" rx="3" stroke-width="0.5"/></g>
<text class="ts" x="242" y="424">Numpad · 16 keys</text>
<g class="c-purple"><rect x="428" y="414" width="13" height="13" rx="3" stroke-width="0.5"/></g>
<text class="ts" x="447" y="424">Encoder · 2u, fits a real knob</text>
<text class="ts" x="18" y="452">Six by five units &#8212; about 114 by 95 mm on 19.05 mm spacing.</text>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB