diff --git a/ergogen/config.yaml b/ergogen/config.yaml index bc0e5d6..d499794 100644 --- a/ergogen/config.yaml +++ b/ergogen/config.yaml @@ -8,7 +8,7 @@ meta: # Required version of Ergogen engine: "4.1.0" # Version of the board - version: "1.1" + version: "1.2" author: binaryDiv # Define units and default values used throughout this file @@ -30,13 +30,13 @@ units: $default_padding: cy # Vertical offset between function key row and main zone - function_offset: 3 + function_row_offset: 3 - # Horizontal offset/gap between function key groups (Esc, F1-F4, F5-F8, F9-F12) - function_gap: 6 - - # Distance between left and right half of the main zone - split_gap_width: 2cx + 3 + # Outline border (border between keys and PCB edge) + border_left: -6 + border_right: 6 + border_top: 5 + border_bottom: -4 # Radius of rotary encoder knob (just for visualization) rotary_encoder_radius: 10 @@ -62,132 +62,118 @@ points: # Modifier row (Ctrl etc., but excluding the thumb keys) mods: row_net: ROW1 - led_next_key: "{{zone.name}}_{{neighbor_col_left}}_{{row}}" + led_next_key: "{{zone.name}}_{{neighbor_col_right}}_{{row}}" + tags: [ is_key, flip_led ] # Bottom letter row bottom: row_net: ROW2 - led_next_key: "{{zone.name}}_{{neighbor_col_right}}_{{row}}" - tags: [ is_key, flip_led ] + led_next_key: "{{zone.name}}_{{neighbor_col_left}}_{{row}}" # Home letter row home: row_net: ROW3 - led_next_key: "{{zone.name}}_{{neighbor_col_left}}_{{row}}" + led_next_key: "{{zone.name}}_{{neighbor_col_right}}_{{row}}" + tags: [ is_key, flip_led ] # Top letter row top: row_net: ROW4 - led_next_key: "{{zone.name}}_{{neighbor_col_right}}_{{row}}" - tags: [ is_key, flip_led ] + led_next_key: "{{zone.name}}_{{neighbor_col_left}}_{{row}}" # Number row numbers: row_net: ROW5 - led_next_key: "{{zone.name}}_{{neighbor_col_left}}_{{row}}" + led_next_key: "{{zone.name}}_{{neighbor_col_right}}_{{row}}" + tags: [ is_key, flip_led ] # Key columns (from left to right) columns: - # Left-most column (extra keys) + # Left-most column (`, Tab, Shift, etc.) left: key.column_net: COL1 - key.neighbor_col_right: zero - rows.numbers.led_next_key: main_left_top - rows.home.led_next_key: main_left_bottom - # Use placeholder to mark end of the RGB LED chain (unused net name) - rows.mods.led_next_key: END_OF_CHAIN - # Modifier column (`, Tab, Shift, etc.) - zero: - key.stagger: 1/8cy - key.column_net: COL2 - key.neighbor_col_left: left key.neighbor_col_right: one + rows.top.led_next_key: main_left_home + rows.bottom.led_next_key: main_left_mods # First letter column (1, Q) one: - key.stagger: 1/8cy - key.column_net: COL3 - key.neighbor_col_left: zero + key.column_net: COL2 + key.neighbor_col_left: left key.neighbor_col_right: two + rows.mods.led_next_key: thumb_one # Second letter column (2, W) two: - key.stagger: 1/8cy - key.column_net: COL4 + key.column_net: COL3 key.neighbor_col_left: one key.neighbor_col_right: three rows.mods.skip: true # Third letter column (3, E) three: - key.column_net: COL5 + key.column_net: COL4 key.neighbor_col_left: two key.neighbor_col_right: four rows.mods.skip: true # Fourth letter column (4, R) four: - key.stagger: -(1/4cy) - key.column_net: COL6 + key.column_net: COL5 key.neighbor_col_left: three key.neighbor_col_right: five rows.mods.skip: true # Fifth letter column (5, T) five: - key.stagger: -(1/4cy) - key.column_net: COL7 + key.column_net: COL6 key.neighbor_col_left: four key.neighbor_col_right: six - rows.top.led_next_key: arrow_keys_up - rows.bottom.led_next_key: arrow_keys_down rows.mods.skip: true - - # (Gap with arrow keys in the middle: Matrix column 8) - # Sixth letter column (6, Y) six: - key.spread: cx + split_gap_width - key.column_net: COL9 + key.column_net: COL7 key.neighbor_col_left: five key.neighbor_col_right: seven - rows.home.led_next_key: arrow_keys_right rows.mods.skip: true # Seventh letter column (7, U) seven: - key.stagger: 1/4cy - key.column_net: COL10 + key.column_net: COL8 key.neighbor_col_left: six key.neighbor_col_right: eight rows.mods.skip: true # Eighth letter column (8, I) eight: - key.stagger: 1/4cy - key.column_net: COL11 + key.column_net: COL9 key.neighbor_col_left: seven key.neighbor_col_right: nine rows.mods.skip: true # Nineth letter column (9, O) nine: - key.column_net: COL12 + key.column_net: COL10 key.neighbor_col_left: eight key.neighbor_col_right: ten rows.mods.skip: true # Tenth letter column (0, P) ten: - key.stagger: -(1/8cy) - key.column_net: COL13 + key.column_net: COL11 key.neighbor_col_left: nine key.neighbor_col_right: eleven - rows.mods.led_next_key: mirror_thumb_one # Eleventh letter column (-, [) eleven: - key.stagger: -(1/8cy) - key.column_net: COL14 + key.column_net: COL12 key.neighbor_col_left: ten key.neighbor_col_right: twelve # Twelfth letter column (=, ]) twelve: - key.stagger: -(1/8cy) - key.column_net: COL15 + key.column_net: COL13 key.neighbor_col_left: eleven - rows.top.led_next_key: main_twelve_home - rows.bottom.led_next_key: main_twelve_mods + key.neighbor_col_right: right + rows.numbers.led_next_key: main_right_top + # Right-most column (Enter, Shift etc.) + right: + key.column_net: COL14 + key.neighbor_col_left: twelve + # Skip right-most key in numbers row because that wouldn't fit with the controller board + rows.numbers.skip: true + rows.home.led_next_key: main_right_bottom + # Use placeholder to mark end of the RGB LED chain (unused net name) + rows.mods.led_next_key: END_OF_CHAIN # Thumb fan thumb: @@ -199,224 +185,137 @@ points: # Zone-wide key settings key: row_net: ROW1 + tags: [ is_key, flip_led ] # Rotate the thumb keys around the bottom-left corner of the key origin: [ -0.5cx, -0.5cy ] - splay: -6 + splay: -4 # Define thumb keys columns: one: - key.column_net: COL4 - key.mirror.column_net: COL12 - key.led_next_key: main_one_mods - key.mirror.led_next_key: mirror_thumb_two - two: - key.column_net: COL5 - key.mirror.column_net: COL11 - key.led_next_key: thumb_one - key.mirror.led_next_key: mirror_thumb_three - three: - key.column_net: COL6 + key.column_net: COL3 key.mirror.column_net: COL10 key.led_next_key: thumb_two - key.mirror.led_next_key: mirror_thumb_four - four: - key.column_net: COL7 + key.mirror.led_next_key: main_ten_mods + two: + key.column_net: COL4 key.mirror.column_net: COL9 key.led_next_key: thumb_three - key.mirror.led_next_key: thumb_center + key.mirror.led_next_key: mirror_thumb_one + three: + key.column_net: COL5 + key.mirror.column_net: COL8 + key.led_next_key: thumb_center + key.mirror.led_next_key: mirror_thumb_two # Mirror the thumb fan mirror: ref: main_five_bottom shift: [ 0.5cx, 0.5cy ] - distance: split_gap_width - # Single key centered between thumb keys + # Single key centered between thumb keys (space key) thumb_center: anchor: # Center between the two inner thumb keys aggregate.parts: - - thumb_four - - mirror_thumb_four - shift: [ 0, -0.25cy ] + - thumb_three + - mirror_thumb_three + shift: [ 0, -0.125cy ] # Key settings (instead of rows/columns) key: width: 1.5kcx row_net: ROW1 - column_net: COL8 - led_next_key: thumb_four - tags: [ is_key, 1_5u ] - - # Arrow keys in the middle of the keyboard - # In the matrix, these keys act as 4 keys in a single column (column 8, row 2 to 5) - arrow_keys: - anchor: - # Center between the V and B keys, then shift down half a key - aggregate.parts: - - main_five_bottom - - main_six_bottom - shift: [ 0, -cy/2 ] - - # Assign all keys to the same column - key: - column_net: COL8 - - rows: - # Bottom row: Only the down key - bottom: - row_net: ROW2 - tags: [ is_key, flip_led ] - - # Center row: Left and right keys (shifted to the left to center them) - center: - adjust.shift: [ -cx/2, 0 ] - # Use ROW3 for the left key and ROW5 for the right key (overridden in columns) - row_net: ROW3 - - # Top row: Only the up key - top: - row_net: ROW4 - tags: [ is_key, flip_led ] - - columns: - # Left column: Up, left, down keys - left: - rows.top: - name: arrow_keys_up - led_next_key: main_six_top - rows.center: - name: arrow_keys_left - led_next_key: main_five_home - rows.bottom: - name: arrow_keys_down - led_next_key: main_six_bottom - - # Right column: Only right key (assigned to matrix row 5) - right: - rows.top.skip: true - rows.center: - name: arrow_keys_right - row_net: ROW5 - led_next_key: arrow_keys_left - rows.bottom.skip: true + column_net: COL6 + led_next_key: mirror_thumb_three + tags: [ is_key, flip_led, 1_5u ] # Function key row above the main zone (Esc, F1-F12) function: - # Position function key row above main zone with 3mm of vertical offset + # Position function key row above main zone with a vertical offset anchor: - # To center the F keys on the top of the keyboard: - # - Get center point between keys 3 and 8 (they have the highest staggering) - # - Shift upwards by one key + an offset to have a small gap - # - Shift to the left by 7 keys (Esc, F1-F6) + the gaps between the F key groups. - aggregate.parts: - - main_three_numbers - - main_eight_numbers - shift: [ -6.5cx - 2 * function_gap, cy + function_offset ] + ref: main_left_numbers + shift: [ 0, cy + function_row_offset ] # Single row zone: Assign row net key: row_net: ROW6 - tags: [ is_key, flip_led ] # Define function keys columns: # Escape key esc: - key.shift: [ 0, -cy/8 ] key.column_net: COL1 - key.led_next_key: function_f1 - # Esc is the first key in the RGB LED chain. - # The first LED needs to run on a lower voltage (see explanation below). - key.led_vcc_net: VCC_first_led + key.led_next_key: main_left_numbers - # Block of 4 keys with gap + # F1 to F12 keys f1: - key.spread: cx + function_gap key.column_net: COL2 - key.led_next_key: function_f2 + key.led_next_key: function_esc f2: key.column_net: COL3 - key.led_next_key: function_f3 + key.led_next_key: function_f1 f3: key.column_net: COL4 - key.led_next_key: function_f4 + key.led_next_key: function_f2 f4: key.column_net: COL5 - key.led_next_key: function_f5 - - # Block of 4 keys with gap + key.led_next_key: function_f3 f5: - key.spread: cx + function_gap key.column_net: COL6 - key.led_next_key: function_f6 + key.led_next_key: function_f4 f6: key.column_net: COL7 - key.led_next_key: function_f7 - # Skip matrix column 8 (arrow keys) + key.led_next_key: function_f5 f7: - key.column_net: COL9 - key.led_next_key: function_f8 + key.column_net: COL8 + key.led_next_key: function_f6 f8: - key.column_net: COL10 - key.led_next_key: function_f9 - - # Block of 4 keys with gap + key.column_net: COL9 + key.led_next_key: function_f7 f9: - key.spread: cx + function_gap - key.column_net: COL11 - key.led_next_key: function_f10 + key.column_net: COL10 + key.led_next_key: function_f8 f10: - key.column_net: COL12 - key.led_next_key: function_f11 + key.column_net: COL11 + key.led_next_key: function_f9 f11: - key.column_net: COL13 - key.led_next_key: function_f12 + key.column_net: COL12 + key.led_next_key: function_f10 f12: - key.column_net: COL14 - key.led_next_key: main_twelve_numbers - - # RP2040 Pico Mini controller board - controller: - anchor: - # Place in the center of the keyboard, above the arrow keys - aggregate.parts: - - main_five_numbers - - main_six_numbers - shift: [ 0, 1.5 ] - - # This is an auxiliary point to place the controller, not an actual key - key: - tags: [ is_controller ] - width: 18 - height: 36 - - # Rotary encoder in the center of the keyboard (on top of the controller board) - rotary_center: - anchor: - ref: controller - rotate: -90 - key: - tags: [ is_rotary_encoder ] - width: 2 * rotary_encoder_radius - height: 2 * rotary_encoder_radius - # Matrix position of the switch: between F7 and F8 - row_net: ROW6 - column_net: COL8 + key.column_net: COL13 + key.led_next_key: function_f11 + # F12 is the first key in the RGB LED chain. + # The first LED needs to run on a lower voltage (see explanation below). + key.led_vcc_net: VCC_first_led # Rotary encoder in the top right corner of the keyboard rotary_top_right: anchor: ref: function_f12 - shift: [ cx + 2 + function_gap, -cy/8 ] + shift: [ cx + 3, 0 ] + rotate: 90 key: tags: [ is_rotary_encoder ] width: 2 * rotary_encoder_radius height: 2 * rotary_encoder_radius # Matrix position of the switch: Function row, right of F12 row_net: ROW6 - column_net: COL15 + column_net: COL14 + + # RP2040 Pico Mini controller board + controller: + anchor: + # Place in top-right corner (right to F12, with rotary encoder on top) + - ref: rotary_top_right + affect: xy + - shift: [ 0, -0.5cy + 2.5 ] + + # This is an auxiliary point to place the controller, not an actual key + key: + tags: [ is_controller ] + width: 18 + height: 36 # Generate outlines that can be used in the PCB and for 3D models outlines: @@ -447,58 +346,45 @@ outlines: - what: polygon points: # Top left corner - - ref: &corner_top_left_anchor - - ref: main_left_numbers - affect: x - - ref: function_f1 - affect: y - - shift: [ -0.5kcx, 0.5kcy ] - # Extend all corners 4mm to the sides to get a 4mm border - shift: [ -4, 4 ] + - ref: + - ref: function_esc + shift: [ -0.5kcx, 0.5kcy ] + # Extend all corners to the sides to get a border + shift: [ border_left, border_top ] # Top right corner - - ref: &corner_top_right_anchor - - ref: main_twelve_numbers + - ref: + - ref: main_right_top affect: x - ref: function_f12 affect: y - shift: [ 0.5kcx, 0.5kcy ] - shift: [ 4, 4 ] + shift: [ border_right, border_top ] # Bottom right corner - ref: - - ref: main_twelve_mods + - ref: main_right_mods shift: [ 0.5kcx, -0.5kcy ] - shift: [ 4, -4 ] + shift: [ border_right, border_bottom ] - # Bottom center-right corner (below thumb keys) + # Bottom center "corner" below space key (needs to be post-processed in KiCad to get a smooth arc, see below!) - ref: - - ref: mirror_thumb_four - shift: [ 0.5kcx, -0.5kcy ] - # Discard the rotation, so the next shift moves the corner straight down - affect: xy - shift: [ 0, -4 ] - - # Bottom center-left corner (below thumb keys) - - ref: - - ref: thumb_four - shift: [ 0.5kcx, -0.5kcy ] - # Discard the rotation, so the next shift moves the corner straight down - affect: xy - shift: [ 0, -4 ] + - ref: thumb_center + shift: [ 0, -0.5kcy ] + shift: [ 0, border_bottom ] # Bottom left corner - ref: - ref: main_left_mods shift: [ -0.5kcx, -0.5kcy ] - shift: [ -4, -4 ] + shift: [ border_left, border_bottom ] - # Round off the corners with an 8mm radius fillet. + # Round off the corners with a fillet. # NOTE: To get a smoother arc on the bottom of the board, do some post-processing in KiCad: - # 1. Remove the bottom center line and the two small fillet arcs next to it. + # 1. Remove the tiny fillet arc between the two diagonal bottom lines. # 2. Select the two remaining bottom lines. Right click them and use "Shape Modification -> Extend Lines to Meet". - # 3. Right click the two angled lines again. Use "Shape Modification -> Fillet Lines..." with a 200mm radius. - fillet: 8 + # 3. Right click the two angled lines again. Use "Shape Modification -> Fillet Lines..." with a 300mm radius. + fillet: 5 # Preview version of board with key caps and components for visualization board_preview: @@ -546,8 +432,8 @@ pcbs: orientation: down # Use 5V from USB as VCC net 5V: VCC - # RGB LEDs: The chain starts with the Esc key - GP29: led_din_function_esc + # RGB LEDs: The chain starts with the F12 key + GP29: led_din_function_f12 # Matrix columns GP27: COL1 GP26: COL2 @@ -555,27 +441,24 @@ pcbs: GP23: COL4 GP22: COL5 GP21: COL6 - GP20: COL7 - GP17: COL8 # Center column (arrow keys) - GP12: COL9 - GP11: COL10 - GP10: COL11 - GP9: COL12 - GP8: COL13 - GP7: COL14 - GP6: COL15 + GP18: COL7 + GP17: COL8 + GP13: COL9 + GP12: COL10 + GP11: COL11 + GP10: COL12 + GP9: COL13 + GP8: COL14 # Matrix rows - GP13: ROW1 - GP14: ROW2 - GP19: ROW3 - GP18: ROW4 - GP15: ROW5 + GP0: ROW1 + GP1: ROW2 + GP2: ROW3 + GP3: ROW4 + GP19: ROW5 GP28: ROW6 - # Rotary encoders - GP0: rotary_top_right_a - GP1: rotary_top_right_b - GP3: rotary_center_a - GP2: rotary_center_b + # Rotary encoder + GP6: rotary_top_right_a + GP7: rotary_top_right_b choc_hotswap: what: choc_pretty @@ -663,75 +546,100 @@ pcbs: # the signal of the RP2040 is strong enough. first_led_voltage_diode: what: diode_smd - where: function_esc + where: function_f12 adjust: - shift: [ 10, 1.5] - rotate: -90 + shift: [ 0, 8 ] + rotate: 0 params: side: B from: VCC to: VCC_first_led - # Mounting holes: Top left and right corners + # Mounting holes: Top row (above and between Esc/F1, F4/F5, F8/F9, F12/rotary) + mounting_hole_top1: + what: mountinghole_m2 + where: + ref: function_f1 + shift: [ -0.5cx, 0.5cy + 1.5 ] + + mounting_hole_top2: + what: mountinghole_m2 + where: + ref: function_f5 + shift: [ -0.5cx, 0.5cy + 1.5 ] + + mounting_hole_top3: + what: mountinghole_m2 + where: + ref: function_f8 + shift: [ 0.5cx, 0.5cy + 1.5 ] + + mounting_hole_top4: + what: mountinghole_m2 + where: + ref: function_f12 + shift: [ 0.5cx - 1, 0.5cy + 1.5 ] + + # Mounting holes: Top left corner (left of Esc) mounting_hole_top_left: what: mountinghole_m2 where: - ref: *corner_top_left_anchor - shift: [ 2, -2 ] + ref: function_esc + shift: [ -12, 0 ] + # Mounting holes: "Top" right corner (right edge, below the controller board) mounting_hole_top_right: what: mountinghole_m2 where: - ref: *corner_top_right_anchor - shift: [ -2, -2 ] + ref: main_right_top + shift: [ 0.5cx - 0.5, 0.5cy + 1.25 ] - # Mounting holes: Top center, left and right of the controller - mounting_hole_controller_left: - what: mountinghole_m2 - where: - ref: main_five_numbers - shift: [ 0, 12 ] - - mounting_hole_controller_right: - what: mountinghole_m2 - where: - ref: main_six_numbers - shift: [ 0, 12 ] - - # Mounting holes: Bottom center, under columns five/six (but above the thumb keys) + # Mounting holes: Bottom center, below C and N keys (with copyright text in between) mounting_hole_bottom_center_left: what: mountinghole_m2 where: - ref: main_five_bottom - shift: [ 0, -13 ] + ref: main_four_bottom + shift: [ 4, -12.25 ] mounting_hole_bottom_center_right: what: mountinghole_m2 where: - ref: main_six_bottom - shift: [ 0, -13 ] + ref: main_seven_bottom + shift: [ -4, -12.25 ] - # Mounting holes: Bottom left and right corners, under the second key columns - mounting_hole_bottom_left: + # Mounting holes: Bottom left corner (left of Ctrl; below left thumb keys) + mounting_hole_bottom_left1: what: mountinghole_m2 where: - ref: main_zero_mods - shift: [ 0, -13.5 ] + ref: main_one_mods + shift: [ 0.5cx, -11.75 ] - mounting_hole_bottom_right: + mounting_hole_bottom_left2: what: mountinghole_m2 where: - ref: main_eleven_mods - shift: [ 0, -13.5 ] + ref: main_left_mods + shift: [ -12, 0 ] + + # Mounting holes: Bottom right corner (right of bottom-right key; below right thumb keys) + mounting_hole_bottom_right1: + what: mountinghole_m2 + where: + ref: main_twelve_mods + shift: [ -0.5cx, -11.75 ] + + mounting_hole_bottom_right2: + what: mountinghole_m2 + where: + ref: main_right_mods + shift: [ 12, 0 ] # Render text with project name and copyright onto the PCB copyright_text: what: text where: - ref: thumb_one - shift: [ 0, -16.5 ] - rotate: -0.3 # total rotation: -6.3 (including key rotation) + ref: thumb_center + shift: [ 0, 13.25 ] params: text: |- - eepyBoard v1.1 by binaryDiv + eepyBoard v1.2 by binaryDiv (c) 2024 (MIT License)