I've been designing my dream keyboard since mid last year, and after building two revisions, I think
the end game is in sight (famous last words?).
Project page:
https://promethium.keyboard.idThose are my design goals. Now I must say not everything is working perfectly for now.
Trackpoint click doesn't work over Bluetooth yet. Bluetooth in general is working decently when connection is really good, i.e. when used on top of a laptop. But, if signal is weak, the keyboard might hang after a few keystrokes.
I haven't verified battery indicator is working correctly.
Trackpoint is usable but a little flaky when using interrupts. Using busywait appears to fix the problem which indicates problem with interrupt version of PS2 support in QMK, but using busywait introduces all sort of other problems. Using USART is not an option as the clock pin is not broken out by the Adafruit controller.
Attachable palm rest is still under development.
Opensourcing the design is not done yet, will do that after some cleanups. Firmware is already part of QMK.
Warning: lots of pics follow.
Part 1:
More
This is the intended use case, to be used on top of laptops.
Of course it can be used 'normally' too.
Cross-sectional diagram of some of the components. The sandwich layers from top to bottom:
- faceplate: acrylic mirror, 3mm
- switch plate: aluminum plate, 1.5mm
- middle case: acrylic, 5mm
- middle plate: aluminum plate, 1.5mm
- bottom case: acrylic, 3mm
- bottom plate: aluminum plate, 1.5mm
6 layer of plates from laser cutting shop. One acrylic mirror, 3 aluminum plates, and 2 black acrylic plates.
Aluminum plates are going to be anodized for electrical insulation, as it will be really tight inside the keyboard.
All applicable screw holes are countersunk like this one.
Faceplate is an acrylic mirror sheet. Indicator legends are done by laser etching the reflective backing of the acrylic mirror, making the etched area transparent.
Reverse side of the etched acrylic mirror.
The Adafruit small White LED Backlight Module. Used here for logo lighting.
The Adafruit Backlight Module seen from reverse side. It is covered in electrical tape to prevent light from bleeding to the underside, and also to keep it in place while I'm working.
These switches will serve as Trackpoint buttons. Those are Zealio 78gs, same as with the rest of the keyboard.
Switch pins are bent because of the way I'm wiring. In my design there's only 5mm of clearance between switch plate and middle plate. With straight pins and without sacrificing features, the keyboard would need to be at least 2mm thicker.
Part 2
More
Trackpoint mounting screw holes. This should accommodate every Trackpoint module variations out there.
Ugly countersinking job there. Probably will need to use drill press on overlapping holes for more consistent result.
The Adafruit Feather 32u4 Bluefruit LE is installed. Using plastic nuts here, but they will be replaced by steel ones later. I find plastic nuts too weak to withstand the force from plugging and unplugging the MicroUSB connector.
A latching switch button. These are surprisingly rare and hard to find in this size. It is connected by a pair of magnet wire and routed to the bottom the plate using two holes I prepared before.
This is what it looks at the reverse side.
Trackpoint module is now installed, and covers the switch button holes, which is why I had to do the switch button first 😅.
The Trackpoint module is harvested from a used Thinkpad keyboard.
Both the Adafruit controller and Trackpoint module are firmly attached to the plate using bolts.
My 31337 soldering skillz. This is the bottom of Trackpoint module. I connected each pin using 32AWG magnet wire. I'm using the same magnet wire almost everywhere else.
External circuitry for the Trackpoint module. They are basically an RC circuit for Trackpoint reset pin, and two pull up resistors for communication.
These are put into a 3M foam double tape for preparation.
They are now placed on the plate. 3M foam double tape is awesome.
The Adafruit 32u4 works in 3.3V, but Trackpoint module and LED strip operate in 5V. So, we need these guys in red to convert voltages.
The right one is the Sparkfun 5V Step-Up breakout board, this will convert 3.3V and make 5V available to us. The left one is the Sparkfun Logic Level Converter.
The power lines are connected using thicker 26AWG magnet wire. I probably need to use thinner wires. 26AWG is too rigid that when something connected to it is loose, the wires would exert too much force on the solder connection points, making connection unreliable and harder to troubleshoot.
Part 3
More
The Adafruit 32u4 BLE doesn't have enough pins for my needs. So, I'm using a HC138 3-to-8 decoder to free up 5 pins, but firmware will require custom matrix later.
Wiring the HC138 is done. I find it easier to wire it up before I stick it to the plate.
The decoder is now attached to the plate using the 3M foam double tape.
This converts signal from 3.3V to 5V and back again. It sits between the Adafruit controller and Trackpoint module, and later the RGB LED strip bus.
The Adafruit LED backlight module is also now connected to 3.3V.
The Sparkfun step-up breakout board, now connected to 3.3V input, and outputs 5V.
Messy stuff.
Diodes for matrix. I curled up the ends so they would connect better with magnet wires. Solder seems to prefer sticking to diode pins compared to magnet wire by far.
These diodes are there to connect Trackpoint buttons and make the buttons available to the matrix. Diodes are required because the buttons are also connected to the Trackpoint module (they also need another set of diodes there).
This is useful for faux clicky, and to make middle button act as a layer switcher, which is realistic considering the usage pattern of the Trackpoint middle button.
One diode is connected to the wrong pin, it should have been pin 6, not 5.
Physically, the keyboard has 12×4 matrix. But I'm arranging the keyboard to use 6x8 matrix logically in order to conserve precious pins. The 8 rows are connected to HC138.
In order to conserve vertical space, diodes and wires are routed around empty space between switches.
Wiring the 3 pins from HC138 to the controller.
Part 4
More
The middle plate and a bunch of SK6812 mini RGB LED strip attached to it. Holes are there to allow Cherry switches to protrude, so we can have LEDs sit nearer to the switch and reduce overall height.
Some of you might notice that I have the switches put sideways. I arranged it that way so I don't have to connect more than 50 sets of pads. Now I can simply cut those in fours, and connect only about 15 of them. In other words I'm trading correct orientation of switches for my sanity 😅.
These LED strips are of 60 LEDs/m variety. They don't align perfectly with switches, but I don't mind. I wish they would make LED strips with the same spacing as keyboard keys.
WS2812 breakout board for indicator LEDs. WS2812s and SK6812minis are electrically compatible, so I can wire them in the same bus. Both GNDs seem to be already connected internally, so I don't have to make connection to one of it.
WS2812 boards are attached to the middle plate using 3M foam double tape.
Connecting RGB LED strip pads using magnet wire is a delicate business. They are only about 3mm wide. It took me maybe up to 30 minutes to connect a set of them.
WS2812 RGB LED strip breakout board, and a light cover to prevent light bleed to adjacent indicators. It is laser cut from a sheet of acrylic.
Testing RGB light strip using a Teensy and demo apps from the light_ws2812 library.
Indicator lights need some diffusion. Without diffusion they won't look as good.
Diffuser here is Rosco #3026. But diffuser can be easily obtained from everyday objects, like some plastic bag.
Light strip connection are complete. I keep the wires in place by paper adhesives.
I connected both ends of the RGB LED bus to Vcc and GND. So there are 2 lines of Vcc, 2 GNDs and 1 data, all routed to the bottom of the plate where they are connected to header pin receptacles.
This is the bottom view of the middle plate. There is piezo buzzer connected to header receptacles. The other 3 are connections from the RGB LED strip bus.
Part 5
More
I have a much bigger piezo buzzer on the other side. I plan only to use one of them, but need to hear which one sounds better.
Cables with male headers are used to connect components on switch plate and to those attached to middle plate. These cables are relatively huge, but I found magnet wires too fragile for this purpose. I need something that will last more than a few times of connection-disconnection routine.
These three cable are used to connect to the RGB LED strip. Later, I will add another pair for the piezo buzzer.
The black square thingy is the battery. It needs to be less than 3mm thick.
This turned out to be far more cramped than what I planned before. So I dremeled out some of the material from the bottom acrylic plate.
And the other side.
I have to redo the cable routing all over again if I have to reach the main chamber. And I did that OFTEN during development.
Bottom of the keyboard after assembly.
The four opposing holes are intended for 3rd party feet. So we got options for flat, positive inclination, negative inclination, or raised.
Top middle hole is the reset button hole.
Countersunk bolt in matching silver color next to a polyurethane feet.
Using black bolts on the darker colored faceplate.
This is an attachment point for palm rest, or at least it will be.
Notice the slot at the bottom of the case? That will be another palm rest attachment point. But that will have to come much later.
I'm using Suka's 3D printed Trackpoint extension. They are designed for older version of Trackpoint, and I prefer a newer version with metal plate, so I glued them together using cyanoacrylate glue. The top of the extension, though, is a perfect fit for Trackpoint cap.
Suka's extension comes with several different length of extension. Here I have the tallest keycap (SA), and the shortest (DSA) to see which Trackpoint height I prefer for both. Because the Trackpoint extension is glued, I don't have the option to change them afterwards.
Part 6
More
Trackpoint with cat's tongue cap.
Indicator LEDs. From left to right: battery level, capslock, GUI layer, function layer, number layer, punctuation layer, emoji layer, greek layer.
And the other side. From left to right: Linux/Apple/Windows Unicode input method, QWERTY or alternative layout, faux clicky, Bluetooth, USB.
Legends are a little off here, probably caused by some problems with laser cutting.
All indicator lights are on.
MicroUSB port from the controller. It is flush with the case, so any cable is compatible. The upper plate should not have the notch, but that will do for now.
Only 12.5mm from the bottom of the keyboard to switch plate. To put it into perspective:
- Whitefox: 12mm
- TEX aluminum case + Sentraq S60X plate: about 12.5mm
- Planck: 13mm
I can squeeze about 1mm of height if I use thinner aluminum for middle and bottom plates. But getting plates in two different thickness for small scale projects is not economical, at least from my perspective. Using thinner plates could mean some countersinking will need to extend to the acrylic parts.
It is probably possible to squeeze 0.5mm from the upper chamber if I can find acrylic sheets in 4.5mm thickness. If going that route, then it will be necessary to replace the 5mm M2 hex spacers with 4mm ones.
If a thinner battery is available, then it should be possible to reduce bottom chamber to match the thickness of the battery.
If thinness is paramount, then it is possible to forego battery and piezo buzzer; remove bottom chamber and make the middle plate the bottom plate. I can get 8mm bottom to switch plate thickness. And this is still not including the optimizations above. It may be necessary to remove the protruding JST-PH battery connector from the Adafruit controller, but if rubber feet are being used and they are in adequate height, then it might not be required.
The faceplate is 3mm in height, but it doesn't add to overall height (it sits on the switch plate). So, it is not critical to optimize thickness here, but thinner acrylic mirrors are available, though choices of colors are far more limited.
Keyset requirement is exactly the same as Planck, plus 3 1U keycaps for Trackpoint buttons.
There's an RGB LED under each switch, inclucing Trackpoint buttons. Switch LEDs and indicator LEDs are connected in a single WS2812/SK6812 bus.
Appearance can be easily customized by changing faceplate. This one is dressed with GMK Carbon keyset together with a matching faceplate.
Thanks for reading 😅