見出し画像

DYA Studioを導入してみるぞ!moNa2編

DYA Studioというゲームチェンジャー

https://studio.dya.cormoran.works/

cormoran氏によって公開されたzmk studioベースと思われるキーマップ編集ツールです。
使いやすいUIによってサクサクキーマップを変更可能なだけでなく、トラックボールのスクロールやオートマウス設定、バッテリー残量の推移等様々な設定が可能なWebツールになります。
しかもUSB接続時だけでなくBluetooth接続時にもサクサクとキーマップを編集できるという超優れもの。
私は使ったことないのでよく知りませんが、zmk studioは使いにくいというもっぱらのうわさでしたので、まさにゲームチェンジャーになりうる、そんな可能性を持ったツールです。今後業界標準になっていくポテンシャルがあるかもしれません。

さて、そんな便利ツールですが、2026年2月10日時点では、導入事例がほとんどないので、私が導入した手順とともにまとめてみようと思います。

導入手順

ご自身のzmk configのリポジトリで作業することになります。まだリポジトリをフォークしていない場合は、フォークしてから作業しましょう。今回はmoNa2を例に導入してみます。

前提条件

DYA Studioに対応するためにはカスタムzmkを使用する必要があります。cormoran氏のzmkはv0.3ベースなので、現状v0.3として利用することになります。今すでにZephyr 4.1ベースのzmkを使用している場合は、現状対応していないので対応を待つかv0.3にダウングレードする必要があります。

west.ymlの編集

manifest:
  defaults:
    revision: main
  remotes:
    - name: cormoran
      url-base: https://github.com/cormoran
    # 既存のリモートはそのまま維持
  projects:
    # ZMK: DYA Studio 用カスタム RPC サブシステム付き cormoran fork
    - name: zmk
      remote: cormoran
      revision: v0.3-branch+dya
      import: app/west.yml

    # DYA Studio モジュール(すべて cormoran リポジトリ)
    - name: zmk-module-ble-management
      remote: cormoran
      revision: main
    - name: zmk-module-battery-history
      remote: cormoran
      revision: main
    - name: zmk-module-settings-rpc
      remote: cormoran
      revision: main
    - name: zmk-module-runtime-input-processor
      remote: cormoran
      revision: main

    # その他のモジュール(トラックボールドライバー、LED ウィジェット等)
    # ...
  self:
    path: config

zmkはcormoran氏のカスタムzmkを指定します。それ以外にも必要なモジュールを導入します。


Central側の.confを編集

moNa2は右がcentralなので、moNa2_R.confを編集します。以下の設定を追加します。

# ========================================
# ZMK Studio(必須ベース)
# ========================================
CONFIG_ZMK_STUDIO=y
# 注意: CONFIG_ZMK_STUDIO_LOCKING=n を設定しないでください。
# Studio Locking は BLE 接続に必要なため、デフォルトの y を維持する必要があります。
# 詳細は「BLE 接続」セクションを参照。

# BLE 接続スロット(プロファイル + Peripheral + Studio)
CONFIG_BT_MAX_CONN=5
CONFIG_BT_MAX_PAIRED=5

# ========================================
# DYA Studio モジュール(Central 側)
# ========================================
# BLE 管理
CONFIG_ZMK_BLE_MANAGEMENT=y
CONFIG_ZMK_BLE_MANAGEMENT_STUDIO_RPC=y

# バッテリー履歴
CONFIG_ZMK_BATTERY_HISTORY=y
CONFIG_ZMK_BATTERY_HISTORY_STUDIO_RPC=y
# デフォルトでは USB 給電中はバッテリー履歴の記録がスキップされます。
# USB 接続中もバッテリー履歴を記録したい場合は n に設定してください。
CONFIG_ZMK_BATTERY_SKIP_IF_USB_POWERED=n

