40 comments

[ 0.23 ms ] story [ 110 ms ] thread
Nice work. Now, if only OLED or LCD push buttons were widely available so we could change the logos on the fly...

PS. Ye cannae be a 'bit unique' ;-)

This was the dream of mine when seeing the Optimus Maximus keyboard years ago... I saw a feature where every button was just an LCD display.
Have you heard of the stream deck?
I have a stream deck and it's pretty cool as a macropad, but I'm hoping they're working on at least a 60% keyboard. The keys they use on the macropads would be pretty awful to type on, so it will take some work, but I hope they can do it.

Art Lebedev had the popularis keyboard which is basically what a stream deck keyboard would be like: https://www.artlebedev.com/optimus/popularis/

Also, Lebedev's Aux concept from 2008 is basically what the stream deck is.

I played with an Optimus Maximus once (Booz Allen Hamilton had one), and it was beautiful; however it wasn't particularly nice to type on.

(comment deleted)
FYI, the code is difficult to read, at least on FireFox. It shows as black text on a gray background.
Looks ok for me (Firefox 81 on Linux): https://i.imgur.com/7Pxmwyn.png
Firefox 81 on Mac: https://imgur.com/a/JQGcfTQ Does not look good.

It has something to do with the custom font. If I disable "font-family: AdobeSourceCodePro, monospace" the colors appear: https://imgur.com/a/mcUX5XD

Looks like it's https://bugzilla.mozilla.org/show_bug.cgi?id=1520157:

I think basically what's happening here is that the font includes some SVG glyphs (for a bunch of emoji, no doubt). This causes us to render it via a "color font" codepath, and color fonts ignore the CSS color property as the glyphs are painted with their inherent colors instead.

But in this case many (most) of the glyphs do not actually have color versions, and so they simply paint as black. We need to be making the decision whether to paint "as a color font" (ignoring CSS color) on a per-glyph basis, not per-font-run, so that glyphs without inherent color don't just default to all-black all the time.

I'm amazed that a standard keyboard build still targets the Pro Micro. Here is a build tutorial from 2012. 1Up (used in the article) is certainly more cost effective ($9) than SparkFun ($18).

https://www.sparkfun.com/tutorials/337

I have made a few custom keyboards with the stm32f103 ("bluepill"). You can get a 5 pack for $10. You get more IO pins and you don't need to suffer through anything Arduino-related. The starter kits often include an ST-LINK clone that makes flashing much easier than dealing with bootloaders and USB serial connections. (I use a j-link, but both are fine.) It is, of course, supported by QMK.

If you want to go even cheaper for a 4x4 macro pad, you can just hand-wire the thing and not buy a circuit board. I hand-wired a full keyboard and while it was not the quickest task in the world, it also wasn't that bad. Kind of relaxing. You also don't need to go overboard with mechanical supports for the keyswitches; I just 3D-printed a platform that the keyswitches slot into.

