この記事は双掌のファームウェアを修正、アップデートした際の記録です。
弊社はじめての自作キーボード組み立てキット双掌には、左右にひとつずつロータリーエンコーダを搭載しています。
今回、このロータリーエンコーダでマウスホイールのスクロールイベントを実装したのですが、様々な問題に悩まされました。
最終的に、ロータリーエンコーダでマウスホイールするためのモジュールプログラムを作成しました。
このモジュールはgithubにて公開していますので、双掌のみならず、zmkで同じお悩みをお持ちの方の助けになりましたら幸いです。
問題発覚の経緯
『キーボードを操作していたら、いきなりフリーズする。』
ログを取れるようにして調査開始。
→キューが溢れてファームウェアがフリーズすることを確認。
フリーズを解決するために、いくつかの対策を試みることに。
キュー溢れの対策を実施
バッファを増やす方向
いろんなバッファサイズの設定があるので試行錯誤。
キーボードを操作する時は常に一定の動きをするわけではないのと、
いたずらにバッファだけ増やすと処理待ちが増えて動作が遅延し始めるため、
絶対コレという数値を設定することは難しい…が、記事公開時点では問題が起きないところまで調整できた。
ドライバの通信間隔を広げる方向
まず手を付けたのがトラックボールモジュール。
zmkの下で動いているZephyrが用意しているドライバは、遠慮なく高頻度で通信をするためフリーズの原因になる。
badjeff氏のカスタムドライバモジュールを導入。
これだけでかなり状況が改善した。
ここまではverBファームウェアで提供済みの内容です。
ここからが本記事のメインコンテンツです。
ロータリーエンコーダの処理を根本的に見直す
behaviorsを使用していた頃の状況。
当初、双掌のファームウェアではkeymapファイル上にbehaviorsを作成し、
それをsensor-bindingsで呼び出す設計にしていた。
そうすると、スクロールの開始(press)と終了(release)で2回のイベントがキューに乗る。
2個セットで処理されれば問題ないが、問題は前述のキューが溢れる状態になった場合。
releaseが処理される前に次のpressが流れてきて、最終的にフリーズする。
zmk_encoderモジュールの開発
この問題を解決するために、pressとreleaseのイベントを使用せず、
HIDレポートを直接set→send→clear→sendで完結させるアプローチを取るモジュールを開発した。
スクロールイベントを1回の処理で完結できるようになったため、どれだけキューが溢れても理論上はzmkがフリーズすることはない。
本モジュールのリポジトリはこちらで公開済み。
https://github.com/elekit-official/zmk_encoder
双掌の最新版ファームウェアverB2には標準搭載していますので、一旦初期状態に戻っても問題ない場合はリセットファームウェアを書き込んだうえで最新版ファームウェアを書き込んでください。
バイナリ(すぐに書き込めるzipファイル)はビルドガイドの中にリンクを掲載しています。
双掌ビルドガイド ファームウェアの書き込み
ご自身の双掌ファームウェアに追加したい方向けの情報
基本的にそのまま新しいファームウェアを書き込んでいただくのが一番早くて確実ですが、
現在初期版やverBのファームウェアをカスタムして使っている方向けに、本モジュールを追加導入するための情報を記します。
編集するファイルは2つ。
config/west.yml
モジュールをファームウェアに追加読込みするためのファイルです。
こちらの編集内容は上記zmk_encoderのリポジトリを参照してください。
(このブログ上で正しいインデントのコードを記述できないため、githubでご覧になった方が正確です。)
config/sosho.keymap
以下、2セクションを修正。
既に設定してあるbehaviorsを削除

keymap{ }内、レイヤーのsensor-bindingsを編集
レイヤー0とレイヤー2にこのような値があった場合、あるいはご自身で追加していた場合は適宜削除してください。
![]()
![]()
これらの&msc_ec_lや&msc_ec_rは、上で削除したbehaviorsに連動していますので、
behaviorsを削除したあとにこの値が残っているとビルドエラーが出ます。
新規コードの追加
west.ymlと同じくzmk_encoderのリポジトリを参照して、
新たなbehaviorsとsensor-bindingsを設定してください。
あとがき
双掌リリースから約3か月間、ご迷惑をお掛けしてしまったユーザーの皆様にお詫び申し上げるとともに、ログ収集やテスト版でご協力いただいたユーザーの方々にお礼を申し上げます。
大変なご尽力をいただき、本当にありがとうございました。
モジュール開発は初めてでしたが、なんとか無事にリリースすることができました。
引き続き、双掌や新製品の開発を通じて、皆様に「エレキットの自作キーボード」を楽しんでいただけるよう邁進してまいります。
今後とも何卒よろしくお願い申し上げます。