# Settings RPC(アイドル/スリープ設定)
CONFIG_ZMK_SETTINGS_RPC=y
CONFIG_ZMK_SETTINGS_RPC_STUDIO=y

# Split イベントリレー(Central <-> Peripheral 設定同期)
CONFIG_ZMK_SPLIT_RELAY_EVENT=y
CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE=768

# Runtime Input Processor(トラックボール設定を DYA Studio から変更)
# トラックボール/ポインティングデバイスがある場合のみ必要
CONFIG_ZMK_RUNTIME_INPUT_PROCESSOR=y
CONFIG_ZMK_RUNTIME_INPUT_PROCESSOR_STUDIO_RPC=y

# 設定の永続化
CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE=10000

Peripheral側の.confを編集

moNa2_L.confは下記の設定を追加します。

# バッテリー履歴(Peripheral 側)
CONFIG_ZMK_BATTERY_HISTORY=y

# Settings RPC(Peripheral 側)
CONFIG_ZMK_SETTINGS_RPC=y

# Split イベントリレー(Peripheral 側)
CONFIG_ZMK_SPLIT_RELAY_EVENT=y

# 設定の永続化
CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE=10000

Studio Unlockキーをキーマップに追加

&studio_unlock というキーをキーマップに追加します。DYA StudioでBluetooth接続を実現するために必要な設定およびロック解除になります。原理的にはアンロックするとBLEアドバタイズが開始されるため、その機能を使い情報を共有するようです。Linuxではsdudio lockなしで編集できるそうですが、WindowsやMacではlock状態からunlockすることが必要みたいですね。私は試しにBT設定のあるレイヤーに設定してみました。

        layer_3 {
            bindings = <
                 &bt BT_SEL 0    &bt BT_SEL 1    &bt BT_SEL 2    &bt BT_SEL 3     &bt BT_SEL 4                    &kp LG(LC(LEFT))  &kp LG(TAB)  &mkp MB3  &trans     &kp LG(LC(RIGHT))
                 &studio_unlock  &kp LEFT_ARROW  &kp DOWN_ARROW  &kp RIGHT_ARROW  &kp END       &trans    &trans  &mkp MB4          &mkp MB1     &kp UP    &mkp MB2   &mkp MB5
                 &kp LEFT_SHIFT  &trans          &trans          &trans           &trans        &trans    &trans  &trans            &kp LEFT     &kp DOWN  &kp RIGHT  &trans
                 &trans          &trans          &trans          &trans           &trans        &trans    &trans  &trans                                              &trans
            >;

            sensor-bindings = <&scroll_up_down>;
        };

includeの追加

Central側の.overlayに下記のincludeを追加します。moNa2の場合はmoNa2_R.overlayですね。

#include <input/processors.dtsi>
#include <input/processors/runtime-input-processor.dtsi>
#include <behaviors/battery_history_request.dtsi>

Peripheralの.overlayにも下記のincludeが必要です。moNa2_L.overlayですね。

#include <behaviors/battery_history_request.dtsi>


トラックボールの設定変更

runtime-input-processorに基づく記入法に変更する必要があります。特にPMW3610のドライバーの機能を使用している場合trackball_listenerをinput processorベースの記述法に変更する必要があります。

/ {
    trackball_listener: trackball_listener {
        compatible = "zmk,input-listener";
        device = <&trackball>;
        input-processors = <&mouse_runtime_input_processor>;

        /* スクロールレイヤー: 指定レイヤーでカーソル移動をスクロールに変換 */
        scroller {
            layers = <スクロールレイヤー番号>;
            input-processors = <&zip_xy_to_scroll_mapper &scroll_runtime_input_processor>;
        };
    };
};

私のmoNa2ではこのように追加しました。

/ {
    trackball_listener: trackball_listener {
        compatible = "zmk,input-listener";
        device = <&trackball>;
        input-processors = <&mouse_runtime_input_processor>;

        /* Layer 3 (ARROW): convert cursor movement to scroll */
        scroller {
            layers = <3>;
            input-processors = <&zip_xy_to_scroll_mapper &scroll_runtime_input_processor>;
        };
    };
};

