69-key split mechanical keyboard (PCB, case, firmware)

Overview

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.

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 Link, the project is in the case directory (use "Open 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 M2x16 screws for fastening the "tray" to the "plate".

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 and firmware-Colemak;

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.

You might also like...
A firmware for the Clueboard 66% Low Profile keyboard implemented in Rust.
A firmware for the Clueboard 66% Low Profile keyboard implemented in Rust.

Rust Firmware for Clueboard 66% Low Profile Keyboard A firmware for the Clueboard 66% Low Profile keyboard (also known as 66% hotswap) implemented in

Keyboard firmware implemented in Rust

flutterby-rs Keyboard firmware implemented in Rust. It doesn't do anything useful yet! Building for atmega32u4 devices (ergodox-ez, feather32u4) First

Foxtrot is a fast viewer for STEP files, a standard interchange format for mechanical CAD
Foxtrot is a fast viewer for STEP files, a standard interchange format for mechanical CAD

Foxtrot is a fast viewer for STEP files, a standard interchange format for mechanical CAD. It is an experimental project built from the ground up, including new libraries for parsing and triangulation.

Python bindings for heck, the Rust case conversion library

pyheck PyHeck is a case conversion library (for converting strings to snake_case, camelCase etc). It is a thin wrapper around the Rust library heck. R

A git command to quickly save your local changes in case of earthquake !

git-eq (aka git earthquake) Earthquakes are part of the daily life in many countries like in Taiwan. git-eq is a simple git command to quickly save yo

A very basic show-case of rust on the esp32 in 2022

Readme This example code does the following: Set up a WiFi connection on the ESP32-C3 Spawn a thread using std::thread in which we listen for incoming

Simple grammar-based test case generator

tree-splicer tree-splicer is a simple grammar-based test case generator. It parses a number of input files using tree-sitter grammars, and produces ne

Example of CVE-2024-24576 use case.

CVE-2024-24576 PoC The Command::arg and Command::args APIs state in their documentation that the arguments will be passed to the spawned process as-is

`mutatis` is a library for writing custom, structure-aware test-case mutators for fuzzers in Rust.

mutatis Easily create custom, structure-aware mutators for fuzzing. Repository | Docs | Guide | Contributing About The most popular fuzzers — includin

Probabilistically split concatenated words using NLP based on English Wikipedia unigram frequencies.
Probabilistically split concatenated words using NLP based on English Wikipedia unigram frequencies.

Untanglr Untanglr takes in a some mangled words and makes sense out of them so you dont have to. It goes through the input and splits it probabilistic

DNS resolver for split-horizon scenarios

polyresolver is a resolver for split-horizon scenarios polyresolver is used to root domain names to different nameservers for the purposes of resolvin

Binary Ninja plugin written in Rust to automatically apply symbol information from split debug info on Linux.

Load Symbols Binary Ninja plugin written in Rust to automatically apply symbol information from split debug info on Linux. Requirements Last tested wi

A simple tool in Rust to split urls in their protocol, host, port, path and query parts.

rexturl A simple tool to split urls in their protocol, host, port, path and query parts. Install cargo install rexturl or clone the source code and r

a FREE and MODERN split-screen tetris game WITHOUT ADS
a FREE and MODERN split-screen tetris game WITHOUT ADS

tetr:: A ✨ modern ✨ Tetris game made in OpenGL and Rust Gameplay tetr:: is an implementaion of modern Tetris, and essentially a clone of tetr.io. This

Split text into semantic chunks, up to a desired chunk size. Supports calculating length by characters and tokens

Large language models (LLMs) can be used for many tasks, but often have a limited context size that can be smaller than documents you might want to use. To use documents of larger length, you often have to split your text into chunks to fit within this context size.

General basic key-value structs for Key-Value based storages

General basic key-value structs for Key-Value based storages

Key-value cache RESP server with support for key expirations ⌛

BADER-DB (بادِر) Key-value cache RESP server with support for key expirations ⌛ Supported Features • Getting Started • Basic Usage • Cache Eviction •

Modern Cryptographic Firmware

Trussed® Modern Cryptographic Firmware Status Very much WIP. Actively developed. Unstable APIs.

probe-run is a custom Cargo runner that transparently runs Rust firmware on an embedded device

probe-run Runs embedded programs just like native ones probe-run is a custom Cargo runner that transparently runs Rust firmware on an embedded device.

Releases(r1)
Owner
stars ≠ requests for spam
null
Turbo Resin: open-source firmware for resin printers

Turbo Resin: open-source firmware for resin printers Turbo Resin is an open-source firmware for chitu based controller board printers. It currently su

Nicolas Viennot 139 Dec 22, 2022
A keyboard layout optimizer for layouts of the

Keyboard Layout Optimizer Neo variant layout optimizer written in rust. The optimizer is based on the "evolve-keyboard-layout" scripts by ArneBab. It

Dario Götz 29 Jan 4, 2023
Linux Advanced keyboard customizer

A multi-mode, rule-based keyboard customizer Features Key Remapping Execute command Install

秋葉 3 Apr 4, 2022
Easier joystick, mouse and keyboard input handling in Bevy

Easier joystick, mouse and keyboard input handling in Bevy

Pedro Henrique 31 Dec 20, 2022
ESP32-C3 interfacing to a PS/2 Keyboard (bare-metal Rust)

ESP32-C3 interfacing to a PS/2 Keyboard (bare-metal Rust) Very simplified example of connecting a PS/2 keyboard to ESP32-C3 You need to build it with

Björn Quentin 3 Dec 5, 2022
A scripting language that allows complex key remapping on Linux.

Map2 A scripting language that allows complex key remapping on Linux, written in Rust. All of the functionality related to interacting with graphical

Matt 99 Dec 6, 2022
A little tribute to the Dango Daikazoku from Clannad (by Key, KyoAni, et al)

dango A little tribute to the Dango Daikazoku from Clannad (by Key, KyoAni, et al) Try it with your friends at http://ernestwong.nz/dango-tribute/serv

Ernest Wong 19 Nov 21, 2022
Dynamic key remapper for X11 and Wayland

???????????? ⌨️ xremap is a key remapper for Linux. Unlike xmodmap, it supports app-specific remapping and Wayland. Concept Fast - Xremap is written i

Takashi Kokubun 643 Jan 8, 2023
A rust-based mechanical keyboard firmware

rumcake A rust-based mechanical keyboard firmware that aims to be decentralized, featureful, and easy to configure. ⚠ rumcake is still a work in progr

null 15 Oct 6, 2023
A Rust CLI that makes mechanical keyboard sound effects on every key press

Rustyvibes A Rust CLI that makes mechanical keyboard sound effects on every key press Rustyvibes.mp4 Installation macOS: brew install kb24x7/rustyvibe

Kunal Bagaria 95 Dec 14, 2022