Skip to content

Instantly share code, notes, and snippets.

@nuovotaka
Last active July 27, 2025 13:03
Show Gist options
  • Save nuovotaka/67baa0a2bf006d5c735eb630dfedee3c to your computer and use it in GitHub Desktop.
Save nuovotaka/67baa0a2bf006d5c735eb630dfedee3c to your computer and use it in GitHub Desktop.
version 0.1.0 追加機能について

機能一覧

追加 機能名 レイヤー 任 意 説 明
カーソル移動 通常のカーソル移動
高精細カーソル移動 snipe-layers 大きなトラックボール操作でも細かく移動
スクロール(垂直) scroll-layers トラックボール操作(上下)で垂直画面スクロール
スクロール(水平) scroll-layers, scroll-horizontal-layers Shift+トラックボール操作(上下)で水平画面スクロール
高精細スクロール(垂直) scroll-layers トラックボール操作(上下)で高精細・垂直画面スクロール
高精細スクロール(水平) scroll-layers, scroll-horizontal-layers Shift+トラックボール操作(上下)で高精細・水平画面スクロール
  • 水平スクロールは、上方向で右に水平スクロール下方向で左に水平スクロールをします。(Win,Mac,Linax:標準的な動きになります)
  • 今までkeymapsensor-bindingsを記述していたが必要なくなりました。
  • スクロールレイヤーの追加時はKeymap-Editorなどツールを利用して&transで必要なキー数分を埋めていただければ大丈夫です。
    • .overlayファイルの変更などはそのまま必要です。

設定項目の汎用性

  • 分割式で左右にトラックボールを設置した時には以下の項目をそれぞれに設定できます。
  • 感度調節(全体の感度調節になります、あまり鈍くすると他で使いにくくなります)
    • 個々に適したマウスセンサーの調節(SCROLL_TICK数を増減することにより可能:標準10)
    • Tick数/サイクルで計算しているのでTick数を増やせば1サイクルあたりのトラックボールの移動量が増えるため感度が鈍くなる
  • マウスセンサー位置
    • ケースデザインによりマウスセンサーがトラックボールに対して回転している場合がある
マウスセンサー位置 回転角度 説明
ボール左、センサー右 0度 デフォルト
ボール下、センサー上 90度
ボール右、センサー左 180度
ボール上、センサー下 270度

設定例

  • 感度調節
    • scroll-tick = <20>;
  • マウスセンサー位置
    • rotation = <90>;
  • prj.confファイルの削除
    • 機能していなかった。!Bug!

変更ファイル一覧

  • これ以降の例は、トラックボールが右にある場合を想定しています。
    • xxxx.conf xxxx.overlay
ファイル名 場所 説明
west.yml config firmware作成のための構成
ボード名_right.conf boards > shields > split_ボード名 ボードの定義ファイル
ボード名_right.overlay boards > shields > split_ボード名 デバイスの構成
keymap.keymap config キー配列(積層構成と各キーの振る舞い割り当て)
prj.conf config ファイルを削除してください

west.ymlファイルの変更内容

manifest:
  remotes:
    - name: zmkfirmware
      url-base: https://github.com/zmkfirmware
    - name: nuovotaka
      url-base: https://github.com/nuovotaka
  projects:
    - name: zmk
      remote: zmkfirmware
      revision: v0.2.1
      import: app/west.yml
    - name: zmk-driver-paw3222-alpha
      remote: nuovotaka
      revision: main
  self:
    path: config
  • remotes:name: zmkfirmware はそのままにしてその下をname: nuovotakaにします
  • url-base: https://github.com/nuovotakaにします
  • projects: zmk内のrevision: -> v0.2.1へ変更してください。変更してある場合はそのまま。重要
    • zmkにてこれからファイル更新がされるようでActionsでエラーとならないために確認をしてください。
  • その下のremote: こちらを nuovotaka に変更。

xxxx.conf ファイルの変更

CONFIG_INPUT=y

デバイス名.overlayファイルの変更内容

  • 感度調節設定(スクロールの感度)
    • 個々にあったマウスセンサーの調節(SCROLL_TICK数を増減することにより可能:標準10)
    • scroll-tick = <10>;この数字を適宜変更してください
    • Tick数/サイクルで計算しているのでTick数を増やせば1サイクルあたりのトラックボールの移動量が増えるため感度が鈍くなる
  • マウスセンサー位置
    • ケースデザインによりマウスセンサーがトラックボールに対して回転している場合がある
マウスセンサー位置 回転角度 説明
ボール左、センサー右 0度 デフォルト
ボール下、センサー上 90度
ボール右、センサー左 180度
ボール上、センサー下 270度

#include <dt-bindings/zmk/matrix_transform.h>
#include <input/processors.dtsi>
#include <dt-bindings/zmk/input_transform.h>
#include "layouts.dtsi"


