Skip to content
This repository was archived by the owner on Mar 28, 2024. It is now read-only.

Commit 1e3fea4

Browse files
committed
Release version 1.0
1 parent 7ae9353 commit 1e3fea4

File tree

139 files changed

+19749
-3530
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

139 files changed

+19749
-3530
lines changed

CHANGELOG.md

+3-22
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,4 @@
1-
0.3.0 (2022-09-16)
2-
------------------
1+
1.0 (2023-10-04)
2+
----------------
33

4-
- Implement programmatic construction of 3D printable body
5-
- Revise layout and layers
6-
- Add negative tilt for better ergonomics
7-
- Remove middle arrow keys in favor of layering
8-
- Remove generated files from repository in favor of release downloads
9-
- Switch to the CERN-OHL-W license
10-
11-
0.2.0 (2020-10-12)
12-
------------------
13-
14-
- Extend finger plates towards the middle to simplify the body
15-
- Add tent crease between pinky and ring finger to reduce height
16-
- Revise layout and layers
17-
- Remove unnecessary middle keys
18-
- Use 1.25u caps for the thumbs to improve comfort and homing accuracy
19-
20-
0.1.0 (2020-07-02)
21-
------------------
22-
23-
- Initial laser-cut aluminium plates glued on hand-made cork body
4+
- First release

LICENSE.txt

+10
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
https://github.com/sevmeyer/chrumm-keyboard/
2+
___ _ _ ____ _ _ __ __ __ __
3+
.' __| |_| | _ '| | | | \/ | \/ |
4+
| |__| _ | |_) | |_| | |\/| | |\/| |
5+
'.___|_| |_|_| \_\.___.|_| |_|_| |_|
6+
7+
Copyright 2023 Severin Meyer
8+
Licensed under CERN-OHL-W v2 or later
9+
10+
111
CERN Open Hardware Licence Version 2 - Weakly Reciprocal
212

313

README.md

+86-99
Original file line numberDiff line numberDiff line change
@@ -1,139 +1,126 @@
11
Chrumm keyboard
22
===============
33

4-
Chrumm is an ergonomic keyboard prototype, influenced by many
5-
open hardware projects of the mechanical keyboard community,
6-
including the [Ergodox], [Dactyl], [Sofle], [Pteron],
7-
and the works of [Bastardkb].
4+
Chrumm is an open-hardware ergonomic keyboard,
5+
made of a 3D-printable body, a bendable PCB,
6+
and custom firmware for the Raspberry Pi Pico.
87

9-
The default STL files can be downloaded from the [releases] page.
8+
This repository contains all relevant source files.
9+
The generated files can be downloaded from the [releases] page.
1010

11-
**Important:** This project is not yet complete.
12-
A PCB and new firmware is in the works.
13-
The default configuration may change.
11+
I share these files in the hope that they are useful, or
12+
at least interesting to others. Keep in mind that this is
13+
a free, do-it-yourself project. What you see is what you get.
14+
Make sure to check the license.
1415

15-
![Photo of the assembled body](images/body-outside.jpg)
16+
[releases]: https://github.com/sevmeyer/chrumm-keyboard/releases/
1617

17-
![Photo of the inside](images/body-inside.jpg)
18+
![Front view of the finished keyboard](images/front.jpg)
1819

19-
[Ergodox]: https://www.ergodox.io/
20-
[Dactyl]: https://github.com/adereth/dactyl-keyboard
21-
[Sofle]: https://github.com/josefadamcik/SofleKeyboard
22-
[Pteron]: https://github.com/FSund/pteron-keyboard
23-
[Bastardkb]: https://bastardkb.com/
24-
[releases]: https://github.com/sevmeyer/chrumm-keyboard/releases
25-
[firmware]: https://github.com/sevmeyer/chrumm-firmware
20+
![Inside view with installed electronics](images/inside.jpg)
2621

2722

2823
Features
2924
--------
3025

