Custom atomic keyboard

Hag.com

05 Feb 2017, 22:25

Hello everybody! After been built for around two years, my custom keyboard is finally done and good to share. I apologize for my bad english in advance..

About the board:
The layout is homemade to have the programming symbols accessable without fn-layers (on a swedish keyboard, stuff like [ and ] is hidden under ctrl+alt, making it hard to type without moving the hands out of position). A numpad is hidden in the "lower"-layer, straigt under the right hand. I also run dworak, but switched after I had got the printed keycaps so they are still qwerty.

The hardware is (mostly) ergo clears, because browns was out of stock by the point of ordering everything. The caps are custom printed at wasdkeyboards to fit the layout. The matrix is hand-soldered (as you can see) and it has removable usb cable.

The case is also homemade in oak. I made two different sizes of wrist rests as I didn't know which would fit me best and after testing them I think the larger one feels better but the smaller is looking better. Both the case and the rests has neodym-magnets in them, making the rest snap in position and following the board if it's moved. Lovely!

I also sewed a felt case to it. The rests donesn't fit into it unfortunately, but I'll make a new one for one of them so it donesn't get damaged as I bring it to school.

The overall impression of it is "quite good", but not as perfect as I would like it. I've ordered new caps to test DSA profile but I would gess that I can't resist buying an ergodox sometime in the future.

I hope you'll like it! :)



Image

Image

Image

Image

Image
Just got a pack of blank DSA from SP as well. First it wasn't that nice to type on I thought, but the more I use them the more i like them. :)

Image

Image

Image

Image


Image

Image
Image
With the dvorak layout!

Image

Image

User avatar
CeeSA

05 Feb 2017, 22:42

I like it, very nice matrix keyboard!

User avatar
ideus

05 Feb 2017, 23:47

How different is to type on this matrix instead of doing it on a traditional staggered keyboard?

User avatar
Hlogooo

06 Feb 2017, 04:36

A loyal wood lover :)

Hag.com

06 Feb 2017, 08:41

CeeSA wrote: I like it, very nice matrix keyboard!
Thanks!
ideus wrote: How different is to type on this matrix instead of doing it on a traditional staggered keyboard?
Not especially at all I would say. Took me maybe 2 days of typing to get used to enough to hit the keys instead of between them. Then dvorak was harder to get into the muscle memory, around 3-4 months. But as I'm studying engineering, I don't write that much text so if you do type much it would take less time.
Hlogooo wrote: A loyal wood lover :)
Oh yes! :)

User avatar
cookie

06 Feb 2017, 09:38

This is the spirit, and the original reason why I joined the club!

Great work and thank you for sharing!

Spok

06 Feb 2017, 10:36

Nice keyboard. What finish did you use on the wood ?

User avatar
Scarpia

06 Feb 2017, 11:29

That's a wonderful board! Congrats!

Being the cranky old UX fart that I am, I can't help but approach any custom layout with a long mental checklist of usability considerations that people keep forgetting (shift key positioning, 'touch-seekability' of keys, etc.), and the longer I look at this, the more great design choices I discover:
  • Gorgeous no-bullshit woodwork with elegant mitered corners. The clearance to the plate is soooo tight.
  • Deviating from the ortho grid on the bottom row is inspired!
  • Using the CapsLock key position for a 'lower' modifier - clever choice for a numkeyless layout!
  • The 2u RShift, Enter and BSpc keys offset horisontally gives you a nicely 'feelable' right hand side that allows you to add both function and arrow keys there without the "ocean of 1u keys" problem that many ortholinear layouts suffer from
  • Not to mention your modified 'ANSI SE' style which seems like just the thing for coding. Ballsy yet pragmatic! Love it!
