Skip to content

Instantly share code, notes, and snippets.

@justinmklam
Created December 4, 2025 00:53
Show Gist options
  • Select an option

  • Save justinmklam/9228b794ec988bee8873a235a4a56f49 to your computer and use it in GitHub Desktop.

Select an option

Save justinmklam/9228b794ec988bee8873a235a4a56f49 to your computer and use it in GitHub Desktop.
Ergogen config for a unibody ortho keyboard.
meta:
engine: 4.1.0
version: 1.1
author: justinmklam
units:
# Proxy Spacing Variables
kx: u
ky: U
# Padding Variables
px: kx + 2
py: ky + 2
split_angle: 0
# vertical offset of mcu area items
voff: 11
# pinky splay angles
# spang: 8
spang: 0
pinksprd: 0.5
standoff_size: 5 #size for standoff holes on pcb
hole1_x: -0.5 kx - 1
hole1_y: -0.5 ky + 0.5
hole2_x: -0.52 kx
hole2_y: -0.35 ky
hole3_x: 0.5 kx + 1
hole3_y: 0. ky - 1.5
hole4_x: 0.5 kx - 5
hole4_y: -0.5 ky - 2.1
hole5_x: -0.5 kx - 0.4
hole5_y: -0.2 ky + 1.1
wall_thickness: 1.2 # account for the thickness in 3D printed case/plate
print_fit_tolerance: 0.2 # give the case some overlap beyond pcb
# display correct choc sizing
$default_width: 18
$default_height: 17
points:
zones:
matrix:
anchor.shift: [130, -100] # Fix KiCad placement
key:
padding: 1ky # is this extra spacing necessary or will 1 allow spacing for keycaps?
spread: 1kx
columns:
# extra: # additional outer key, inspired by TOTEM
# rows.bottom.skip: true
# rows.top.skip: true
# key.splay: spang
# key.column_net: col_extra
pinky:
key.stagger: 0.33ky
key.splay: spang # comment this line out if using the 'extra' key above
key.column_net: col_pinky
ring:
key.stagger: 1ky
key.splay: -spang/2
key.spread: 1kx + pinksprd # avoid collision on splayed col?
key.column_net: col_ring
rows.extra.skip: true
middle:
# key.stagger: 0.1ky
key.splay: -spang/2
key.spread: 1kx + pinksprd # avoid collision on splayed col?
key.column_net: col_middle
rows.extra.skip: true
index:
# key.stagger: -0.1ky
key.column_net: col_index
rows.extra.skip: true
inner:
# key.stagger: -0.1ky
key.column_net: col_inner
rows.extra.skip: true
rows:
bottom:
row_net: row_bottom
home:
row_net: row_home
top:
row_net: row_top
extra:
row_net: row_extra
thumb:
key:
padding: 1ky
spread: 1kx
anchor:
ref: matrix_index_bottom
shift: [0kx, -1ky]
# rotate: -10
columns:
near:
key.name: thumb_near
key.column_net: col_middle
mid:
# key.splay: -15
key.origin: [-0.5kx, -0.5ky]
key.name: thumb_mid
key.column_net: col_index
far:
# key.splay: -15
key.origin: [-0.5kx, -0.5ky] #-0.5kx
key.name: thumb_far
key.column_net: col_inner
## for 1.5 thumb key
# key.width: 1.5kx
# key.rotate: 90
rows:
thumb-cluster:
row_net: row_thumb
rotate: -split_angle
mirror: &mirror
ref: thumb_far
distance: 1.5kx
outlines:
board_outline:
- what: polygon
operation: stack
points:
# LEFT SIDE - walk top row (extra column is now the outermost key)
# - ref: matrix_extra_home
# shift: [-0.5px, -0.5py]
# - ref: matrix_extra_home
# shift: [-0.5px, 0.5py]
- ref: matrix_pinky_top
shift: [-0.5px, 0.5py]
- ref: matrix_ring_top
shift: [-0.5px, 0.5py]
- ref: matrix_middle_top
shift: [-0.5px, 0.5py]
- ref: matrix_middle_top
shift: [0.5px, 0.5py]
- ref: matrix_inner_top
shift: [0.5px, 0.5py]
# ACROSS TO RIGHT SIDE
- ref: mirror_matrix_inner_top
shift: [0.5px, 0.5py]
- ref: mirror_matrix_middle_top
shift: [0.5px, 0.5py]
- ref: mirror_matrix_middle_top
shift: [-0.5px, 0.5py]
- ref: mirror_matrix_ring_top
shift: [-0.5px, 0.5py]
- ref: mirror_matrix_pinky_top
shift: [-0.5px, 0.5py]
# - ref: mirror_matrix_extra_home
# shift: [-0.5px, 0.5py]
# - ref: mirror_matrix_extra_home
# shift: [-0.5px, -0.5py]
# DOWN OUTER EDGE (right half, now extra is outermost)
- ref: mirror_matrix_pinky_bottom
shift: [-0.5px, -0.6py]
# RIGHT THUMB CLUSTER
- ref: mirror_thumb_near
shift: [0.5px, -0.5py]
- ref: mirror_thumb_mid
shift: [0.5px, -0.5py]
- ref: mirror_thumb_far
shift: [0.5px, -0.5py]
# CROSS UNDER
- ref: thumb_far
shift: [0.5px, -0.5py]
- ref: thumb_mid
shift: [0.5px, -0.5py]
- ref: thumb_near
shift: [-0.5px, -0.5py]
# LEFT EDGE
- ref: matrix_pinky_bottom
shift: [-0.5px, -0.6py]
fillet: 10
# just the keys
raw:
- what: rectangle
where: true
size: [px, py]
# keys without padding
keys:
- what: rectangle
where: true
size: [kx-0.5, ky-0.5]
# keys without padding
key-plug:
- what: rectangle
where: true
size: [14, 14]
all_key_outline:
- name: board_outline
- operation: subtract
name: keys
all_plug_outline:
- name: board_outline
- operation: subtract
name: key-plug
pcbs:
pcb:
template: kicad8
outlines:
main:
outline: board_outline
footprints:
choc_hotswap:
what: ceoloide/switch_choc_v1_v2
where: true
params:
from: "{{colrow}}"
to: "{{column_net}}"
include_corner_marks: true
include_keycap: true
keycap_height: 16.5
keycap_width: 17.5
reversible: false
hotswap: true
choc_v2_support: false
diode:
what: ceoloide/diode_tht_sod123
where: true
params:
from: "{{colrow}}"
to: "{{row_net}}"
include_tht: false
reversible: false
adjust:
# rotate: -90
# shift: [8.25,4.2]
shift: [0, -5]
# resist: true
mcu:
what: ceoloide/mcu_nice_nano
where:
- ref: matrix_inner_top
# TODO #5 Move MCU right to create space between Key cols. 1mm should do it to start with...
shift: [25, 6.8 - voff]
rotate: split_angle
params:
reversible: false
reverse_mount: false
show_silk_labels: false
P4: row_top
P5: row_home
P6: row_bottom
P7: row_thumb
P14: col_inner
P15: col_index
P18: col_middle
P19: col_ring
P20: col_pinky
# battery:
# what: ceoloide/battery_connector_jst_ph_2
# params:
# reversible: true
# where:
# - ref: matrix_inner_top
# shift: [22, -14.2 - voff]
# #rotate: -90
# power:
# what: ceoloide/power_switch_smd_side
# params:
# reversible: true
# where:
# - ref: matrix_inner_top
# shift: [27.2, -18.2 - voff]
# rotate: 0
# reset:
# what: ceoloide/reset_switch_smd_side
# params:
# reversible: true
# where:
# - ref: matrix_inner_top
# shift: [27.3, -9.5 - voff]
# rotate: -90
hole_1:
what: ceoloide/mounting_hole_npth
where:
- ref: matrix_middle_top
shift: [hole1_x, hole1_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
hole_2:
what: ceoloide/mounting_hole_npth
where:
- ref: matrix_inner_top
shift: [hole2_x, hole2_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
hole_3:
what: ceoloide/mounting_hole_npth
where:
- ref: thumb_mid
shift: [hole3_x, hole3_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
hole_4:
what: ceoloide/mounting_hole_npth
where:
- ref: matrix_index_bottom
shift: [hole4_x, hole4_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
hole_5:
what: ceoloide/mounting_hole_npth
where:
- ref: matrix_ring_bottom
shift: [hole5_x, hole5_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
hole_6:
what: ceoloide/mounting_hole_npth
where:
- ref: mirror_matrix_middle_top
shift: [hole1_x, hole1_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
hole_7:
what: ceoloide/mounting_hole_npth
where:
- ref: mirror_matrix_inner_top
shift: [hole2_x, hole2_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
hole_8:
what: ceoloide/mounting_hole_npth
where:
- ref: mirror_thumb_mid
shift: [hole3_x, hole3_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
hole_9:
what: ceoloide/mounting_hole_npth
where:
- ref: mirror_matrix_index_bottom
shift: [hole4_x, hole4_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
hole_10:
what: ceoloide/mounting_hole_npth
where:
- ref: mirror_matrix_ring_bottom
shift: [hole5_x, hole5_y]
params:
hole_size: standoff_size
hole_drill: standoff_size
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment