This project is designed to replace all internal compoents of an IBM Model M keyboard. Only the curved steel backplate is needed for the PCB to be mounted on.
Typing test video: https://youtu.be/QOiLOHnEyzo
Image gallery: https://imgur.com/a/R9mSC4u
- Hotswap PCB for MX switches
- Multiple layout support, including ISO, split spacebar, and 4x5 numpad. KLE link
- PCB mount stabalizers
- Under-switch LED for caps, scroll, and num lock
- Supports up to 3 rotary encoders
- Piezo buzzer
- Solenoid
- USB-C support via STM32F411 Blackpill.
- Bluetooth support via PillBug.
- Vial firmware
- ZMK firmware (for BT PillBug)
There is a separate PCB that supports ortholinear layout. Details are located here: Ortholinear Edition
The following is a table of measurements of everything that's stacked on top of the steel backplate. The key spacing was taken from hires scans I made of the Model M's wiring membrane. I recalculated the spacing for each decrease in radius except for the foam where I reused the numbers from the switch plate. I was lazy and figured foam can stretch anyways.
Part | Thickness (mm) | Radius (mm) | Radius Start | 1u vertical spacing (mm) |
---|---|---|---|---|
Steel backplate | 1.0 | 276.635 | inner | 20.617 |
Hex Standoffs | 4.0 | n/a | n/a | n/a |
Mod Mmm PCB | 1.0 | 272.135 | center | 20.560 |
Plate Foam | 3.5 | n/a | n/a | n/a |
Switch Plate | 1.5 | 267.385 | center | 20.201 |
Part | Count | Notes |
---|---|---|
Mod Mmm PCB | 1 | 1mm FR4 thickness |
Mod Mmm Daughterboard | 1 | 1.2mm FR4 thickness |
Blackpill (STM32F411) | 1 | |
M2.5x3mm Wafer Screw | 116 | Link |
M2.5x4mm Hex Standoff | 58 | Link |
M2.5x5.5 Insulated Washer | 58 | Probably not needed (step 8). Link |
BAV70 Diodoe | 55 | Link |
Piezo Buzzer | 1 | Link |
5v Solenoid | 1 | Link |
Kailh Hotswap Sockets | 101 | More needed if non-ANSI layout |
FFC Cable (30 pos/1mm pitch) | 1 | Cable length: 30 inches Link |
FFC Connector (30 pos/1mm) | 2 | Link |
3mm LED (green) | 3 | For status panel. Link |
2mm LED (white) | 3 | For keycap status. Link |
470Ω Resistor | 3 | For panel LED |
10kΩ Resistor | 3 | For keycap LED |
22kΩ Resistor | 1 | Pullup for pin A10 |
TIP120 Transistor | 1 | For solenoid. Link |
1N4001 Diode | 1 | For solenoid. Comes with above kit |
2.2kΩ Resistor | 1 | For solenoid. Comes with above kit |
Mill-Max 310 sockets (1x20) | 2 | |
Mill-Max 310 sockets (1x4) | 1 | |
Mill-Max round pin (¼in) | 44 | Link |
2u plate mount stabalizer | 7 | Count varies based on layout |
7u plate mount stabalizer | 1 | For 7u spacebar |
EC11 Rotary Encoder | 3 | Optional Link |
Rotary Encoder Knob (17mm) | 3 | Optional Link |
Switch plate (9 piece set) | 1 | Optional 1.5mm acrylic |
Case foam (under PCB) | 1 | Optional 2mm EVA |
Plate Foam | 1 | Optional 3.5mm EVA foam (or 2mm + 1.5mm) |
For the Mill-Max 310 series low profile sockets, I found it more cost efficient to just buy a really long socket and cut the sizes I need with flush cutters. Here's an example of a 1x64 socket.. The only thing is that the edges are rough after the cut, but it doesn't bother me.
You can probably use others ways to mount the Blackpill. Just make sure that final height of the USB port is somewhat centered inside the case port.
To complete this build, you will need to get the main PCB and daughterboard manufactured. The main PCB will need to be 1mm thick FR4, and I made the daughterboard 1.2mm to match the thickness of the original one that came with the keyboard. I personally like using JLCPCB, so I've included a zip
file in the each respective directory that you can upload to their service if you decide to go with them. (FYI, you will need to order a minimum of 5 boards each).
The first step is to disassemble your Model M and clean it if neccessary. There are lots of tutorials online on how to do this, and make sure you have a 7/32 inch (5.5mm) socket for the case screws. I followed this one from YouTube: https://youtu.be/VsIr8dl_7Kk.
The hardest part is removing the plastic rivets that holds the frame assembly against the steel backplate. I used a razor blade with a few pieces of electrical tape wrapped around the back for better grip and for safety (to easily tell which is the sharp side). I would then rock the blade around a rivet in a "see-saw" motion while putting pressure on the blade until it popped off. It'd be a good idea to place some type of "backstop" like tall box to prevent the rivets from flying everywhere.
Using the hex standoffs and a few screws, mount the PCB onto the steel backplate for 24hrs. You only need enough screws & standoffs for the PCB to hold its shape. After you remove the PCB, you want there to be a slight curve to the FR4 before soldering on the components. This way, the componenets and solder joints experience less stress when the PCB is bent into its final shape.
Flip the PCB over to the backside and solder on the BAV70 diodes (D1 - D55). Place a dab of solder on the single bottom pad of the diode on the PCB. Then using tweesers, position the diode so that the legs line up with the pads. Then using the point of one tweeser leg, gently hold the top of the diode in place while melting the dab of solder that was placed on the bottom pad previously. With the diode now held in position, solder the top two legs to their respective pads.
Place some solder on one of the hot swap socket pads. There should be enough solder to make a small mound. Place the socket into position and melt the mound of solder that was previously added while pressing down on the center of the socket. Be sure to avoid touching any metalic parts to prevent burns. Keep the soldering iron on the pad long enough for the solder to flow around the socket connector (usually around 3 to 4 seconds). Now solder the other socket connector to the pad.
You can replace any of the keys in the Print Screen cluster with a rotary encoder. Just make sure you don't place a hotswap socket there, and solder in the EC11 encoder instead.
Also realized the logo on the back is way too busy. I've changed it to be a small logo on the front in v2, which is the current repo version.
These three LEDs go under the status panel (NUM1, CAP1, and SCRL1). The short pin of the LED goes in the square pad. As for the accompanying 470Ω resistors (R4, R5, and R6), orientation does not matter. The LEDs here can be soldered in with extra height so that they sit closer to the "window" cutout on the case. I mesaured the space between the PCB and the window to be 10mm.
These LEDs go under the caps lock, scroll lock, num lock switches. Depending on your switch, you may have to solder these in AFTER placing the switch into the socket. You can tell by looking under the switch to see if there's a hole big enough for the LED to fit through. If there are only 2 small holes for the LED pins, then the switch needs to go in first. The short pin of the LED goes in the square pad. As for the accompanying 10kΩ resistors (R1, R2, and R3), orientation does not matter.
I use a higher resistance here for the white LEDs because they tend to be too bright for me personally. Feel free to lower the resistance if you want them brighter, or if you choose a different color.
Install your stabalizers of choice onto the PCB. For the vertical stabs, in order to counteract the curvature of the PCB, I used adhesive stabalizer pads and cut them in half lengthwise (band-aids would work as well). I then placed them on the inside half of where the stabs would sit. The idea here is to angle the stabs back outwards so that they remain parallel.
Note that I made all the stab holes a tad larger in the vertical direction to allow for some wiggle room.
This can be a bit tricky to hand solder, so take it slow, and use plenty of flux. Place a dab of solder on one of the large pads on the side. Position the connector on top of the pads making sure that the small pins are centered relative to their respective pads. While holding the connector in place, melt the dab of solder that was placed earlier so that the one side is held in place. Now solder the other end of the connector so that it's held in position. Moving on to the the small pins, I initally tried "drag soldering", but I ended up bridging a lot of pins. If this happens, just clean it up with some solder wick.
I found that the better way to do this is to pull out the sharpest tip you have for your soldering iron, and placing a tiny dab of solder on each pad, while avoiding touching the adjacent pins with the iron tip. Again, make sure you use plenty of flux. This way, the solder will simply flow around the pin without bridging the neighboring pins.
There's probably other connectors out there that can do the same job at a cheaper price. I'm not an expert on FFC components, so all suggestions are welcome. (Same thing for the FFC cable)
Starting with the steel backplate, insert a screw from the back and screw a standoff on from the other side. Keep it loose enough so that the standoff can rattle around a bit. Do this for all the mount holes on the steel plate, even if you end up not using them because they're still good for support. Make note of the holes that are left open in my photo above (circled red) and do the same to prevent interference with the case/components. You should also put a standoff in corner top-right hole beneath the plastic post (circled green) for added support.
Slip the steel backplate back into the bottom of the case. You'll need to slide the bottom into the slots first, and then place the plastic case posts into the top-left and top-right corners of the steel backplate.
If you opted for the 2mm EVA case foam, you'll need to place it over the steel plate before installing the PCB. The holes in the foam should line up over the standoffs. (Filename: pcb/case-foam.ai
)
Line up the PCB over the holes and place 2 or 3 screws positioned horizontally from each other near the center of the PCB. Push the center firmly down onto the standoffs to force the PCB to bend (this part is a bit nerve racking, especialy when you hear creaking noises), and secure it with the screws while holding it in place.
Now place a switch and keycap combo at the corner of every section of the keyboard (ex: Esc, F1, ~, Ctrl, Print, Num-Lock, Num-Enter, etc). Put the top of the Model-M case on, making sure it's aligned and fully seated with no gaps. Carefully shift the PCB around slightly to get the keycaps to be in the correct position with equal amounts of spacing from the keycap to the case walls. Basically you're trying to center the PCB by eye-balling the keycap gaps.
With the PCB now centered, remove the top of the case and begin screwing in all the mounting screws. I'd suggest starting near the center and spiral outwards towards the edges. This is where you'll probably need to shift the loose standoffs around to line the holes up. Also, if you run into the problem where the top and bottom screws bump into each other inside the standoff, you'll need to add an insulated washer to the bottom screw. Place the top case back on every once in a while to make sure the PCB didn't shift and is still centered. After you're done, remove the steel backplate from the bottom of the case and tighten all the screws on the back. If you feel that the standoffs are just spinning while you're turning the screw, just squeeze the PCB and backplate together so that it pinches the standoff and keeps it from spinning.
NOTE: I noticed that the vertical 2u stabs in the numpad were blocking some of the screw holes in rev 1 of the PCB. I flipped the stabs in rev 2 which is the version in the repo.
Bend the narrow part of the pins on the TIP120 back towards the heatsink at a 90 degree angle. Solder it into place.
The 2.2k resistor goes into the R2.2 spot (orientation does not matter). The 1N4001 diode goes in to the 1N4001 position where the line matches the printed line on the board. The solenoid wires don't have an orientation, and you can solder them directly into the holes or use a header/connector.
In order to use pin A10 on the Blackpill, a 22k pullup resistor is needed (according to the QMK docs). Solder this into the R1 position. Orientation does not matter.
It's probably best to flash the firmware onto the Blackpill first using the bin
file in the firmware
directory. Hook it up to QMK Toolbox and push the following buttons to place it in bootloader mode before flashing:
- Press and hold the BOOT0 button
- Press and release NRST (reset) button
- Release BOOT0 button
Solder the Mill-Max 310 sockets onto the daughterboard. Then place a piece of masking tape over the pin holes, and insert each pin though the tape and into its hole with tweezers. Then set the Blackpill into place with the components facing up and the USB port facing the top of the daughterboard. Solder the pins into place, and then carefully and slowly remove the Blackpill. If you pull too fast and hard, one edge will suddenly pop loose, bending the pins on the opposite side. Remove the masking tape, and push the Blackpill back into place.
Lazy-man's short cut: skip the masking tape. But note that using too much solder will cause it to flow down the pin and into the socket. If this happens, the keyboard will still work, but you won't be able to remove the Blackpill without desoldering.
Solder this into the BZ1 position. Orientation does not matter.
Remove the steel backplate from the case if you haven't already. If you have a Model M that came with a smaller PCB, you will need to clip away the plastic bracket to make room for the larger footprint of the daughterboard. Make sure the clamp on the FFC connector is lifted up, insert the FFC cable, and press the clamp back down. Place the daughterboard into position inside the case bottom. I don't have a good way to secure it to the case (I'm reluctant to drill holes), so a piece of tape or double-sided adhesive foam will do for now.
Put the steel backplate with mounted PCB back into place, and connect the other end of the FFC cable to the main board. At this point, you can install your switches and keycaps, screw the case back together, and be done!
BUT, after some testing, I noticed that my Kailh Box White switches were not very stable. This is probably due to the fact they they were 3 pin switches instead of 5, and the hot swap sockets didn't grip the switch pins that tightly. This is why I opted to make a switch plate to better hold the switches in place. This also meant I had to cut 3.5mm thick foam (technically 2mm + 1.5mm) to act as a spacer between the PCB and the switch plate.
Unfortunately, there was not enough room in the case to house a single switch plate that spanned the entire board, so I had to break the plate up into smaller sections (9 total), which ended up working pretty well. The Esc key had its own little 1u switch plate, so the stability still wasn't great, but it'll have to do. I also messed up the foam spacing for the top row, so I had to cut it off as a separate piece. This is fixed in the repo version, which is in the case/plate-ansi_v2.ai
. Plates for other layouts need to be created.
During my testing, I found that the F row keys (especially the ESC key) were not very stable due to the switch plate being only 1u in height. To fix this, I decied to remove the 1.5mm foam under these keys, and replace it with a long strip of 1.5mm acrylic. I then used acrylic cement to glue the small switch plates to this strip, giving the entire top row some much needed support.
The layer in the plate file should be labeled F-row support
.
The easiest way to apply the acrylic cement (I use Weld-On #4) is to mount lay the 2mm foam down on top of the PCB, place the F-row support strip on top, the small switch plates on top of that, and finally install some switches to hold everything in place. Then using your needle tip applicator, run it along the top edge between the switch plate and support while using gravity to pull the cement into the gap. Then tilt your keyboard back so that the bottom edge is up, and do the same thing along the bottom edge, again using gravity to pull the cement into the gap.
Thanks to all the project/product creators who have inspired the creation of the Model Mmm:
- Model-H: Open source USB controller for the Model M
- Class 80 by MMStudio: Premium TKL retro-styled board with a solenoid and buzzer
- Command 65 by Play Keyboard: Retro-styled wireless keyboard with buzzer based off the Commodore 64