kukucaicndy/embedded_ai_skills/zmk-project-init
Claude Code and agent skill by kukucaicndy/embedded_ai_skills
- community
Checking that the SKILL.md file is still in the repository.
Initialize a ZMK keyboard firmware project. Invoke when user wants to create a new ZMK-based wireless/wired keyboard project, add a custom shield, or set up ZMK development environment.
Install
npx vskill@latest install kukucaicndy/embedded_ai_skills/zmk-project-initSKILL.md
ZMK 键盘项目初始化
引导用户完成 ZMK (Zephyr Mechanical Keyboard) 固件项目的创建、配置、编译和烧录。
适用场景
- 创建新的 ZMK 蓝牙/有线键盘项目
- 为已有键盘 PCB 添加 ZMK shield 定义
- 搭建 ZMK 本地开发环境并编译固件
前置条件
- 目标 MCU 为 32 位 ARM(nRF52840/nRF52832/RP2040/STM32 等),ZMK 不支持 AVR
- 系统已安装基本工具链(cmake、ninja、dtc、gperf、python3、arm-none-eabi-gcc)
- 如需烧录:J-Link 已连接 或 板卡支持 UF2 拖拽烧录
Step 1: 环境检测
ZMK 基于 Zephyr v4.1+,要求 Python >= 3.10。系统自带 Python 3.9 可能不满足要求。
并行检测以下组件:
J-Link 检测(含非标准路径):
Python 版本要求(⚠️ 关键)
Zephyr v4.1 要求 Python >= 3.10。如果系统 Python < 3.10:
⚠️ Homebrew Python PEP 668 限制:Homebrew 安装的 Python 3.12 不允许直接pip3 install(报错externally-managed-environment)。必须创建 venv 后在 venv 内安装包。
Step 2: 克隆 ZMK 仓库并初始化 Workspace
⚠️ NCS 冲突:如果系统已安装 nRF Connect SDK,.zshrc中的source zephyr-env.sh会设置ZEPHYR_BASE指向 NCS。ZMK 需要自己的 Zephyr fork,编译前必须unset ZEPHYR_BASE。
⚠️ west update 网络失败 — 必须重试!:部分模块可能因网络超时失败。如果后续启用 BLE(CONFIG_ZMK_BLE=y),需要 mbedtls 模块。模块不全会导致 Kconfig 警告MBEDTLS has direct dependencies 0 with value n并中止编译。遇到此问题需重新运行west update直到所有模块下载成功。失败的模块不会自动重试,必须完整重新west update。如何判断是否需要重试:查看west update输出末尾是否有ERROR: update failed for projects: ...。如果有,重新运行west update。
Step 3: 确认硬件配置
通过 AskUserQuestion 与用户交互确认:
3.1 芯片型号
- nRF52840(最常用,USB + BLE)
- nRF52832(BLE,无 USB)
- RP2040
- STM32
- 其他
3.2 开发板/控制器
- nice!nano(ZMK 最流行,nRF52840 + UF2 bootloader + 锂电池充电)
- nRF52840 DK
- Pro Micro RP2040
- 自定义板
3.3 键盘布局
- 自定义矩阵(行列数)
- 已有布局(Corne、Sofle、Kyria 等)
3.4 外设功能(多选)
- 编码器
- I2C OLED/LCD 屏幕
- RGB 灯效
- 电池电量检测
- 外设电源控制(VCC shutoff)
- 状态按钮/LED
- UART 调试串口
Step 4: 确定引脚分配
Pro Micro 引脚布局(nice!nano 等)
⚠️ D11/D12 在 nice!nano v2 上不可用,分配引脚时需避开。
| Pro Micro Pin | nRF52840 GPIO | 功能 | |
|---|---|---|---|
| D0 | P0.08 | UART RX | |
| D1 | P0.06 | UART TX | |
| D2 | P0.17 | GPIO / I2C SDA | |
| D3 | P0.20 | GPIO / I2C SCL | |
| D4 | P0.22 | GPIO | |
| D5 | P0.24 | GPIO | |
| D6 | P1.00 | GPIO | |
| D7 | P0.11 | GPIO | |
| D8 | P1.04 | GPIO | |
| D9 | P1.06 | GPIO | |
| D10 | P0.09 | GPIO | |
| D14 | P1.11 | SPI MISO | |
| D15 | P1.13 | SPI SCK | |
| D16 | P0.10 | SPI MOSI | |
| D18 | P1.15 | GPIO / A0 | |
| D19 | P0.02 | GPIO / A1 | |
| D20 | P0.29 | GPIO / A2 | |
| D21 | P0.31 | GPIO / A3 |
ZMK 中的 Pro Micro 节点与总线别名
ZMK 定义了 &pro_micro connector 和标准总线别名:
&pro_micro_i2c→&i2c0(I2C 总线,pinctrl 映射到 D2/D3 即 P0.17/P0.20)&pro_micro_spi→&spi1(SPI 总线,pinctrl 映射到 D14/D15/D16)&pro_micro_serial→&uart0(UART,pinctrl 映射到 D0/D1 即 P0.08/P0.06)
⚠️ I2C 和 UART 引脚不冲突:pro_micro_i2c使用 D2/D3,pro_micro_serial使用 D0/D1。可以同时启用 I2C OLED 和 UART 调试串口。
在 shield dtsi 中引用引脚:<&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> 表示 D7。
Step 5: 创建用户配置目录结构
⚠️ 关键文件说明
| 文件 | 必须? | 作用 | 常见错误 | |
|---|---|---|---|---|
.zmk.yml | ✅ | Shield 元数据,声明 type/requires/features | 遗漏导致 shield 不被识别 | |
.overlay(同名) | ✅ | Zephyr 通过此文件发现 shield | 只有 .dtsi 没有 .overlay 导致 shield 列表中找不到 | |
.conf | ✅ | 启用 USB/BLE/UART 等功能 | ZMK 默认不启用 USB 和 BLE!必须在此显式启用 | |
Kconfig.shield | ✅ | 注册 shield 到 Kconfig | def_bool y 写法错误,必须用 def_bool $(shields_list_contains,<name>) | |
Kconfig.defconfig | ✅ | Shield 默认 Kconfig 值 | 在此重新定义 ZMK 内部 Kconfig 符号的 type 会导致警告 | |
.keymap | ✅ | 键盘按键映射 | 缺少 #include <behaviors.dtsi> 导致 &kp 等未定义 | |
.dtsi | 可选 | 硬件定义(可合并到 .overlay 中) | — |
Step 6: 编写 Shield 定义文件
6.1 <keyboard_name>.zmk.yml
6.2 Kconfig.shield
6.3 Kconfig.defconfig
6.4 <keyboard_name>.conf(⚠️ 关键 — 启用 USB/BLE/UART)
⚠️ ZMK 新版 board defconfig 不自动加载 `ZMK_USB`/`ZMK_BLE`!ZMK 存在两套 board 定义:app/module/boards/(新格式,defconfig 中没有ZMK_USB/ZMK_BLE)和app/boards/(旧格式,defconfig 中有)。Zephyr v4.1 优先加载 module 目录的 defconfig,导致 USB 和 BLE 未启用。必须在 `<keyboard_name>.conf` 中显式启用!
⚠️ UART 驱动配置:仅设置CONFIG_SERIAL=y和CONFIG_UART_CONSOLE=y不够。nRF 平台还需要CONFIG_NRFX_UARTE0=y启用底层 UART 驱动,否则SERIAL_HAS_DRIVER为n,UART_CONSOLE依赖不满足会被静默禁用。
6.5 <keyboard_name>.overlay / .dtsi
⚠️ UART 启用必须放在 shield 主 `.overlay` 中:board-specific overlay(boards/<board_name>.overlay)的文件名匹配在 Zephyr v4.1 新 board 模型下不可靠(board 名从nice_nano_nrf52840_zmk变为nice_nano+ qualifiernrf52840),导致 overlay 不被加载。将&uart0 { status = "okay"; }和chosen放在 shield 主.overlay中可确保生效。
6.6 <keyboard_name>.keymap
6.7 boards/<board_name>.overlay
⚠️ board-specific overlay 文件名匹配不可靠:Zephyr v4.1 新 board 模型将nice_nano_v2改为nice_nano+ qualifier。board-specific overlay 文件名nice_nano_nrf52840_zmk.overlay可能不被加载。建议将所有配置放在 shield 主 `.overlay` 中,不依赖 board-specific overlay。
6.8 build.yaml
Step 7: 编译
⚠️ 编译命令使用 board qualifier 格式:-b nice_nano/nrf52840,不要用-b nice_nano -DBOARD_REV=2.0.0。旧格式会导致 board defconfig 中的ZMK_USB/ZMK_BLE不被加载。
⚠️ 验证关键配置(编译后必须检查)
编译成功后,检查 .config 确认 USB/BLE/UART 已启用:
期望输出:
如果看到 # CONFIG_ZMK_USB is not set,说明 .conf 文件未被加载或配置有误。
编译常见错误与解决方案
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingzmk-project-init/SKILL.md
Popularity
- 7-day trend score
- 0
Refreshed 5 Oct 2026, a month ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/kukucaicndy/embedded_ai_skills/zmk-project-init)