/ {
    chosen {
        zmk,physical-layout = &physical_layout0;
    };

...
... そのまま
...
    trackball_listener: trackball_listener {
        compatible = "zmk,input-listener";
        device = <&trackball>;
        // 通常カーソル移動
        input-processors =
            <&zip_xy_scaler 1 1>;

        // 高精細カーソル移動
        snipe {
            layers = <5>;
            input-processors =
                <&zip_xy_scaler 1 4>;
        };

        // 垂直スクロール
        scroll {
            layers = <6>;
            input-processors =
                <&zip_xy_to_scroll_mapper>;
        };

        // 水平スクロール
        scroll_horizontal {
            layers = <7>;
            input-processors =
                <&zip_xy_to_scroll_mapper>;
        };

        // 高精細垂直スクロール
        scroll_snipe {
            layers = <8>;
            input-processors =
                <&zip_xy_scaler 1 4>,
                <&zip_scroll_scaler 1 4>,
                <&zip_xy_to_scroll_mapper>;
        };

        // 高精細水平スクロール
        scroll_snipe_horizontal {
            layers = <9>;
            input-processors =
                <&zip_xy_scaler 1 4>,
                <&zip_scroll_scaler 1 4>,
                <&zip_xy_to_scroll_mapper>;
        };
    };
};

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


...
... そのまま
...
    
 
};

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

    trackball: trackball@0 {
        status = "okay";
        compatible = "pixart,paw3222";
        reg = <0>;
        spi-max-frequency = <2000000>;
        irq-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>;

        rotation = <90>;
        scroll-tick = <10>;
        snipe-layers = <5>;
        scroll-layers = <6 7 8 9>;
        scroll-horizontal-layers = <7 9>;
    };
};

&trackball_listener {
    status = "okay";
    device = <&trackball>;
};
  • snipe-layers 高精細カーソル移動(trackball_listener)とレイヤー番号は合わせてください

  • scroll-layers スクロールに関連するレイヤーは全て記入する

    • 垂直・水平・高精細(通常垂直、通常水平、高精細垂直、高精細水平)
  • scroll-horizontal-layers スクロールの中の水平スクロールに関するレイヤーを記入する

  • これまで、マウスセンサー位置が回転していた場合はその設定を記述していたが必要なくなった

    • 各レイヤーの感度調節を行うだけで良い(1/4, 1/6, 1/8, 1/10, 1/12, 1/16 ... この設定は感度を鈍くする設定です)
    • 必要に応じて反転などしてください
  • 高精細モードの時の設定

    • <&zip_xy_scaler 1 4> こちらのようにxy_scalerxy軸を同じ値によってスケールするやり方です。
    • <&zip_x_scaler 1 4> x軸のスケールを行うやり方もあります。軸別に設定した方はどうぞ。

レイヤーについて

  • レイヤー(積層)ということですが、ビルなど階層のある建物を思い浮かべてください

    • レイヤーは必ず0(デフォルト)から始まります。ビルで言うと1階ではなくGround floor(地上階)です。
    • 階層は順番に0,1,2,3....となっています。
    • コードで記述するときは個別にレイヤー名をつけたとしても順番に最初から数えて何番目にあるかを確認してください。
  • 下記はわかりやすくビルのように下から一覧にしますがコード記述するときは上から書いてください

階層 レイヤー名 説 明
9 Scroll_snipe_h 高精細・スクロール(水平)
8 Scroll_snipe 高精細・スクロール(垂直)Shift押下でレイヤー9に移動
7 Scroll_h 通常・画面スクロール(水平)
6 Scroll 通常・画面スクロール(垂直)Shift押下でレイヤー7に移動
5 Snipe 高精細カーソル移動
...
...
1 layer_1 レイヤー1
0 layer_0 デフォルトレイヤー&transにしてあると出力されるキー配列
  • Shiftキー押下でのレイヤー移動は&mo(押下中のみそのレイヤーに移動するというもの)

※ 左右にトラボを設置する場合は、それぞれのgpioなどの値を変更する必要がある。または、生成された時の値を利用するのでその場合は、左右で同じにならないように注意が必要です。

keymap.keymap の変更

  • Keymap-Editorなどのツールを使い変更をしてください
    • 下記はあくまでも例です。
階層 レイヤー名 説 明
9 Scroll_snipe_h 高精細・スクロール(水平)
8 * Scroll_snipe 高精細・スクロール(垂直)Shift押下でレイヤー9に移動
7 Scroll_h 通常・画面スクロール(水平)
6 * Scroll 通常・画面スクロール(垂直)Shift押下でレイヤー7に移動
5 Snipe 高精細カーソル移動
...
...
1 layer_1 レイヤー1
0 layer_0 デフォルトレイヤー&transにしてあると出力されるキー配列
  • Shiftキー押下でのレイヤー移動は&mo(押下中のみそのレイヤーに移動するというもの)
  • 6 から 9レイヤーのキー配列は&transで大丈夫ですが、*印をつけてあるレイヤーはShiftキーの設定を忘れない様にしてください。

prj.conf の削除

  • ファイルがある方のみ

config以下からprj.confファイルを削除します。

左右にトラックボールを設置した場合(参考例) .overlayファイルを変更する

右の.overlayファイル

trackball: trackball@0 {
    status = "okay";
    compatible = "pixart,paw3222";
    reg = <0>;
    ...
    ...
    
    irq-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
    
    rotation = <0>;         // 右は0度
    scroll-tick = <20>;        // 右のtick
    // ...他のプロパティ
};

左の.overlayファイル

trackball: trackball@0 {
    status = "okay";
    compatible = "pixart,paw3222";
    reg = <0>;
    ...
    ...
    
    irq-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
    
    rotation = <270>;         // 左は270度
    scroll-tick = <10>;        // 左のtick
    // ...他のプロパティ
};
@nuovotaka
Copy link
Author

  • 左右トラボ設置時のoverlayの設定例

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment