

Mission control
Modern replacement PCB for the IBM Model M 122
- Size
- 489.6 × 170.7 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 286
- Nets
- 175
- Pads
- 1,491
- Tracks, vias
- 2,121, 112
- Pours
- 1
- Routed
- Yes
- KiCad
- KiCad 7 (file 20221018)
- Created
- 8 Feb 2024
- Updated
- 19 Aug 2024
Overview
Mission control is an open-source printed circuit board by dcpedit, from the dcpedit/mission-control repository on GitHub, published under the CC-BY-4.0 licence. It is a 2-layer board of 489.6 × 170.7 mm with 286 parts on 175 nets, routed with 2,121 tracks and 112 vias.
It is built around the BAV70 and TIP120. Its parts include 64 diodes, 4 resistors, 2 connectors and 1 IC.
Main components
2BAV70
SOT-23-55℃~+150℃ 1 Pair Common Cathode 1.25V@150mA 2.5uA@70V 200mA 225mW 2A 6ns 70V SOT-23 Switching Diodes ROHSJiangsu Changjing Electronics Technology (CJ)Switching DiodesTIP120
TO-220-55℃~+150℃ 200uA 2V@3A,12mA 2W 5A 5V 60V NPN TO-220 Darlington Transistors ROHSJiangsu Changjing Electronics Technology (CJ)Darlington Transistors
README
README.md
Mission Control PCB for the IBM Model M122
This project is designed to replace all internal compoents of an Model M122 keyboard, and is based off my previous Mod Mmm Project. Only the curved steel backplate is needed for the PCB to be mounted on.

