69-key split mechanical keyboard (PCB, case, firmware) https://val.packett.cool/blog/ergonice/
  • Rust 99.7%
  • RPC 0.3%
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Val Packett 08061a6db9 case: Move to FreeCAD 1.0 (and for now remove tenting wedges)
Welllll… this was kind of a lot of work to end up with a worse experience :D
But well, sunk cost fallacy and such
2025-03-25 18:39:48 -03:00
case case: Move to FreeCAD 1.0 (and for now remove tenting wedges) 2025-03-25 18:39:48 -03:00
fw fw: add cargo feature for MCP23017 inverse order bank B pins 2025-03-25 18:36:48 -03:00
pcb-ergonice Update board to r1 2022-03-01 22:30:52 +03:00
layout.jsonl Add keyboard-layout-editor.com JSON layout 2022-02-24 02:53:33 +03:00
layout.svg Add readme 2022-03-01 22:13:52 +03:00
README.md case: Move to FreeCAD 1.0 (and for now remove tenting wedges) 2025-03-25 18:39:48 -03:00
UNLICENSE Add r0 pcb 2022-02-21 23:49:20 +03:00

unlicense

ErgoNICE

An open source 69-key column-staggered split mechanical keyboard with a rotary knob, extra connectors, a 3D printed case with "floating key" (borderless) design, and Rusty firmware.

Read the blog post for the whole story!

Picture of the final assembled keyboard

Layout

Layout picture

(labels on the picture are the physical layout, I use Colemak)

  • Designed in KLE, the file is layout.jsonl;
  • I stared with the Ergodox layout,
  • threw away its surroundings leaving only the "core",
  • added an ortholinear "familiarity cluster" on the right for punctuation and especially non-English layouts,
  • and arranged thumb clusters and other keys in a way that made sense for me.

PCB

  • Designed in Horizon EDA, the project is in the pcb-ergonice directory;
  • The left side is designed for automated SMT assembly, the right side is designed for manual TH soldering at home;
  • Various protections are included, even reverse polarity via transistors;
  • Uses an STM32L151C8 microcontroller (since the L series were less affected by the chip shortage);
  • Uses an MCP23017 I/O expander on the right side (DIP package, even — because I had 5 of those on hand since the early days of Arduino and had to use them);
  • Uses a TYPE-C-31-M-12 USB-C connector, does the Type C legacy device resistor thing correctly;
  • Uses PJ313B 3.5mm jack TRRS connectors for the cable between the halves:
    • note that actually the "extra" protruding part of the connector must be cut off — who designed this one >_<;
  • Uses a Bourns PEC12R (or a clone called EC12SXB2) rotary encoder for the volume knob;
  • Designed with extensibility in mind, in the form of extra connectors:
    • a UART jack (planned for non-USB "teletype mode"),
    • external button pin pairs on both sides (so stuff like "a big red button on the desk" and "a vim pedal" don't need their own microcontrollers),
    • even holes for a pogo pin connector on the right side for extra future I2C devices (trackballs? etc.) though I haven't included space for that into the case.

Case

  • Designed in FreeCAD, the project is in the case directory (use "Open Directory…" as it's been moved from realthunder's Link fork to 1.0, this currently requires manually zipping/unzipping the directory);
  • Designed for 3D printing, tolerances are already included, everything was successfully printed with a 0.6mm nozzle;
  • Includes tenting support with wedges that attach to holes on the bottom;
  • Leaves the debug pins accessible from the bottom;
  • Uses M2x10 screws for fastening the "tray" to the "plate";
  • NEW: pretty slim!

Firmware

  • Written in Rust, the project is in the fw directory;
  • Uses the Keyberon crate for, uh, the keyboarding;
  • Uses GPIO DMA for (left-half) matrix scanout, inspired by this post;
    • I realized that this technique can even be extended to work with rows/cols totally mixed between ports A and B, but here that wasn't even necessary;
  • Uses a hardware timer for reading the knob;
  • Tries to support disconnection and reconnection between the halves, via HAL modifications;
  • My layout includes ctrl-esc and shifts-as-parens, and extra layers: numpad, firmware Colemak, "game mode" (disabling smart Ctrl-Esc and Shifts), inverse firmware Colemak;
  • Includes a 1337 g4m3r m0d3 that bumps up effective key polling rate from 250 to 4000 Hz and requested USB polling rate from 125 to 1000 Hz, activated by holding M2 on power up.

License

This is free and unencumbered software hardware released into the public domain.
For more information, please refer to the UNLICENSE file or unlicense.org.

This does not apply to the cached Horizon pool contents (see the horizon-pool license) and to various external 3D models, which are under GrabCAD non-commercial terms.

1000