Basically, if you happen to have some magnet wire, a microcontroller, and some Cherry clones sitting around... you can make yourself a keyboard. (Diodes are nice, but you probably don't need n-key rollover on a macro pad.)

5V Pro Micro clones from China used to be $1/ea. That was what people were using when lots of guides and builds were written.
What are these used for exactly? They seem like they'd slow you down as opposed to just using a regular keyboard with software macros or a fancy keyboard with macro support.
Controlling scenes while live streaming (e.g. live / "AFK" / switch to "I'm dead" mode during multiplayer live stream / ...) is the most common use case for this type of keyboard I'm aware of. It's much less error prone than pressing a shortcut since it's a single button press. One of the most common commercial product for this particular use case is Elgato Stream Deck.
The biggest use I've seen is four-key and awkward three-key shortcuts in software where one hand is occupied with another device (generally a digitizer stylus, but it could be any controller or mouse). A macro keypad can be extremely handy when editing photos, for instance. Not everything one does with a computer can be done effectively with two hands on the keyboard.
I'm considering building one of these.

I optimize my keyboard to programming. I already have a second layer for programming specific functions. I could add a third, but it's more mental load. It's not worth it.

Things that I'd put onto this:

* Mute/Unmute for Zoom * Screenshot key * Bind to a few key apps so I can switch between them quickly * Media and volume keys (so I can use a smaller keyboard, but have these within react) * A few emojis just for fun. * I'd likely have a toggle so it could serve as a num pad

what programming specific macros do you use?
I removed caps lock and changed it to a layer modifier. Then I mapped symbols and arrows to the home row on the second layer (in fact, numbers too).

caps + a => !, caps + s => @, etc. Brackets and underscores are extremely convenient to have on the home row. I also have these mapped to convenient positions "=>" and "() => {}"

Finally, I have arrows mapped to u, i, o, and p. Really, really nice for hopping one or two characters without having to shift my hands too far.

Having your ten most important keystrokes right next to each other with a cute icon, especially useful if the actual hotkey involves a couple of meta keys, or if you have multi-key sequences you regularly need to hit.

Working in situations where a full keyboard doesn’t work, I did this with a remapped numpad when I was playing with using a Surface to let me get art done in Illustrator on the bus.

Any time you want some specific even with very high accuracy. Shortcut combos don't always work/trigger at the right time/in the right focus context. Or if you have a QMK with altogether too many virtual keys - I have like 60 x 7 layers = 420 possible two-thumb-one-finger events, I don't use them all but I still lose track. I'm thinking of building one of these for things like "jump focus to chat window and mute".

Also it saddens me we have a speaker mute keycode but no system-wide mute mic.

Not to dismiss someone's passion project, but every time I go into a thrift store or used electronics shop I see a couple of those usb numerical keypads for a few dollars (or buy one new for a $10 donation to the bezos fiefdom) - I assume there is software that could be used to re-route the number keypresses to run macros

edit - instructable for doing exactly that: https://www.instructables.com/Making-a-powerful-programmable...

Keyboard controllers are usually ROM (perhaps even fixed function, they certainly used to be) controllers, so these solutions are generally software macros, like the one you linked, which works for some things, but not others.
Right, but what's the difference? I.e. if the keyboard sends "9" but software captures that and sends out "cntrl-shift-3" it's the same outcome as if the keyboard sent "cntrl-shift-3" - is it not?

If we really want custom hardware involved, the most economical solution would probably be a USB repeater that did the re-interpreting in hardware.

Then keycode & keysym correspond to different characters (or whatever) and whether or not you get the desired outcome depends on the implementation of the software capturing it at any given time.

Took me a while to work out that the reason my pasted passwords would occasionally not work was the remapping of a couple of symbol keys. (I'm accustomed to a weird mashup of USA/UK layout, thanks mainly to Apple's non-standard 'UK' layout donating Americani?ms, but then useless prominent keys I swapped for something more helpful (backtick & pipe I think, off the top of my head, for things so useless that I literally never use them and don't know their names.))

What do you do when you want to type "9" though?
The software he mentioned stores macros for each keyboard. So you can still type 9 on your main keyboard.
This really only works in the most trivial of cases. There just isn't enough symbol-space information in a basic keyboard to be able to implement many QMK hallmarks like level shifting, chords, momentary hold effects, and taps.

I have thought about custom in-line hardware but that's honestly as complicated as QMK. Plus latency.

What I would love however is an inline monitor to see what keycodes I'm issuing. It gets...zany.

> What I would love however is an inline monitor to see what keycodes I'm issuing.

this is actually very simple to do with QMK if you have a board with an OLED display. it's also implemented in the default keymap for a bunch of the split ergo boards (Lily58 is one that has it)

Obvious problem: it depends on software. So this can't send privileged keystrokes, and doesn't work across operating systems. Some software intentionally ignores keyboard events sent by stuff like Autohotkey.
I went that route a while back and found a lot of weird little hitches. Keys that just wouldn’t remap and insisted on doing weird shit because of something set up in the factory ROM. Never mind the additional hassle of trying to get software to implement various layer swapping stuff if you want that - the QMK firmware has that built in.

Sure, you could just pull out the existing hardware and replace it. Sometimes it’s easier to just start from scratch though.

Here's a helpful little snippet for fellow QMK warriors:

  #define SEND(case_enum, string) \
     case case_enum:\
     if (record -> event.pressed) {\
        SEND_STRING(string);\
     }\
     return false;\
     break
Looking at the OP article, I don't know if the `return false;` is really necessary? I copied it from elsewhere.

This lets you just say `SEND(MIC_MUTE, SS_LCTL(SS_LALT(SS_LSFT(SS_TAP(X_F10))));` or what have you.

I left off the final semicolon because it looks more natural to me.

Looks useful!

Pro tip, as a professional C/C++ dev, for macros:

Wrap the body in a do-while loop, to force a semicolon after it’s called https://stackoverflow.com/questions/1067226/c-multi-line-mac...

That wouldn't work here (well it wouldn't without the return) as that would mean the break would apply to the loop and not the switch statement.

In genereal, I think hiding control flow in macros is a bad idea.

I really like projects like that.

Another way of getting to similar results without hardware hacking is via using midi controllers combined with software to translate midi messages to keystrokes (and/or macros).

I was thinking of doing something like this, connected with a small screen, and UART send/receive (because it's simple) - so that I could use it just to keep ibuffer in Emacs up and help me move through buffers.

...still need to do that project. Just a small, single use device to make my Emacs life easier.