
键盘群里苦ZMK无法实时改键久矣,前几天ZMK推出了可用的ZMK STUDIO,群友奔走相告,有大佬写了教程,于是踩在大佬的肩膀上给原有的sofle和Dactyl键盘增加了对ZMK studio的支持。作为一知半解的小白,不出意外地出了很多意外,最后磕磕绊绊地改成功了,把过程分享出来,抛砖引玉,供各位大佬以及小白参考。
我的方法肯定不是最优解,但是能跑通我也就不改了,万一改废了我也没有解决能力。
本文仅针对在github修改,我没有搭建本地环境,就不班门弄斧了。
以分体键盘为例,给原有固件增加ZMK studio支持,至少需要修改
build.yaml
*.conf(*是键盘名称,我的键盘是Dactyl,就是修改dactyl.conf文件,以下相同)
*.dtsi
这三个文件,
如果你的键盘引用了ZMK主分支以外的分支,还需要修改
west.yml
文件(后面会详细介绍)。
同时,如果你之前没有
*.json
文件的话,现在还需要做一个physical layouts文件。
因为每个人的习惯不同,这几个文件的位置不固定,但是zmk文件夹里就那几个文件,应该也好找,我就不放截图了,实在不行github还有搜索功能对不对。
1.制作physical layouts文件(已有的请跳过)
physical layouts文件可以理解为用代码的形式描述键盘布局,有两种方式可以做:
一种是先去KLE网站画键盘配列,然后把raw data粘贴到转换网站,转换完再粘贴到zmk physical layouts转换网站;
一种是直接手搓json,然后粘贴到zmk physical layouts转换网站。
两种方式工作量差不多,第一种简单一点。
1.1在KLE网站画配列
1.1.1
https://www.keyboard-layout-editor.com/
这个网站可以比较直观的画出键盘配列,基本上DIY键盘的第一步都会到这个网站画配列(因为要生成定位板文件),怎么操作我就不赘述了。

1.1.2 画好配列后,把raw data复制到
https://qmk.fm/converter/
粘贴到input里面,点击convert,自动转换成json的格式

1.1.3 把output里面的内容复制到
https://zmk-physical-layout-converter.streamlit.app/
粘贴到JSON description栏,点击update DTS using this按钮,自动转换成ZMK studio支持的格式


1.2 手搓json文件
1.2.1 如果手上有别的键盘的json文件,可以直接修改。重点是row、col、x、y这几项内容,lable的内容无所谓,转换的时候会自动被剔除

1.2.2 然后按1.1.3的操作,转换成zmk studio支持的格式。
2.修改dtsi文件
2.1 在dtsi文件里,把上一步生成的physical layout代码粘贴到其他的#include 之后

注意:转换网站转出来的代码默认的开头是
#include <physical_layouts.dtsi>
/ {
physical_layout0: physical_layout_0 {
compatible = "zmk,physical-layout";
display-name = "LAYOUT";
kscan = <&kscan0>;
transform = <&matrix_transform0>;
为了便于区分,最好是把
physical_layout0: physical_layout_0
和
display-name = "LAYOUT";
改为你自己的键盘名称,我的改成了
#include <physical_layouts.dtsi>
/ {
dactyl_layout: dactyl_layout {
compatible = "zmk,physical-layout";
display-name = "dactyl";
kscan = <&kscan0>;
transform = <&matrix_transform0>;
2.2 在chosen部分把
zmk,matrix-transform = &default_transform;
改为
zmk,physical-layouts = &physical_layout0; (加粗部分以上一步的键盘名称为准,改就全改,不改就全不改,以下不再赘述)

2.3 在文件末尾添加
&dactyl_layout{
transform = <&default_transform>;
kscan = <&kscan0>;
};
zephyr_udc0: &usbd {
compatible = "nordic,nrf-usbd";
status = "okay";
};
这段代码的第一部分是必加的,第二部分是usb logging相关,大佬说不加会报错,反正我加了编译成功了,没试过不加。
3.修改conf文件
CONFIG_ZMK_STUDIO=y
CONFIG_ZMK_STUDIO_LOCKING=n
CONFIG_ZMK_STUDIO_LOCK_ON_DISCONNECT=n
在conf文件里添加这三段代码,分别是启用zmk studio,关闭zmk studio锁定和断开连接时锁定(我猜的)
4.修改west文件
某些键盘添加了基础之外的新功能,比如模拟鼠标移动等,在west文件里引用的不是zmk的main分支。
如果引用的是第三方的github仓库还好,如果引用的是zmk自己的其他分支,就需要到zmk的仓库里看看作者有没有更新,找到更新后的,这个就得具体问题具体分析了。
比如睫毛哥的solfe,引用了ZMK作者的feat/pointers-move-scroll分支以实现模拟鼠标移动,但是作者没有给这个分支更新对zmk studio的支持,而是写了新的分支feat/pointers-with-input-processors,所以我们就要修改west文件。

如果作者没有更新或新建分支,那暂时就先别改zmk studio了,等等党永远不亏。
5.修改build.yaml文件

在原有的主手(通常是左手)固件编译命令里增加一行
snippet: studio-rpc-usb-uart
这条命令是启用用于通过 USB 进行 ZMK Studio 通信的端点。
以上文件修改完,理论上就能生成新的支持zmk studio的固件了,有条件的话先拿闲置的主控刷一下看看是否正常,验证过了再刷到键盘里。如果有问题,那就再改改,建议加睫毛哥的QQ群(945900883)咨询大佬。别问我,看我的行文也能发现我就是个小白。
我是Noir Guo,一个马上四旬的三旬老汉。