ポイントはスクロールレイヤーを足す場合ここで書いておくということです。

また、デフォルトではおそらく下記のような表記で設定されていることと思います。

&spi0 {
    status = "okay";
    compatible = "nordic,nrf-spim";
    pinctrl-0 = <&spi0_default>;
    pinctrl-1 = <&spi0_sleep>;
    pinctrl-names = "default", "sleep";
    cs-gpios = <&gpio0 9 GPIO_ACTIVE_LOW>;

    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 = <6>;
        scroll-layers = <3>;
    };
};

このうち、automouse-layer = <6>;やscroll-layers = <3>;と書かれているものはドライバの機能であり、input processorではないので削除する必要があります。scroll-layerについては先ほどlistenerのほうで設定しました。automouse-layerについては後からDYA Studioから編集可能です。

snippetの追加

build.yamlにstudio-rpc-usb-uartのsnippetを追加します。Central側に必要です。moNa2の場合は例えばこんな感じ。

include:
  - board: seeeduino_xiao_ble
    shield: moNa2_R rgbled_adapter
    snippet: studio-rpc-usb-uart
  - board: seeeduino_xiao_ble
    shield: moNa2_L rgbled_adapter
  - board: seeeduino_xiao_ble
    shield: settings_reset

これでDYA Studioに必要な修正は完了です。

Physical Layoutの追加

moNa2のリポジトリについて古いほうを使用している場合はデフォルトでphysical_layoutが設定されていないので、コンパイル時にエラーになります。moNa2のv2ファームウェアにはありますので、こちらから移植することにします。すでにv2ファームウェアを使用している方はこの作業は不要です。

#include <physical_layouts.dtsi>
/ {
    chosen {
        zmk,physical-layout = &physical_layout0;
    };

    physical_layout0: physical_layout_0 {
        compatible = "zmk,physical-layout";
        display-name = "default_layout";

        kscan = <&kscan0>;
        transform = <&default_transform>;

        keys  //                     w   h    x    y     rot    rx    ry
            = <&key_physical_attrs 100 100    0    0       0     0     0>
            , <&key_physical_attrs 100 100  100    0       0     0     0>
            , <&key_physical_attrs 100 100  200    0       0     0     0>
            , <&key_physical_attrs 100 100  300    0       0     0     0>
            , <&key_physical_attrs 100 100  400    0       0     0     0>
            , <&key_physical_attrs 100 100  800    0       0     0     0>
            , <&key_physical_attrs 100 100  900    0       0     0     0>
            , <&key_physical_attrs 100 100 1000    0       0     0     0>
            , <&key_physical_attrs 100 100 1100    0       0     0     0>
            , <&key_physical_attrs 100 100 1200    0       0     0     0>
            , <&key_physical_attrs 100 100    0  100       0     0     0>
            , <&key_physical_attrs 100 100  100  100       0     0     0>
            , <&key_physical_attrs 100 100  200  100       0     0     0>
            , <&key_physical_attrs 100 100  300  100       0     0     0>
            , <&key_physical_attrs 100 100  400  100       0     0     0>
            , <&key_physical_attrs 100 100  700  100       0     0     0>
            , <&key_physical_attrs 100 100  800  100       0     0     0>
            , <&key_physical_attrs 100 100  900  100       0     0     0>
            , <&key_physical_attrs 100 100 1000  100       0     0     0>
            , <&key_physical_attrs 100 100 1100  100       0     0     0>
            , <&key_physical_attrs 100 100 1200  100       0     0     0>
            , <&key_physical_attrs 100 100    0  200       0     0     0>
            , <&key_physical_attrs 100 100  100  200       0     0     0>
            , <&key_physical_attrs 100 100  200  200       0     0     0>
            , <&key_physical_attrs 100 100  300  200       0     0     0>
            , <&key_physical_attrs 100 100  400  200       0     0     0>
            , <&key_physical_attrs 100 100  500  200       0     0     0>
            , <&key_physical_attrs 100 100  700  200       0     0     0>
            , <&key_physical_attrs 100 100  800  200       0     0     0>
            , <&key_physical_attrs 100 100  900  200       0     0     0>
            , <&key_physical_attrs 100 100 1000  200       0     0     0>
            , <&key_physical_attrs 100 100 1100  200       0     0     0>
            , <&key_physical_attrs 100 100 1200  200       0     0     0>
            , <&key_physical_attrs 100 100    0  300       0     0     0>
            , <&key_physical_attrs 100 100  100  300       0     0     0>
            , <&key_physical_attrs 100 100  200  300       0     0     0>
            , <&key_physical_attrs 100 100  300  300       0     0     0>
            , <&key_physical_attrs 100 100  400  300       0     0     0>
            , <&key_physical_attrs 100 100  500  300       0     0     0>
            , <&key_physical_attrs 100 100  700  300       0     0     0>
            , <&key_physical_attrs 100 100  800  300       0     0     0>
            , <&key_physical_attrs 100 100 1200  300       0     0     0>
            ;
    };

    default_transform: keymap_transform_0 {
        compatible = "zmk,matrix-transform";
        columns = <11>;
        rows = <4>;
        map = <
            RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4)                     RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10)
            RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4)             RC(3,6) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10)
            RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5)     RC(3,7) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10)
            RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5)     RC(3,8) RC(3,9)                         RC(3,10)
        >;
    };

