zmk-config/README.md

345 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Corne Keyboard Custom Keymaps (ZMK)
Custom keymaps for a Corne 42-key split keyboard running ZMK firmware with on-board stenography.
# Table of Contents
- [Hardware Info](#hardware-info)
- [Current Keymap](#current-keymap)
- [Related Resources](#related-resources)
- [Pre-requisites](#pre-requisites)
- [Clone Repository](#clone-repository)
- [Editing the Keymap](#editing-the-keymap)
- [Building Firmware](#building-firmware)
- [Flashing the Keyboard](#flashing-the-keyboard)
- [1. Download the firmware](#1-download-the-firmware)
- [2. Connect the keyboard half via USB](#2-connect-the-keyboard-half-via-usb)
- [3. Enter bootloader mode](#3-enter-bootloader-mode)
- [4. Flash the firmware](#4-flash-the-firmware)
- [5. Repeat for the other half](#5-repeat-for-the-other-half)
- [6. Re-pair Bluetooth](#6-re-pair-bluetooth)
- [Settings Reset](#settings-reset)
- [When to reset](#when-to-reset)
- [How to reset](#how-to-reset)
- [Issues](#issues)
- [Bluetooth pairing issues](#bluetooth-pairing-issues)
- [Layers not switching correctly](#layers-not-switching-correctly)
- [Keyboard name not changing after flash](#keyboard-name-not-changing-after-flash)
- [RGB Underglow](#rgb-underglow)
- [Enabling ZMK Studio](#enabling-zmk-studio)
# Hardware Info
| Property | Value |
|----------|-------|
| Keyboard | Corne (crkbd) 6-column split |
| Keys | 42 (3x6 + 3 thumbs per side) |
| MCU | nRF52840 (nice!nano v2 compatible) |
| Firmware | ZMK |
| Connection | Bluetooth Low Energy (BLE) |
| Device Name | `Afiq Zudin Corne42` |
| Display | SSD1306 OLED 128x32 (nice_oled module) |
| LEDs | WS2812 underglow (6/half) + per-key (21/half) — 54 total |
| BT Profiles | 5 (BT0-BT4) |
| ZMK Studio | Disabled (see [Enabling ZMK Studio](#enabling-zmk-studio)) |
| Steno Engine | Javelin (Lapwing dictionary) |
| Vendor | KeebMaker |
| Vendor Config | [KeebMaker/zmk-config](https://github.com/KeebMaker/zmk-config) |
# Current Keymap
Key positions reference:
```
0 1 2 3 4 5 | 6 7 8 9 10 11
12 13 14 15 16 17 | 18 19 20 21 22 23
24 25 26 27 28 29 | 30 31 32 33 34 35
36 37 38 | 39 40 41
```
### Layer 0: CARP (Carpalx QGMLWY)
```
` Q G M L W | Y F U B ; ->HUB
[HUB] D S T N R | I A E O H '
LSHFT Z X C V J | K P , . / RSHFT
[RGB] CTRL GUI | SPC ALT MUTE/PP
Combos (layers 0+1):
top+home row same col = 1-0, shift+combo = ! @ # $ % ^ & * ( )
G+M (W+E on QWRT) = ESC
S+T (S+D on QWRT) = TAB
U+B (I+O on QWRT) = BSPC
E+O (K+L on QWRT) = ENTER
[HUB] = hold opens HUB layer, release goes back
[RGB] = tap-dance: 1×=toggle, 2×=effect fwd, 3×=effect rev
MUTE/PP = tap mute, hold play/pause
```
### Layer 1: QWRT (QWERTY)
```
` Q W E R T | Y U I O P ->HUB
[HUB] A S D F G | H J K L ; '
LSHFT Z X C V B | N M , . / RSHFT
[RGB] CTRL GUI | SPC ALT MUTE/PP
Combos: same as CARP (top+home = 1-0, W+E = ESC, S+D = TAB, I+O = BSPC, K+L = ENTER)
```
### Layer 2: STEN (Javelin Steno — Lapwing)
```
_ # # # # # | # # # # # ->HUB
[HUB] S T P H * | * F P L T D
_ S K W R * | * R B G S Z
_ A O | E U _
```
### Layer 3: FPS (WASD shifted right for ortho)
```
1/ESC 2 Q [W] E/3 R/4 | 5 6 7 8 9 ->HUB
TAB SHFT [A] [S] [D] F | _ _ _ _ _ _
M/ALT Z X C V G | _ _ _ _ _ _
T CTRL SPC | _ _ _
Hold-taps: 1=tap/ESC=hold, E=tap/3=hold, R=tap/4=hold, M=tap/ALT=hold
```
### Layer 4: HUB (Utility — BT, RGB, Media, Nav)
```
BT_CLR BT0 BT1 BT2 BT3 BT4 | + [ UP ] * =
OUT_TOG HUE+ SAT+ BRT+ SCRN+ VOL+ | - LEFT DOWN RIGHT / \
LSHFT HUE- SAT- BRT- SCRN- VOL- | ->CARP ->QWRT ->STEN ->FPS [CLR] RSHFT
[RGB] CTRL GUI | SPC ALT MUTE/PP
OUT_TOG = toggle USB/BLE output
HUE/SAT/BRT = RGB underglow hue, saturation, brightness
SCRN = display brightness (C_BRI_UP/DN)
VOL = volume up/down
[RGB] = tap-dance: 1×=toggle, 2×=effect fwd, 3×=effect rev
[CLR] = tap-dance color presets: 1×=purple, 2×=white, 3×=red, 4×=blue, 5×=green
MUTE/PP = tap mute, hold play/pause
```
# Related Resources
- [ZMK Firmware Documentation](https://zmk.dev/docs)
- [ZMK Keycodes Reference](https://zmk.dev/docs/codes)
- [ZMK Studio](https://zmk.studio/) - Live keymap editor (no flashing needed)
- [Keymap Editor](https://nickcoutsos.github.io/keymap-editor/) - Visual keymap editor for GitHub repos
- [Javelin Steno Engine](https://github.com/jthlim/javelin-steno) - On-board steno engine
- [Vendor Config (KeebMaker)](https://github.com/KeebMaker/zmk-config)
# Pre-requisites
- Corne Keyboard (KeebMaker variant)
- macOS
- USB-C cable
- GitHub account (for building firmware via Actions)
- This Repository - [Custom Corne Keymaps](https://github.com/afiqzudinhadi/zmk-config)
# Clone Repository
```bash
git clone git@github.com:afiqzudinhadi/zmk-config.git
```
# Editing the Keymap
### Edit Config Files
For full customization (combos, steno layer, behaviors):
```
config/
├── corne.keymap <- Edit this for keymap changes
├── corne.conf <- Edit this for feature toggles (RGB, display, BLE)
└── west.yml <- ZMK module dependencies (usually no changes needed)
```
Keymap guide can be found [here](https://zmk.dev/docs/codes).
# Building Firmware
1. Push changes to GitHub
2. Go to **Actions** tab → latest workflow run
3. Wait for the build to complete (green checkmark)
4. Download the `firmware` artifact (zip file)
5. Extract — contains `.uf2` files for left and right halves
If Actions is disabled on your fork: go to **Actions** tab → click "I understand my workflows, go ahead and enable them".
# Flashing the Keyboard
### 1. Download the firmware
Download the `firmware.zip` from the GitHub Actions artifacts and extract it.
The zip contains:
- `nice_corne_left_oled_rgb-nice_nano_v2-zmk.uf2` — left half
- `nice_corne_right_oled_rgb-nice_nano_v2-zmk.uf2` — right half
- `nice_settings_reset-nice_nano_v2-zmk.uf2` — settings reset (see [Settings Reset](#settings-reset))
### 2. Connect the keyboard half via USB
Plug in the **left** half of the keyboard with a USB-C cable.
### 3. Enter bootloader mode
Double-tap the reset button on the keyboard. The keyboard will appear as a USB drive (e.g. `NICENANO`).
- The reset button is on the PCB (check underneath the keyboard or through the case hole).
- The LEDs on the keyboard will turn off.
- If the drive doesn't appear, try double-tapping faster or slower.
### 4. Flash the firmware
Drag the **left** `.uf2` file onto the USB drive. The keyboard will automatically reboot and the drive will disappear.
### 5. Repeat for the other half
1. Plug in the **right** half via USB-C
2. Double-tap the reset button
3. Drag the **right** `.uf2` file onto the USB drive
### 6. Re-pair Bluetooth
If you changed the keyboard name or did a settings reset:
1. Open **System Settings → Bluetooth** on macOS
2. Remove the old keyboard entry (e.g. `Corne_Oled_RGB`)
3. Put the keyboard in pairing mode (it should be discoverable automatically)
4. Pair with `Afiq Zudin Corne42`
# Settings Reset
### When to reset
Do a settings reset when:
- **Layer structure changed** (layers added, removed, or reordered) — ZMK Studio saved state stores the old layer layout and will override the new compiled keymap
- Layers are not switching correctly after flashing new firmware
- Keyboard name didn't change after flash
- Both halves won't pair with each other
- ZMK Studio saved changes are interfering with your compiled keymap
- Bluetooth pairing issues after firmware update
### How to reset
1. Download `nice_settings_reset-nice_nano_v2-zmk.uf2` from the firmware artifacts
2. Connect the **left** half via USB
3. Double-tap the reset button to enter bootloader mode
4. Drag `nice_settings_reset-nice_nano_v2-zmk.uf2` onto the USB drive
5. **Immediately** double-tap reset again to put it back in bootloader mode (to avoid accidental bonding)
6. Repeat steps 2-5 for the **right** half
7. Now flash the actual firmware to both halves (left `.uf2` to left, right `.uf2` to right)
8. After flashing both halves, reset both at the same time to pair them together
9. Remove old Bluetooth entry from macOS and re-pair
# Issues
### Bluetooth pairing issues
If the keyboard won't pair after flashing:
1. Clear the BT profile: go to HUB layer → press `BT_CLR`
2. Remove the device from macOS Bluetooth settings
3. Re-pair
If issues persist, do a full [Settings Reset](#settings-reset).
### Layers not switching correctly
If `->STEN`, `->FPS`, or other layer switches go to CARP instead of the expected layer, ZMK Studio's saved state is overriding your compiled keymap. Do a [Settings Reset](#settings-reset) to clear it.
### Keyboard name not changing after flash
The BLE name is cached in device settings. Do a [Settings Reset](#settings-reset) and re-pair.
# RGB Underglow
### Hardware
54 WS2812 LEDs total — 6 underglow + 21 per-key per half. Chain length set in `boards/shields/corne/boards/nice_nano_v2.overlay`.
### Config
RGB settings are in `config/corne.conf`:
| Setting | Value | Description |
|---------|-------|-------------|
| `CONFIG_ZMK_RGB_UNDERGLOW` | `y` | Enable RGB |
| `CONFIG_ZMK_RGB_UNDERGLOW_ON_START` | `n` | Off on boot |
| `CONFIG_WS2812_STRIP` | `y` | WS2812 LED driver |
| `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START` | `3` | Default effect: 0=Solid, 1=Breathe, 2=Spectrum, 3=Swirl |
| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP` | `1` | Brightness step (%) |
| `CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE` | `y` | Turn off when idle |
| `CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER` | `n` | Don't toggle external power with RGB |
Optional tuning (commented out in config):
- `HUE_STEP` / `SAT_STEP` — hue and saturation adjustment step
- `HUE_START` / `SAT_START` / `BRT_START` — initial color values
### Effects
| `EFF_START` | Effect |
|-------------|--------|
| 0 | Solid color |
| 1 | Breathe |
| 2 | Spectrum |
| 3 | Swirl |
Cycle at runtime with `RGB_EFF` (next) / `RGB_EFR` (previous).
### Keycodes
| Keycode | Action |
|---------|--------|
| `RGB_TOG` | Toggle on/off |
| `RGB_EFF` | Next effect |
| `RGB_EFR` | Previous effect |
| `RGB_HUI` / `RGB_HUD` | Hue up/down |
| `RGB_SAI` / `RGB_SAD` | Saturation up/down |
| `RGB_BRI` / `RGB_BRD` | Brightness up/down |
| `RGB_SPI` / `RGB_SPD` | Speed up/down |
| `RGB_COLOR_HSB(h,s,b)` | Set specific color |
Docs: [zmk.dev/docs/keymaps/behaviors/underglow](https://zmk.dev/docs/keymaps/behaviors/underglow) · [zmk.dev/docs/config/underglow](https://zmk.dev/docs/config/underglow)
### Runtime Controls (HUB Layer)
| Key | Action |
|-----|--------|
| `[RGB]` | Tap-dance: 1×=toggle, 2×=effect fwd, 3×=effect rev |
| `[CLR]` | Tap-dance color presets: purple → white → red → blue → green |
| `HUE+` / `HUE-` | Adjust hue |
| `SAT+` / `SAT-` | Adjust saturation |
| `BRT+` / `BRT-` | Adjust brightness |
# Enabling ZMK Studio
ZMK Studio is disabled by default in this config. To enable live keymap editing:
1. In `config/corne.conf`, uncomment:
```
CONFIG_ZMK_STUDIO=y
CONFIG_ZMK_STUDIO_LOCKING=n
```
2. In `build.yaml`, add `studio-rpc-usb-uart` to the left half snippet:
```yaml
snippet: rgb-config studio-rpc-usb-uart
```
3. In `boards/shields/corne/corne.zmk.yml`, add `studio` to features:
```yaml
features:
- keys
- display
- underglow
- studio
```
4. Push and flash.
5. Go to [zmk.studio](https://zmk.studio/) in Chrome → connect via USB or BLE → edit layers visually.
**Limitations:** Cannot add combos, custom behaviors, or change display/RGB config.
**Warning:** ZMK Studio saves changes to flash storage. These override the compiled keymap. If layers behave unexpectedly after flashing, do a [Settings Reset](#settings-reset).