Image gallery: https://imgur.com/a/wuXMWVg
Features
- Hotswap sockets for MX switches
- Multiple layout support, including ISO, split spacebar, and 4x5 macropad for numpad. KLE link
- PCB mount stabilizers
- Under-switch LED for caps lock and num lock
- Piezo buzzer
- Solenoid
- LCD display
- USB-C support
- Bluetooth support (via PillBug)
- QMK/VIA firmware
- ZMK firmware (for BT PillBug)
The Build "Stack"
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 |
| 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 |
Parts List
| Part | Count | Notes |
|---|---|---|
| Mission Control PCB | 1 | 1mm FR4 thickness |
| Blackpill (STM32F411) | 1 | |
| M2.5x3mm Wafer Screw | 138 | Link |
| M2.5x4mm Hex Standoff | 69 | Link |
| BAV70 Diodoe | 64 | Link |
| Piezo Buzzer | 1 | Link |
| 5v Solenoid | 1 | Link |
| Hotswap Sockets | 108 - 115 | Recommend Gateron v2 |
| 2mm LED | 2 | For switch status led. Link |
| 10kΩ Resistor | 2 | For keycap LED. Smaller = brighter |
| 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 315 sockets (1x20) | 2 | |
| Mill-Max 315 sockets (1x4) | 1 | |
| Mill-Max round pin (¼in) | 44 | Link |
| 2u plate mount stabilizer | 7 - 10 | Count varies based on layout |
| 7u plate mount stabilizer | 1 | For 7u spacebar |
| Switch plate (5 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) |
| 2.2" ILI9341 display | 1 | Optional display, link |
| 8 pin headers (2.54mm pitch) | 2 | For optional display |
| 8 pin ribbon cable | 1 | For optional display |
| USB-C panel mount | 1 | Link |
For the Mill-Max 315 series 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.. Make sure to file down the rough edge after cutting.
PCB Build Guild
To complete this build, you will need to get the main PCB manufactured with an FR4 thickness of 1mm. I personally like using JLCPCB, and I've included the gerber zip in the pcb/production folder. (Note: you will need to order a minimum of 5 boards).
1) Disassembly
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.
Remove the plastic rivets on the back of the steel plate with a pair of flush cutters. Once this is done, all the components can be removed leaving just the steel plate.
2) Shape PCB
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.
3) BAV70 Diodes
Flip the PCB over to the backside and solder on the BAV70 diodes (D1 - D64). 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.
4) Hotswap Sockets
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.
5) 22k Pullup Resistor
In order to use pin A10 on the Blackpill, a 22k pullup resistor is needed (according to the QMK docs). Solder this into the R3 position. Orientation does not matter.
6) Blackpill Development Board
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 315 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.
Choose build option
At this point in the build, you will need to choose between ONE of the following 2 options.
Option #1: Solenoid, buzzer, and status LEDs
a) Solenoid Components
Bend the narrow part of the pins on the TIP120 back towards the heatsink at a 90 degree angle. Solder it into the TIP1 position.
The 2.2k resistor goes into the R4 spot (orientation does not matter). The 1N4001 diode goes in to the 1N1 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.
b) Piezo Buzzer
Solder this into the BZ1 position. Orientation does not matter.
c) Switch LEDs and resistors (optional)
These LEDs go under the caps lock and scroll 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 and R2), 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.
Option #2: LCD display
a) Display headers
Mount headers for on the PCB facing down (PCB position J1) and right angled headers on the display facing towards the right
b) Cut display window
Turn on your display, and measure the physical height and width of the display area. This will be the size of your case "window". Use masking tape to mark the edges of the window on the top of your case and cut the hole out.
I believe the best tool for this job is with a CNC router. Since I didn't have access to one, I first used a dremel with a cutting disk to cut the hole out. Then I smoothed the edges with a file, and then with fine grit sand sand paper wrapped around a flat piece of plastic. I found that adding a chamfered edge makes it look more "finished".
c) Mounting display
I found that the easiest thing to do here is to first connect the display to the PCB with the ribbon cable and power it up. Center the displayed image within the window, and while holding it firmly in place, place hot glue in each corner of the display's PCB, allowing some to flow through the mounting holes.
Continue with main build
7) Stabilizers
Install your stabilizers of choice onto the PCB. For the vertical stabs, in order to counteract the curvature of the PCB, I used adhesive stabilizer 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.
8) Install PCB standoffs
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. Omit any standoff that interferes with your stabilizers.
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.
9) Case foam (optional)
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: case/case-foam.ai)
10) Center and Install PCB
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.
Shift the steel backplate all the way to the top until it can't move anymore. This is the correct position of the plate, so I'd recommend wedging strips of 2mm foam between the case the bottom edge of the case.
Now place a switch and keycap combo at the corner of every section of the keyboard. Put the top of the 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.
Assembly photos
Firmware
Binaries are located in the firmware directory.
Source code is located in the missioncontrol branch of my QMK fork:
https://github.com/dcpedit/qmk_firmware/tree/mission-control/keyboards/dcpedit/missioncontrol
The LCD build requires it's own separate firmware because it uses the solenoid/buzz/LED pins.
Change graphic
Copy your 240x320 image (320x240 image rotated counter-clockwise 90 degrees) into the following QMK directory:
keyboards/dcpedit/missioncontrol/lcd/image/background.pngThen run the following command from that directory
qmk painter-convert-graphics -f rgb565 -i background.png -o ./That will generate a new *.c and *.h file. You can now compile the firmware:
make dcpedit/missioncontrol/lcd:viaParts
286| Qty | Value | Footprint | References |
|---|---|---|---|
| 115 | MX-NoLED | MX_Only:MXOnly-1U-Hotswap | MX000, MX001, MX002, MX003, MX004, MX005, MX006, MX007, MX009, MX012, MX013, MX014, MX015, MX016, MX017, MX018 +99 |
| 68 | MountingHole | MountingHole:MountingHole_3mm | H1, H2, H10, H11, H12, H13, H14, H15, H16, H17, H18, H19, H20, H21, H22, H23 +52 |
| 64 | BAV70 | Keebio-Parts:SOT-23_Handsoldering | D1, D2, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23 +48 |
| 6 | MX-NoLED | MX_Only:MXOnly-1.5U-Hotswap | MX031, MX061, MX064, MX117, MX131, MX133 |
| 2 | 470 | Keebio-Parts:Resistor-Hybrid-Back | R1, R2 |
| 2 | MX-NoLED | MX_Only:MXOnly-2U-Hotswap-ReversedVerticalStabilizers | MX089, MX109 |
| 2 | MX-NoLED | MX_Only:MXOnly-2.75U-Hotswap | MX062, MX127 |
| 2 | MX-NoLED | MX_Only:MXOnly-2.25U-Hotswap | MX047, MX051 |
| 2 | MX-NoLED | MX_Only:MXOnly-2U-Hotswap | MX063, MX066 |
| 1 | 10U | MX_Only:MXOnly-10U-Hotswap-ReversedStabilizers | 10U1 |
| 1 | 1N4001 | Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal | 1N1 |
| 1 | Buzzer | Buzzer_Beeper:Buzzer_TDK_PS1240P02BT_D12.2mm_H6.5mm | BZ1 |
| 1 | CaseHole | MountingHole:MountingHole_3mm | H69 |
| 1 | Conn_01x02_Female | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J2 |
| 1 | Conn_01x08_Socket | Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical | J1 |
| 1 | LOGO | mc:control | G*** |
| 1 | LOGO | mc:mission | G*** |
| 1 | LOGO | mc:mc-logo | G*** |
| 1 | MX-LED | MX_Only:MXOnly-1.25U-Hotswap-LED | MX041.125 |
| 1 | MX-LED | MX_Only:MXOnly-1U-Hotswap-LED | MX008 |
| 1 | MX-LED | MX_Only:MXOnly-1.75U | MX041 |
| 1 | MX-NoLED | MX_Only:MXOnly-7U-Hotswap | MX132 |
| 1 | MX-NoLED | MX_Only:MXOnly-2U-Hotswap-ReversedStabilizers | MX087.200 |
| 1 | MX-NoLED | MX_Only:MXOnly-1.75U-Hotswap | MX127.175 |
| 1 | MX-NoLED | MX_Only:MXOnly-ISO-Hotswap | MX047.200 |
| 1 | MX-NoLED | MX_Only:MXOnly-1.25U-Hotswap | MX051.125 |
| 1 | MX-NoLED | MX_Only:MXOnly-2.25U-Hotswap-ReversedStabilizers | MX132.225 |
| 1 | R_2.2K | Keebio-Parts:Resistor-Hybrid | R4 |
| 1 | R_22K | Keebio-Parts:Resistor-Hybrid | R3 |
| 1 | TIP120 | Package_TO_SOT_THT:TO-220-3_Vertical | TIP1 |
| 1 | YAAJ_WeAct_BlackPill_Part_Like_SWD_Breakout | Footprints:YAAJ_WeAct_BlackPill_SWD_2 | U1 |
| 1 | solenoid | redherring:solenoid | Solenoid |
Questions
How big is the Mission control PCB?
It measures 489.6 × 170.7 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Mission control use?
286 parts, built around the BAV70 and TIP120. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the Mission control KiCad files?
From the dcpedit/mission-control repository on GitHub, at the commit this page was made from: the board is pcb/pcb.kicad_pcb and its schematic pcb/pcb.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Mission control design in my own project?
Its repository publishes it under the CC-BY-4.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).
Similar boards
- 2 layers364.4 × 167.3 mm