それで、古いファームウェアとキー数の定義が違うんですよね。古いほうではRC(1,5)というキーがありました。v2のほうにはないので、このキーの設定を.keymapから削除する必要があります。

動作確認

上記修正を適用後、リポジトリにプッシュすればgithub actionが走りコンパイルしてくれるはずです。左右両方のキーボードのファームウェアを書き直してDYA Studioにアクセスします。

ひとまずUSB接続で試してみましょう。

接続先を聞かれるのでmoNa2を選択。


この画面が出れば接続成功です。

DYA Studioでできること

Keymap編集画面です。ここに入る前に&studio_unlockのボタンを押していないと、押すように指示が出るので、押してから再読み込みします。
zmk studioを使ったことないので、私から使用感の比較の感想を述べることは難しいですが、keymap editorと比べてもサクサク使用できるかなと感じました。

トラックボールの設定もすいすいできちゃいます。

オートマウスレイヤーの設定もすいすいできちゃいます。すごい。


バッテリー残量やその履歴が見れます。これはファームウェア書き込んだばっかりなので、データが蓄積されていませんが。


BLEプロファイルの状態も確認できます。

電源管理系の設定もできます。

追記

スクロールレイヤーの変更にも対応したようです。  

最初から設定しようとすると少し躓きますので、あとから有効にするほうがいいかも。例えばスクロールレイヤーが3の場合は4つ目のビットを立ち上げるので8になります。

active-layers = <8>;  /* BIT(3) = layer 3 only */

追記2

エンコーダーにも対応したようです。

まとめ

以上、moNa2を例にDYA Studioを導入する方法をまとめました。キーマップを変更するたびにプッシュしてgithub actionを動かしてビルドして、ダウンロードしてからマイコンのリセットボタンを2回プッシュし、ドラックアンドドロップで書き込んで・・・、という手間がブラウザでぽちっと押すだけで完了してしまう快感、半端ないです。これを気にキーマップをガンガンいじってどんどん自分のキーマップを探求していこうかなと、そう思わせてくれる素敵なUI体験でした。
まだ利用されている方は多くはないかと思いますが、非常にいいツールですので上記内容を参考にぜひ導入してみてください。

この記事はCornix TBで書きました。

いいなと思ったら応援しよう!