I think the only thing I would change is I'd have included a quarter- or half-unit groove between the alphas and the top row to make the transition detectable to the touch - but that's just me, because I can't keep my fingers on home row so I'm floating a bit too much to handle four rows of ortholinear 1u keys (and I can't always reliably detect the higher profile of the top row in the heat of the moment).

One question though: How did you code the custom layout? Of course one way to do it is with a key mapping app on the computer, but I've been dreaming of an in-keyboard remapper, though I'm not sure how well it would work. How did you do it?

User avatar
beltet

06 Feb 2017, 15:50

Great work! Looks really good! But I think I would have problem with the straight matrix.
Btw what firmware are you using and how did you do so that you get the "programming" keys in the first later?

Hag.com

06 Feb 2017, 21:00

cookie wrote: This is the spirit, and the original reason why I joined the club!

Great work and thank you for sharing!
Thanks a lot!
Spok wrote: Nice keyboard. What finish did you use on the wood ?
It's some kind of stain with the color "antique oak". I really like the brown-greyish it gives the wood. The top layer is a product directly translated to "hard wax oil" or something similar.

Scarpia wrote: That's a wonderful board! Congrats!

Being the cranky old UX fart that I am, I can't help but approach any custom layout with a long mental checklist of usability considerations that people keep forgetting (shift key positioning, 'touch-seekability' of keys, etc.), and the longer I look at this, the more great design choices I discover:
  • Gorgeous no-bullshit woodwork with elegant mitered corners. The clearance to the plate is soooo tight.
  • Deviating from the ortho grid on the bottom row is inspired!
  • Using the CapsLock key position for a 'lower' modifier - clever choice for a numkeyless layout!
  • The 2u RShift, Enter and BSpc keys offset horisontally gives you a nicely 'feelable' right hand side that allows you to add both function and arrow keys there without the "ocean of 1u keys" problem that many ortholinear layouts suffer from
  • Not to mention your modified 'ANSI SE' style which seems like just the thing for coding. Ballsy yet pragmatic! Love it!
I think the only thing I would change is I'd have included a quarter- or half-unit groove between the alphas and the top row to make the transition detectable to the touch - but that's just me, because I can't keep my fingers on home row so I'm floating a bit too much to handle four rows of ortholinear 1u keys (and I can't always reliably detect the higher profile of the top row in the heat of the moment).

One question though: How did you code the custom layout? Of course one way to do it is with a key mapping app on the computer, but I've been dreaming of an in-keyboard remapper, though I'm not sure how well it would work. How did you do it?

Oh lord, that's really a high grade! Glad you enjoy it and thanks a lot! However, I can't take credit for everything you seem to like with the build.

The plate is bought finished from OLKB.com so the position and sizes of the keys are not my design even though it's nice indeed. That plate (called atomic) however seems to not have been very popular and can't be bought any longer. Pity, especially for me as it makes it really hard to find nice caps for the whole board for a reasonable price.

The layout of what every button should do I can take credit for although, like the caps-positioned lower. I personally almost never use caps lock, so using that space, which is really close to my fingers as they rest on the home row seems like just a waste of a good button.

Making a short space between the top row and the rest I don't think I would have done evet if I'd designed the plate myself, but as you say it's quite personal and I move my hands wery slightly as I type. It's almost only the fingert that move, the palm is resting on the palm rest without moving and then I think it would be better to have shorter distance to the top row than spacing it for more physical feedback of where on the keyboard you have your fingers. But I can admit that it could have been looking good at least. :)

For the programming, see below.


edit: Oh, and forgot, what does UX stand for?
beltet wrote: Great work! Looks really good! But I think I would have problem with the straight matrix.
Btw what firmware are you using and how did you do so that you get the "programming" keys in the first later?
I used a teensy 2.0 and TMK to program the board. To edit TMK for my pinout I followed Matt3os firmware guide ( workshop-f7/how-to-build-your-very-own- ... t7177.html).

I haven't got everything to working exactly as I would have liked it to do, for example I would have wanted to use the shift keys to switch between the first and secondary symbols printed on the caps. After much thinking I can get it to work as that by setting the shift keys to both switch layers and send shift keystroke, but then any keys held in on the previous layer is released again, which not is ideal when you play games and use wasd to move for example. Now I have almost reconciled with having the lower key working as layer shift key for the symbols too, I don't even know what I'd use those keys for together with lower if I could. But it still grinds my gears that I couldn't get it to work exactly as I wanted to.

To make the programming symbols in the base layers in TMK I used fn actions built in the firmware. With FN keys I can assign a key to apply a modifier and send a keystroke at the same time, making the computer to fire a symbol or whatever combination you've assigned. So it's asmost as a short macro key, but it's quite expensive as there is a maximum number of 32 fn key actions and you need them to switch layers and do stuff like that too.

There is also QMK firmware which is a further development of TMK whick have the symbols built in as unique keycodes so the need of occupying FN actions for shift layers for them is removed. I've programmed the layout using qmk too, but the issue with get shift to work as both shift and layer switcher is still a problem. Also, if you wand a swedish layout, some symbols is fired by pushing right alt or ctrl+left alt, and the symbol actions in qmk is only designed for the english layout which only use shift as layer shifter button (at least thats my conclusion), making the need to still use some fn key actions to apply the right modifier to get the programming signs together with the computer set to use the swedish layout. So QMK didn't add that much advantage what I found.

(More curiosities about my mapping: Holding down the escape key will make it work as a layer switch too, and then I've mapped the F1-F12 keys in the "numpad" instead. And lower + A will switch the alpha layout used between dvorak and qwerty, quite useful as all games is designed for qwerty. :) )

Another flaws I found that I can't really work around is using key combinations to set default layout, as shifting between dvorak and qwerty. Using lower and escape key to temporary set a layer as long as that key is pressed works fine, but set a new layer as default is quite glitchy. I would say that it's less than 50% chanse to toggle between qwerty and dvorak as I use it now, but if you're determined enough you'll always success after a number of attempts and when you've got the right layer active as default, it works just as it should on that layer.


Sorry for wall of text but now you at least have quite much information about it! :D Just ask again if there is something else you wonder!
Last edited by Hag.com on 06 Feb 2017, 21:51, edited 1 time in total.

Hag.com

06 Feb 2017, 21:07

Here is my keymap from TMK, included quite much unnecessary stuff left since I've tested different solutions to the problems I've experienced. Eg the last layer and the macro stuff at the end is totallyl unused and not sure if it even work. Haven't taken the time to clean the code up as it works as it is. :oops:

Code: Select all

    #include "keymap_common.h"




    const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    KEYMAP( FN1,  MPLY, MPRV, MNXT, MUTE, VOLD, VOLU, FN10, FN11, FN12, FN13, FN14, FN15,       BSPC, \
			TAB,  LBRC, QUOT, SCLN, P,    Y,    F,    G,    C,    R,    L,    COMM, FN18, NUHS, DEL,  \
			FN0,  A,    O,    E,    U,    I,    D,    H,    T,    N,    S,    SLSH,       ENT,  PGUP, \
			LSFT, DOT,  Q,    J,    K,    X,    B,    M,    W,    V,    Z,          RSFT, UP,   PGDN,  \
			LCTL, LGUI, LALT,             SPC,                          FN4,  FN2,  LEFT, DOWN, RIGHT),
 
	KEYMAP( FN1,  MPLY, MPRV, MNXT, MUTE, VOLD, VOLU, FN10, FN11, FN12,  FN13, FN14, FN15,       BSPC, \
			TAB,  Q,    W,    E,    R,    T,    Y,    U,    I,    O,    P,    LBRC, FN18, NUHS, DEL,  \
			FN0,  A,    S,    D,    F,    G,    H,    J,    K,    L,    SCLN, QUOT,       ENT,  PGUP, \
			LSFT, Z,    X,    C,    V,    B,    N,    M,    COMM, DOT,  SLSH,       RSFT, UP,   PGDN,  \
			LCTL, LGUI, LALT,             SPC,                          FN4,  FN2,  LEFT, DOWN, RIGHT),

		
	KEYMAP( TRNS, FN29, FN3,  FN20, FN19, FN21, FN22, FN23, FN24, FN25, FN26, PPLS, PAST,       TRNS, \
            TRNS, FN16, FN27, RBRC, EQL,  TRNS, TRNS, 7,    8,    9,    PAST, NUBS, FN28, FN30, TRNS, \
            TRNS, FN6,  TRNS, GRV,  TRNS, TRNS, COMM, 4,    5,    6,    PPLS, TRNS,       TRNS, PGUP, \
            TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, DOT,  1,    2,    3,    PMNS,       TRNS, TRNS, PGDN, \
            TRNS, TRNS, TRNS,             0,                            TRNS, LCTL, TRNS, TRNS, TRNS), 

    KEYMAP( TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, F10,  F11,  F12,  TRNS, TRNS, TRNS,       TRNS, \
            TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, F7,   F8,   F9,   TRNS, TRNS, TRNS, TRNS, TRNS, \
            TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, F4,   F5,   F6,   TRNS, TRNS,       TRNS, PGUP, \
            TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, F1,   F2,   F3,   TRNS,       TRNS, TRNS, PGDN, \
            TRNS, TRNS, TRNS,             TRNS,                         FN17, LCTL, TRNS, TRNS, TRNS), 

    KEYMAP( TRNS, TRNS, TRNS, 3,    2,    5,    6,    7,    8,    9,    TRNS, PPLS, PAST,       TRNS, \
            TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, NUBS, TRNS, \
            TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,       TRNS, TRNS, \
            TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,       TRNS, TRNS, TRNS, \
            TRNS, TRNS, TRNS,             TRNS,                         TRNS, TRNS, TRNS, TRNS, TRNS), 

	
    };
/*
	enum macro_id {
		MACRO_1,
	};*/

	const uint16_t PROGMEM fn_actions[] = {
	[0] = ACTION_LAYER_MOMENTARY(2),             // Enable numpad
	[1] = ACTION_LAYER_TAP(3, KC_ESC),           // Enable F-button layer
	[2] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_END),
	[3] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT, KC_2),
	[4] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_HOME),
	//[5] = ACTION_LAYER_MODS(4, MOD_LSFT),
	//[6] = ACTION_MACRO(MACRO_1), // TEST MACROS 
	[6] = ACTION_LAYER_TOGGLE(1),                // Change layout
	//[7] = ACTION_LAYER_ON(1, false),
	//[8] = ACTION_LAYER_OFF(1, false),
	//[9] = ACTION_MODS_KEY(MOD_RSFT, KC_RBRC),
	[10] = ACTION_MODS_KEY(MOD_LSFT, KC_7),
	[11] = ACTION_MODS_KEY(MOD_LSFT, KC_8),
	[12] = ACTION_MODS_KEY(MOD_LSFT, KC_9),
	[13] = ACTION_MODS_KEY(MOD_LSFT, KC_0),
	[14] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),
	[15] = ACTION_MODS_KEY(MOD_LSFT, KC_1),
	[16] = ACTION_MODS_KEY(MOD_RALT, KC_MINS),
	[17] = ACTION_MODS_KEY(MOD_LALT, KC_F4),
	[18] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM),
	[19] = ACTION_MODS_KEY(MOD_LSFT, KC_2),
	[20] = ACTION_MODS_KEY(MOD_LSFT, KC_3),
	[21] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
	[22] = ACTION_MODS_KEY(MOD_LSFT, KC_6),
	[23] = ACTION_MODS_KEY(MOD_RALT, KC_7),
	[24] = ACTION_MODS_KEY(MOD_RALT, KC_8),
	[25] = ACTION_MODS_KEY(MOD_RALT, KC_9),
	[26] = ACTION_MODS_KEY(MOD_RALT, KC_0),
	[27] = ACTION_MODS_KEY(MOD_RALT, KC_RBRC),
	[28] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),
	[29] = ACTION_MODS_KEY(MOD_RALT, KC_NUBS),
    [30] = ACTION_MODS_KEY(MOD_LSFT, KC_NUBS)
    };
	/*
	const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
	{
		switch (id) {
		case MACRO_1: 
			return(record->event.pressed ?
				MACRO(U(LSHIFT), W(30), D(RALT), D(8), W(30), END) :
				MACRO(U(8), U(RALT), END)); 
		}
		return MACRO_NONE;
	}
	*/