31-
- Reasonably standard layout
32-
- Columnar stagger
33-
- Integrated split, tent, and tilt angles
34-
- Separate tenting for fingers, pinky, and thumb
35-
- Narrow size to make room for the mouse
36-
- Firmly attached palm rests
37-
- Single body and controller
38-
- Central rotary encoder
39-
- Designed for FFF 3D printing
40-
- Parametric construction with Python
41-
42-
43-
Printing
44-
--------
45-
46-
I sliced the parts with [PrusaSlicer] and printed them on
47-
a Prusa Mini+ with PLA filament. Check the prusa directory
48-
for the configuration files. Other printers and filaments
49-
may require different settings.
50-
51-
[PrusaSlicer]: https://www.prusa3d.com/prusaslicer/
52-
53-
54-
#### Body
55-
56-
The body requires supports on the underside of the key plates,
57-
split brackets, encoder, and cable hook. The switch notches
58-
should print fine without supports.
26+
Chrumm features a column staggered layout with simple thumb clusters.
27+
The right side has an additional column, to better approximate
28+
the standard ANSI layout, and to provide dedicated arrow keys.
29+
A central encoder allows for rotational input.
5930

60-
- Layer height: 0.15mm
61-
- Perimeters: 2
62-
- Solid layers: 5 bottom, 5 top
63-
- Infill: 15% rectilinear
64-
- Aligned rectilinear top infill (looks nice)
31+
The body is a robust monoblock without visible screws. It has
32+
integrated split, tent, and tilt angles, similar to commercial
33+
ergonomic boards. The palm rests and the USB cable are firmly
34+
attached, so that everything can be moved around without hassle.
6535

66-
![Supported faces of left body](images/slicer-body.png)
36+
The STL files are generated programmatically, with a pure
37+
Python package that has no dependencies. They are optimized
38+
for FFF 3D printing. Most parts are printed sideways, to
39+
produce a smooth surface without the need of post-processing.
40+
Custom supports minimize the print time and filament cost.
6741

42+
The body houses two reversible, bendable, interconnected PCBs.
43+
They are powered by a Raspberry Pi Pico.
6844

69-
#### Floor
7045

71-
- Layer height: 0.2mm
72-
- Perimeters: 2
73-
- Solid layers: 4 bottom, 6 top
74-
- Infill: 15% rectilinear
75-
76-
77-
#### Palm rests
46+
Credit
47+
------
7848

79-
The palm rests should be printed sideways, with their inward
80-
side on the printbed. This ensures that the curved top shell
81-
is as smooth and robust as possible.
49+
Chrumm would not exist without the shared knowledge of the
50+
mechanical keyboard community.
8251

83-
- Layer height: 0.2mm
84-
- Perimeters: 3
85-
- Solid layers: 4 bottom, 0 top (rely on overlapping perimeters)
86-
- Infill: 15% gyroid (omnidirectional strength)
52+
I found inspiration on [Reddit], [KBD.news], [geekhack], and
53+
learned a lot from the [PCB guides] by ai03 and Ruiqi Mao, the
54+
[Keyboard posts] by Masterzen, and the [Matrix Help] by Dave Dribin.
8755

88-
![Sliced left palm rest](images/slicer-palm.png)
56+
The layout and body is influenced by projects like the [Ergodox],
57+
[Dactyl], [Sofle], [Pteron], and everything from [Bastardkb].
58+
I also used established open hardware repositories for reference,
59+
including the [UHK60], [Skeletyl], [Sofle], [Corne], and [Torn].
8960

