最近、cool642tbという無線左右分割トラックボール付きキーボードを使い始めました。
キーマップをKeymap Editorを使って編集したところ、トラックボール操作後に自動的にマウスレイヤーに切り替わらないという問題に直面しました。
Keymap Editorで編集後、マウスレイヤーに切り替わらない問題

前述のように、Keymap Editorで編集し、ファームウェアを焼いたところ、トラックボール操作後に自動的にマウスレイヤーに切り替わらないという問題に直面しました。
- 初期ファームウェアに焼き直し:問題なく動作
- ZMK Studio:問題なく動作
- Keymap Editorからファームウェア焼き直し:動作しない
- Keymapファイルを直接編集から焼き直し:動作しない
問題の切り分けをすると、1, 2では問題なく、3, 4のファームウェアを編集後に焼き直すと問題がでるといった状態でした。
ということで、問題は、①編集後のコンパイルの過程GitHubからか、②GitHubから引っ張っている元のファームウェアに問題があるとみました。
ChatGPTにファームウェアのファイルを投げる
プログラミングに関しては未経験ではないものの、ZMK Firmwareについて全くわかりません。Keymapのファイルをざっくり見れば、(視覚的にわかりやすく書かれているので)これはキーのボタンだなとか、ロータリーエンコーダの設定だなとかはわかったりしますが、詳細な記法は不明です。
一から勉強するのはコストが掛かるので、ChatGPTを使ったVibe Codingを試してみることにしました。
- cool642tb.keymap
- cool642tb_R.overlay
- cool642tb_R.conf
とりあえずのところ、KeymapのファイルをChatGPTになげ(Codexでもなく)、「ZMK Firmwareのトラックボール付きキーボードを使っている」、「Keymap Editorや直接編集後、トラックボール操作後にマウスレイヤーに切り替わらない」ことをそれぞれチャットに書き込み、問題の特定とコーディングを行ってもらいました。
ChatGPTが問題を特定・解決

ChatGPTの判断によれば、オートマウスレイヤーの設定が、ファームウェア上で有効になっていなかったからだとのこと。現在のファームウェアだと、その設定例がコメントアウトされた状態とのことでした。
上記の問題を修正するためのコードを書いてもらい、事なきをえました。
その他にも軽微な修正を依頼

- ロータリーエンコーダーのスクロール量の調整
- レイヤー1使用時に、トラックボールでスクロール
ロータリーエンコーダーの設定パラメータの詳細について教えてもらう
Vibe Codingをする際の注意点
使用したのは、ChatGPT PlusプランのChatGPT 5.4 Thinkingでした。
- まず、前提となるファームウェアやソフトを記載する。(今回ならZMKであることを明記した)
- 問題の症状を記載する
- 実際のファームウェアのファイルを投入する
正直なところ、前提条件を明確にしておかないと、ChatGPTは正確な回答を返してくれないので、上記の3点くらいは明確にしておきましょう。
また、困ったら、修正版のファームウェアを出力してもらうように依頼するのもアリです。これならファイルをアップロードしたり、コピペしたりで解決できます。プログラミングを知らなくても安心です。
実際のコードについて
オートマウスレイヤーへの切り替え
|
1 2 3 4 5 6 7 8 9 10 |
trackball: trackball@0 { status = "okay"; compatible = "pixart,pmw3610"; reg = <0>; spi-max-frequency = <2000000>; irq-gpios = <&gpio0 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; automouse-layer = <4>; scroll-layers = <5>; }; |
cool642tb_R.overlayに上のコードを追記で、オートマウスレイヤーが復活しました。
ロータリーエンコーダーのスクロール量について
|
1 2 3 |
bindings = <&msc MOVE_Y(10)>, <&msc MOVE_Y(-10)>; bindings = <&msc MOVE_X(10)>, <&msc MOVE_X(-10)>; tap-ms = <65>; |
具体的には、MOVE_Y<やMOVE_Xは10がスクロールの強さとのこと。tap-msは、その入力をどれくらいの長さで送るかの指標になっています。cool642tbについては、推奨値が記載されているので、この範囲に従い設定するのが良いです。この範囲外の設定にしても、快適に利用できませんでした。
レイヤー切り替え時、トラックボールにスクロールを割り当てる
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <input/processors.dtsi> #include <zephyr/dt-bindings/input/input-event-codes.h> / { input_processors { y_to_wheel: y_to_wheel { compatible = "zmk,input-processor-code-mapper"; #input-processor-cells = <0>; type = <INPUT_EV_REL>; map = <INPUT_REL_Y INPUT_REL_WHEEL>; }; }; }; &trackball_listener { vertical_scroll_mode { layers = <1>; input-processors = <&y_to_wheel>; }; }; |
これがレイヤー1のときに、トラックボール操作をY軸のスクロール操作に割り当てるコードです。




コメント