DIY Splitkeyboard

DIY Splitkeyboard

Building a Custom Split Keyboard: From Concept to PCB

Overview

This project started since I wanted to try a splitkeyboard for a long time, but since they were pretty expensive in the past. I thought to myself why not use this as an opportunity to learn something new and create something I wanted to try for a long time. In addition I wanted to try an ortholinear for a change.

As a "proper" engineer I started with some research by looking what is available out there. I looked at some different design, like the ErgoTravel and what open source firmware I could use. Wirtting a complete new firmware would be way out of scope for this project. I settle on the QMK firmware together with an inexpensive STM32 MCU.

Why and What

The primary motivation was to move away from standard layouts and explore the world split keyboard. I wanted a board that utilized the Kailh Choc Tactile switches for a slim profile and tactile feedback and standard MX swtiches for compatibility reasons. You can not go wrong with MX switches.
By splitting the keyboard, I can position the halves at shoulder width to improve posture and play around with different keybaord angles (x and y direction of course)

The final key technical requirements included:

  • MCU: STM32F103C8 (Bluepill style but integrated on PCB)
  • Switches: Kailh Choc (Low Profile)
  • Connectivity: USB C for data and TRRS for the link between halves
  • Firmware: QMK with Serial Driver support
  • Features: RGB per key lighting (SK6812-EC1515)
  • Rotary Encoder for volume control

Planning and Designing

The design process involved bridging the gap between existing open source projects and my own requirements. Using the ErgoTravel and other keyboard that I can not remember anymore (I am sorry!) as a foundation. I wanted to have more keys accessible by my thumbs. Since I am using a german keyboard layout I wanted to have easy access to the different brackets [] and {} for programming.


One of the biggest challenges during the planning phase was the USB implementation for the STM32F103C8. Unlike some ATmega chips, the STM32 requires specific pin configurations and pull up resistors to be recognized correctly by a PC.

Version 1

The first iteration was about proof of concept. It focused on the core components: the MCU, the 27 keys per side, and the basic split functionality. The key layout and position was also a first test. It also feature a mirrored PCB design, which enables one PCB to be either the left or the right keyboard side. The keys are hot-swappable allowing for easy replacement and testing of different key switches.

  • Focus: Getting the STM32 to communicate over USB.
  • Learning: Navigating the bootloader states. Setting Boot0 and Boot1 correctly is vital for flashing. I eventually settled on the STM32duino bootloader to allow for easier flashing via USB.
  • I also figured out that the default STM32duino bootloader did not work with my hardware design, since I used a 16MHz high speed crystal. Therefore I had to compile the bootloader from scratch. I had to use the #define XTAL16M definition for the TARGET_GENERIC_F103_PC13. After flashing the resulting .bin file to the boards I was able to flash the qmk software. Side note: I had to create a VM with Ubuntu 16.04 to compile the bootloader successful, might be useful to know in the future. I believe the gcc version was causing issues on newer Ubuntu version that I used at the time.)
  • Firmware: Uploading and getting familiar with the QMK firmware and who the layouts are managed.
  • QMK supports automatic detection of the left/right keybaord half by setting SPLIT_HAND_PIN preprocessor to the dedicated input pin of the MCU. This allows to define two state in hardware by either pulling the pin LOW or HIGH. Each state represents left or right keyboard. Alternatively it is possible compile a binary for each of the halves by using these defines in the config.h file of the keybaord: #define MASTER_RIGHT or #define MASTER_LEFT

Issues

The biggest issue I had for the Version 1.0 were the missing 4.7k pull-ups on the USB Data lines. Without them the USB communication did not work.

Version 2

Version 2 aimed at refining the hardware. I changed the footprint of the keys to support either direct mounting or hot-swapping, while I kept the mirrored PCB design for reduced cost. I also modified the key switch placement and added one key column as can be seen in the pictures below

Issue

While the idea with supporting both directly soldering the key switches and hot-swappable capability sounds nice in theory in practice this did not really work out like I wanted it to. The keyboard layout still felt lacking to me, since I am used to a full sized keyboard with a num pad and additional function keys (I primarly use the Logitch G710+).

Version 3

This is where the project reached its current peak. I made several significant changes to the layout and functionality:

  • Layout: Rearranged keys to mimic the familiar feel of the Logitech G710+.
  • Numpad: Added a dedicated Numpad with its own USB C connection.
  • Integration: Designed the PCB so the left and right halves can be combined, although tight tolerances made this a mechanical challenge.

The assembly process had its hurdles. I realized halfway through that I had soldered every single diode in the wrong orientation. After some tedious desoldering and rework, the hardware was ready.

Left Splitkeyboard

Right Splitkeyboard

Numpad

I know that the silkscreen show V2.0, I am so sorry!

Firmware Implementation

With the hardware fixed, the focus shifted to QMK. I forked the original github repository and create my own custom QMK repository

Setting up the environment was straightforward:

python3 -m pip install --user qmk
qmk setup

Flashing the board required specific commands for the main halves:

qmk compile -kb splitkeyboard_v3 -km experimental
qmk flash -kb splitkeyboard_v3 -km experimental

and for the numpad:

qmk compile -kb splitkeyboard_v3_numpad -km experimental

Layout Splitkeyboard

QMK layout of the first layer

For the more specific of the configuration I strongly suggest reading the QMK documentation.

Images

Splitkeyboard V3.0 with kailh Choc Switches
Splitkeyboard V3.0 with MX Brown Switches

Outlook

The keyboard is now fully functional and showing up as a DFU device. However, the journey does not end here. For future versions, I am considering:

  1. ZMK Firmware: Transitioning to ZMK to explore wireless capabilities via Bluetooth. This would require changing the MCU from an STM32F103 to an NRF device, that is tuned for wireless communication and low power operation to run on battery
  2. Housing: Designing a 3D printed or CNC machined case to protect the PCBs. This should give the keyboard a more premium feel and add some weight.
  3. Refining Tolerances: Improving the PCB edge connectors for better physical joining of the halves. Especially the connection for the normal keyboard configuration needs some improvement. Currently the cable do not allow that configuration.

Building a keyboard from the ground up was fun and challenging, but the result is a unique tool for my daily workflow. I would say that I learned a lot and had a fun time as well, even with the occasional struggles that come with such a project. Lets see if I get the time to create a newer version in the future.

Sources

Hardware Designs can be found here: https://github.com/Nightshadow1258/SplitKeyboard (later version use different branches, I am not sure if this is the best way to preserve them, but for now it is what it is :D) This
Is create a fork of the original QMK firmware, that can be found here: https://github.com/Nightshadow1258/qmk_firmware