A wireless, per‑key‑RGB, OLED‑equipped split keyboard powered by nice!nano v2 (compatible)
This repository contains the complete ZMK firmware configuration for my custom Corne V3 split keyboard:
- MCUs: 2× nice!nano v2 (nRF52840, BLE 5.0, Li‑Po charging)
- Switch matrix: 3×6 + 3 (per half)
- Lighting: 42 × WS2812 per‑key LEDs + 12 × underglow (GRB)
- Display: 0.91 “ 128×32 SSD1306 OLED on each half
- Power: 302 mAh Li‑Po, magnetic charging pogo‑pins
- Host OS: macOS 15, but any BLE‑enabled OS works
The firmware is built with ZMK $Zephyr Mechanical Keyboard$ and provides:
- True wireless split (BLE link between halves, no TRRS needed)
- Up to 5 easily switchable host profiles
- Layer & output status on the OLED
- Comprehensive RGB underglow / per‑key effects (breathe, cycle, reactive)
- VIA‑style live keymap editing with ZMK Studio
| Half | MCU | I/O pins |
|---|---|---|
| Left (central) | nice!nano v2 | Column 0‑5 → P1.06 … P1.15 Row 0‑3 → P0.13 … P0.16 OLED I²C → P0.02 / P0.03 RGB DIN → P0.28 (D4) |
| Right (peripheral) | nice!nano v2 | Mirrored pins; identical wiring |
https://zmk.dev/docs/user-setup
# Build central (left)
west build -p -b nice_nano_v2 -d build/left -- -DSHIELD="corne_left nice_view_adapter nice_view" -DSNIPPET="studio-rpc-usb-uart" -DCONFIG_ZMK_STUDIO=y
# Build peripheral (right)
west build -p -b nice_nano_v2 -d build/right -- -DSHIELD="corne_right nice_view_adapter nice_view"- Double‑tap RESET on the MCU → it mounts as
NICENANO. - Copy
build/zephyr/zmk.uf2onto the drive. - Repeat for the other half.
- Pairing mode:
Ctrl + Shift + J(hold >3 s) — host sees “ZMK‑Corne”. - Cycle profiles:
Ctrl + Shift + K. - Erase profiles:
Ctrl + Shift + P(long‑hold). - Peripheral ↔ central link is automatic after power‑on (blue LED solid).
Keybindings (Layer FN):
RGB_TOG RGB_HUI RGB_SAI RGB_BRI RGB_EFF
- Default effect: Breathe
- Underglow & per‑key share the same effect engine but can be toggled independently in
prj.conf.
| Widget | Purpose |
|---|---|
| Layer Status | Shows active layer name/number |
| Battery Gauge | Per‑half Li‑Po voltage & icon |
| Output Status | USB/BLE profile & caps/scroll lock |
Widgets blank after 15 s of idle to save ~15 mA.
| # | Name | Use‑case |
|---|---|---|
| 0 | Base | Colemak‑DH |
| 1 | Lower | Symbols & navigation |
| 2 | Raise | Numbers & function keys |
| 3 | Adjust | RGB, bootloader, Studio |
| 4 | Music | MIDI chords (optional) |
Detailed .keymap lives in /config/corne.keymap and is editable via Keymap Editor or ZMK Studio.
- Average typing current: 7 mA with OLED off, RGB off. → ~40 h on a 302 mAh cell.
- Enable
CONFIG_ZMK_RGB_SLEEP&CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE(already set) for multi‑week standby. - Charging LED on nice!nano v2 turns green at ~4.2 V.
- Add encoders: see
/docs/encoders.mdfor GPIO mapping. - Dongle mode: flash a third nRF board with
central_dongletarget and leave it in a USB port for faster resume. - QMK port: experimental RP2040 branch lives in
feature/qmk‑rp2040— still WIP.
Made with ☕ by @lysandroc