DYA Studioを導入してみるぞ!moNa2編
DYA Studioというゲームチェンジャー

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: configzmkは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=10000Peripheral側の.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=10000Studio 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プロファイルの状態も確認できます。

電源管理系の設定もできます。
追記
スクロールレイヤーの変更にも対応したようです。
最新版ではスクロールレイヤーの定義も完全にwebから書き換えられるようになってます
— cormoran 🐬 (@cormoran707) February 10, 2026
修正例: https://t.co/nG0e9ZxsuH
最初から設定しようとすると少し躓きますので、あとから有効にするほうがいいかも。例えばスクロールレイヤーが3の場合は4つ目のビットを立ち上げるので8になります。
active-layers = <8>; /* BIT(3) = layer 3 only */追記2
エンコーダーにも対応したようです。
Rotary encoder 対応できた
— cormoran 🐬 (@cormoran707) February 11, 2026
9割からの仕上げに時間がかかったhttps://t.co/lQzgBaDIXkhttps://t.co/GuMwFavqXH#dya_studio pic.twitter.com/yXKUpi7CIT
まとめ
以上、moNa2を例にDYA Studioを導入する方法をまとめました。キーマップを変更するたびにプッシュしてgithub actionを動かしてビルドして、ダウンロードしてからマイコンのリセットボタンを2回プッシュし、ドラックアンドドロップで書き込んで・・・、という手間がブラウザでぽちっと押すだけで完了してしまう快感、半端ないです。これを気にキーマップをガンガンいじってどんどん自分のキーマップを探求していこうかなと、そう思わせてくれる素敵なUI体験でした。
まだ利用されている方は多くはないかと思いますが、非常にいいツールですので上記内容を参考にぜひ導入してみてください。
この記事はCornix TBで書きました。