User avatar
Scarpia

06 Feb 2017, 22:32

Hag.com wrote: edit: Oh, and forgot, what does UX stand for?
User eXperience - it's the bastard child of User Interface Design and Human Interaction Design, sort of. It's also a terrible abbreviation.
Hag.com wrote: I haven't got everything to working exactly as I would have liked it to do, for example I would have wanted to use the shift keys to switch between the first and secondary symbols printed on the caps. After much thinking I can get it to work as that by setting the shift keys to both switch layers and send shift keystroke, but then any keys held in on the previous layer is released again, which not is ideal when you play games and use wasd to move for example.
Ah, so it is as I feared. From my own experiments with the TMK firmware I came to the same conclusion, that the only way to get completely custom keys is through macros injecting the needed modifiers, which would disrupt the 'normal' expected behavior of the shift keys. If only we could add a new keyboard layout to the standards bodies (ANSI-Scandinavia?) with a handful of extra keycodes for our country-specific keys...

User avatar
t!ng
Awake Sheep

07 Feb 2017, 10:30

I like how you included Home, End and the Delete key. I always miss those on 60%s.

Hag.com

07 Feb 2017, 22:19

Scarpia wrote: User eXperience - it's the bastard child of User Interface Design and Human Interaction Design, sort of. It's also a terrible abbreviation.
Oh, I see. I find it quite interesting how the keyboards of our time is designed, the more I look at them the more anti user friendly it seems to be. Qwerty, staggered keys, modifiers far away from everything else, both thumbs practically only used for space, etc.
Scarpia wrote: Ah, so it is as I feared. From my own experiments with the TMK firmware I came to the same conclusion, that the only way to get completely custom keys is through macros injecting the needed modifiers, which would disrupt the 'normal' expected behavior of the shift keys. If only we could add a new keyboard layout to the standards bodies (ANSI-Scandinavia?) with a handful of extra keycodes for our country-specific keys...
That's sad to hear, I'd silently hoped that there would be someone out there who knew what the issue was and how to solve it. But hearing that others also concluded the same thing is sad. :( There ought to be more people out there with the same issue.
Hm, I'm not sure I understand what you mean with adding a new layout to a standard body. I can's see how it would be bad, but neighter the real gain from it. If you'd want to just send a specific keycode, like a country-specific letter, shouldn't that be able to do with the macro functions typing a alt+numpad sequence to insert that keycode? There would still be quite big issues with the shift key in combination with it, but I neither can see how adding some country-specific keycodes would solve it. Or did you meant something other?
Rewriting a keyboard firmware is quite far over my current programming skills, but who knows, I have quite a while left of my education (electrical engineering) so maybe in the future I would be able to do something like that. It would be epic, I really should take more courses of close to hardware programming...
t!ng wrote: I like how you included Home, End and the Delete key. I always miss those on 60%s.
Yes, those would be quite tough to miss, as well as pg up and down in my opinion. Actually I've replaced the home and end buttons with page up and down and put home and end on the blank keys between the arrows and space, which made more sense when using the board, so neither they are missing. :)

Hak Foo

08 Feb 2017, 06:00

With the Soarer firmware, there's an explicit "save the modifier status" and "restore the modifiers" command you cn pout into macros. Do the other firmwares have something similar?

User avatar
Scarpia

08 Feb 2017, 09:17

Hak Foo wrote: With the Soarer firmware, there's an explicit "save the modifier status" and "restore the modifiers" command you cn pout into macros. Do the other firmwares have something similar?
Now that's interesting! I haven't played with Soarer's firmware at all, but that might just work.

User avatar
PollandAkuma

15 Feb 2017, 00:48

Beautiful case! Shame about the DE ;P

Post Reply

Return to “Gallery”