- 2 layers148.8 × 132.2 mm

Usbflashprog
robsonsmartins/usbflashprog
A memory device programmer (Flash/EPROM/E2PROM) board and software, connected to PC by USB port.
125 parts36 - 2 layers168 × 123 mm

V2 - 2
RudgeLab/FluoPi
Code and teaching materials for UC/BackyardBrains raspberry pi "macro" scope.
131 parts26 - 2 layers

Catozap
jones139/catocam
Uses a custom trained YoloV8 model on a Raspberry Pi to Detect Cats in CCTV images and Unleash a Cat Deterrent
3 parts18GPL-3.0 - 2 layers32.5 × 21.2 mm

Taptap
dcpedit/taptap
TapTap is a solenoid breakout board for those who are interested in adding a solenoid to their existing project. All you need are the following components, and an extra data pin on your microcontroller.
9 parts13CC-BY-4.0 - 2 layers323.8 × 169.8 mm

- 2 layers57.1 × 102.9 mm

Synthwave
alexose/synthwave
An open-source experiment in carbon removal based on the electrochemical pH swing of seawater.
70 parts10CERN-OHL-P-2.0 - 2 layers423.3 × 249.2 mm

Ergodonk pico
JellyTitan/ErgoDonk
ErgoDox variant using standard SA keycaps, FDM case, and blackpill MCU
345 parts10MIT