61+
[Reddit]: https://old.reddit.com/r/ErgoMechKeyboards+MechanicalKeyboards/
62+
[KBD.news]: https://kbd.news/
63+
[geekhack]: https://geekhack.org
64+
[PCB guides]: https://wiki.ai03.com/books/pcb-design
65+
[Keyboard posts]: https://www.masterzen.fr/tag/#mechanical-keyboards
66+
[Matrix Help]: https://www.dribin.org/dave/keyboard/one_html/
67+
[Ergodox]: https://www.ergodox.io/
68+
[Dactyl]: https://github.com/adereth/dactyl-keyboard
69+
[Sofle]: https://github.com/josefadamcik/SofleKeyboard
70+
[Pteron]: https://github.com/FSund/pteron-keyboard
71+
[Bastardkb]: https://bastardkb.com/
72+
[UHK60]: https://github.com/UltimateHackingKeyboard/uhk60v1-electronics
73+
[Skeletyl]: https://github.com/Bastardkb/Skeletyl-PCB-plate
74+
[Corne]: https://github.com/foostan/crkbd
75+
[Torn]: https://github.com/rtitmuss/torn
9076

91-
#### Encoder knob
9277

93-
The encoder knob is printed upside down. It should be solid,
94-
without infill, to evenly distribute torsional stress.
78+
Layout
79+
------
9580

96-
- Layer height: 0.15mm
97-
- Perimeters: 99
81+
![Default logical layout with two layers](images/layout.svg)
9882

9983

100-
Assembly
84+
Material
10185
--------
10286

103-
Electronic parts:
104-
105-
- 72x MX compatible switch
106-
- 1x EC11 rotary encoder, 12.5x13.2mm, 15mm flatted shaft (D shape), M7 nut mount
107-
- Bourns PEC11R-4215F-N0024 (24 detents)
108-
- Bourns PEC11R-4115F-N0018 (18 detents)
109-
- Bourns PEC11R-4015F-N0024 (no detents)
110-
- ...
87+
Mechanical:
11188

112-
Assembly parts:
89+
- 12x Threaded insert, M3, 4mm hole diameter, max 5.7mm length
90+
- 12x Countersunk screw, M3, 8mm total length, ISO 10642
91+
- 7x Hex nut with nylon insert, M3, ISO 10511
92+
- 2x Hex nut with nylon insert, M2
93+
- 7x Socket head cap screw, M3, 8mm thread length, ISO 4762 (*)
94+
- 2x Socket head cap screw, M2, 6mm thread length, ISO 4762
95+
- 2x Ziptie, 2mm width, 1mm thickness
96+
- 14x 3M Bumpon SJ5302, hemispherical, 8mm diameter, 2mm height
97+
- 2x Artificial leather, ~190x130mm, max 1.2mm thickness
98+
- Glue for artificial leather on printed filament
11399

114-
- 12x Heat set insert, M3, 4mm length (not longer)
115-
- 12x Countersunk head screws, ISO 10642, M3, 6mm length
116-
- Zip ties, 2mm width, 1mm thick
117-
- Anti-slip rubber feet or foam layer
100+
Electronic:
118101

119-
Additional parts if the body is split:
102+
- 2x PCB
103+
- 1x Raspberry Pi Pico, SC0915, without pre-soldered headers
104+
- 1x USB cable, A to micro-B with small head, shielded, max 4mm diameter
105+
- 64x Diode, 1N4148, DO-35 through-hole format
106+
- 64x MX switch
107+
- 1x Bourns PEC11R-4215F-N0024 rotary encoder, 15mm flatted D-shaft
108+
- 1x TE Flexstrip FSN-22A-8, 0.1" pitch, 2" length, 8 conductors (**)
109+
- 1x TE Flexstrip FSN-22A-5, 0.1" pitch, 2" length, 5 conductors (**)
110+
- 1x TE Flexstrip FSN-23A-3, 0.1" pitch, 3" length, 3 conductors (**)
120111

121-
- 5x Nylon insert locknut, ISO 10511, M3
122-
- 5x Button head screws, ISO 7380-1, M3, 8mm length
112+
(*) Some of the screws are difficult to reach and
113+
require a ball-point driver, or a short-armed key.
123114

124-
Note that the tenting of the body makes it difficult
125-
to reach the button head screws in a straight line.
126-
Use a ball-point driver, or a short-armed key.
115+
(**) It might be cheaper to buy strips with
116+
more conductors and cut them apart as needed.
127117

