I wondered why traditional keyboard layouts don't allow thumb finger press more keys than just a Spacebar. Ctrl/Alt keys often are parts of useful shortcuts especially in different IDEs/advanced editors/terminal emulators etc.
And that's why I always wanted to find some way of pressing Ctrl/Alt key with thumbs. First decision was to use Apple keyboard (wired, without numpad block), it has short Spacebar and both command keys are accessible with thumbs. I set up remapping and it worked for me at first but then I decided to go further. And that's how I started making my prototype.
Main requirements were:
- Split design
- Symmetrical parts. Same positions have opposite roles (like del vs backspace)
- No stagger (just wanted to try that out and that looked easier for my project)
- Minimum differences from standard layout
- Pinky should press less keys
- Thumbs and index fingers press more
There was a spare Arduino board so I decided to use it as a controller.
I ordered blank key caps set (and few additional keys), cherry MX blue switches from WASD.
Constraints were:
- keycaps of regular sizes (WASD has only standard keys and each row has its own profile, so for example I could not order 1.25x for 3rd row)
- 64 keys (due to shift registers used)
- No fancy key placement, just keys organized in rows
- Homemade PCB
What I added is: [ and ] keys on different sides (not just right), += key in place of CapsLock (pretty frequent key as for programmer). Four keys for each thumb. And Since Cherry MX stems are plus signs I turned those four keys upside down for comfortable pressing.
I tried different designs but finally came up with this one (this is main layer): FN key turns second layer on. Main features here are:
- arrow keys instead of jkl and i.
- F1-F10 instead of 1-0
Since there are 64 keys I used 8x8 scanning matrix, that would require 16 free pins on Arduino.
I used two shift registers, 74HC164 and 74HC165, one for input (rows) another for setting a columns which is currently being scanned.
Arduino is driving them and outputs keypresses via USB to host (reprogrammed USB chip acts as USB keyboard)
Each half contains 4 rows by 8 columns so there are 12 wires attached to each board. Breadboard in the middle contains shift registers. and then only 7 wires go to arduino (3 for one register, 2 for another and vcc/gnd).
No problems with multiple pressed keys, 6KRO, Firmware actually remembers more than 6 presses but due to USB protocol limitation sends only last 6 pressed keys.
Next step is to make some case for it, just have to figure out how to do it better.
It would be nice to hear some ideas/suggestions.
PS. I'm using this keyboard right now