128118

129-
Layout
119+
Images
130120
------
131121

132-
![Default key layout](images/layout-default.svg)
122+
![Print and assembly of the body](images/body.jpg)
133123

134-
For the thumb clusters, I recommend upside-down, 1.25u,
135-
bottom-row caps from a cylindrical profile (Cherry, OEM).
136-
With a bit of improvisation, the caps can be sourced from
137-
a single tenkeyless (TKL) set:
124+
![Palm rests wrapped with artificial leather](images/palms.jpg)
138125

139-
![Keycap allocation](images/layout-caps.svg)
126+
![Preparation and installation of the PCB](images/pcb.jpg)

source/.flake8 body/.flake8

File renamed without changes.

.gitignore body/.gitignore

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
__pycache__/
22
*.py[cod]
3-
43
*.3mf
5-
*.gcode
64
*.stl
7-
*.zip
5+
*.kicad_mod

body/README.md

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
Chrumm keyboard STL generator
2+
=============================
3+
4+
The STL files are generated with the `chrumm` package for Python 3.7+.
5+
It has no dependencies and does not need to be compiled or installed.
6+
Run it as a command-line tool from this directory:
7+
8+
python3 -m chrumm --help
9+
10+
To generate the default STL files:
11+
12+
python3 -m chrumm chrumm.json
13+
14+
To speed up the triangulation during development:
15+
16+
python3 -m chrumm chrumm.json draft.json
17+
18+
19+
Parameters
20+
----------
21+
22+
The configuration parameters are provided via JSON files.
23+
If a parameter appears multiple times, then its latest value
24+
is used. Distances are given in millimeters, angles in degrees.
25+
26+
#### PCB compatibility
27+
28+
Unlike the body, the PCB is manually edited and not programmatic.
29+
Changes to the body parameters may not be compatible with the PCB.
30+
A flattened KiCad footprint (.kicad_mod) is generated to help with
31+
the placement of the switches and screws on the PCB.
32+
33+
#### Parameter validation
34+
35+
The generator does not validate all of the parameters.
36+
Most importantly, chamfers and switch notches are not
37+
taken into account when placing the walls. Make sure
38+
that the switch margin parameter provides enough room.
39+
40+
The generator should produce reasonable results for
41+
split, tent, and tilt angles up to about 20 degrees.
42+
Results may vary for more extreme angles.
43+
44+
#### Layout
45+
46+
The `layout.fingerStaggers` matrix represents the
47+
offset of each key relative to its ortholinear position.
48+
49+
The matrix is a list of rows. Each row contains four
50+
sublists, to represent the sections of the keyboard
51+
(left pinky, left alnum, right alnum, right pinky).
52+
Each section contains key offset coordinates.
53+
A coordinate can be an empty list (key omitted), a single
54+
number (y offset), or a list of two numbers (x and y offset).
55+
56+
Each section must have at least two key coordinates.
57+
All rows must have the same column structure.
58+
59+
#### Omit items
60+
61+
Chamfers can be turned off by setting them to `0`.
62+
The value of the following parameters can be set
63+
to `false` in order to omit them from the output:
64+
65+
bracket
66+
bumper
67+
cable
68+
encoder
69+
floor.hexHoles
70+
knob
71+
palm
72+
pcb
73+
pcb.mount
74+
support
75+
switch.clipNotch
76+
77+
78+
Print
79+
-----
80+
81+
I printed the parts on a Prusa Mini, with PLA filament,
82+
on a smooth PEI sheet. The gcode was generated with
83+
[PrusaSlicer] 2.6.0. The 3MF files with the exact settings
84+
are available on the [releases] page.
85+
86+
[PrusaSlicer]: https://www.prusa3d.com/prusaslicer/
87+
[releases]: https://github.com/sevmeyer/chrumm-keyboard/releases

0 commit comments

Comments
 (0)