Skip to content

Instantly share code, notes, and snippets.

@nuovotaka
Last active July 15, 2025 12:33
Show Gist options
  • Save nuovotaka/e08c1927ca04405b7fd337fd492e6145 to your computer and use it in GitHub Desktop.
Save nuovotaka/e08c1927ca04405b7fd337fd492e6145 to your computer and use it in GitHub Desktop.
Auto-kdk scroll-layers

Auto-KDKのトラックボールでスクロールを行うための変更方法

  • gistfile6 codespasesを利用する(コード変更しやすい) or オフライン(手持ちのPCで変更する:やや難易度高め)を一読しコードエディタでの変更をお願いします。

諸事情でどうしてもGithub上で変更を行いたい方

  • 次の手順で変更を一ファイル毎に行うことになります。この場合は、Actionが毎回動きますので時間が掛かってしまいます。ご了承ください。
  • west.yml -> prj.conf -> .overlay -> keymap.keymap

変更ファイルと変更手順等について

変更ファイル

  • gistfile2に記載の.overlay
  • gistfile3に記載のkeymap.keymap
  • gistfile4に記載のprj.conf
  • gistfile5に記載のwest.yml

変更手順とファームウェア

  • 上記のファイルをすべて変更します。
  • その後、コミット(github上にアップロードする行為をいいます)を行なってください。
  • すると、githubにてActionが動作します。
  • その後、ファームウェアが生成されますのでキーボードの書き換えを行なってください。

挙動がおかしい場合の変更方法について

  • gistfile6の上下左右が反転する場合をお読みください

トラボの付いている xxxxx.overlay file を変更

boards > shields > keyboard_name > xxxxx_right.overlay 右手側にトラボが付いていたらこちらのディレクトリ内に以下がある

  • trackball_listener で設定しているlayersはscroll-layerのレイヤー番号になります。
  • spi0 内の trackball について オプションの設定を必ず行なってください。

#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_transform (INPUT_TRANSFORM_XY_SWAP | INPUT_TRANSFORM_X_INVERT)>;

        scroll {
            layers = <5>;
            input-processors =
                <&zip_xy_transform (INPUT_TRANSFORM_XY_SWAP | INPUT_TRANSFORM_X_INVERT)>,
                <&zip_xy_to_scroll_mapper>;
        };
    };
};

.....
.....
.....

&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>;

        scroll-layers = <5>; // <- スクロールをさせる時にはこのoptionは必ずつけてください。番号:レイヤー番号
    };
};

&trackball_listener {
    status = "okay";
    device = <&trackball>;
};

keymap.keymap の変更

  • キーマップの Scrollレイヤー ですが、こちらは空のキーマップを用意してその下に sensor-bindings を記載します。 behaviors の ht_boot_reset は私の設定ですので、お気になさらないでください。

  • その下のmouse_xxxx以下をコピペしてください。

  • レイヤー0でどこかのキーにScrollレイヤーを割り当てないといけません。

  • それは keymap-editor などで設定してください。 私の場合は、「 &tog 5 」で設定しています。5はScrollレイヤーの番号です。 tog : トグルですので1回押下するとそのレイヤーに、もう一度押下すると元のレイヤーに戻るというものです。

#include <behaviors.dtsi>
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/pointing.h>

/ {
    behaviors {
        ht_boot_reset: ht_boot_reset {
            compatible = "zmk,behavior-hold-tap";
            label = "HT_BOOT_RESET";
            bindings = <&bootloader>, <&sys_reset>;

            #binding-cells = <2>;
            tapping-term-ms = <1000>;
        };

        mouse_scrl: mouse_wheel_scrl {
            compatible = "zmk,behavior-sensor-rotate-var";
            #sensor-binding-cells = <2>;
            bindings = <&msc>, <&msc>;

            tap-ms = <10>;
        };
    };

    keymap {
        compatible = "zmk,keymap";
        
        layer_0 {
            bindings = <
&kp ESC           &kp Q         &kp W             &kp E      &kp R  &kp T  &kp LEFT_BRACKET  &kp RIGHT_BRACKET  &kp Y      &kp U  &kp I      &kp O              &kp P          &mt DELETE BACKSPACE
&kp TAB           &kp A         &kp S             &kp D      &kp F  &kp G  &kp CAPS          &kp BACKSLASH      &kp H      &kp J  &kp K      &kp L              &kp SEMICOLON  &kp SQT
&kp LEFT_SHIFT    &kp Z         &kp X             &kp C      &kp V  &kp B                                       &kp N      &kp M  &kp COMMA  &kp PERIOD         &kp SLASH      &kp RIGHT_SHIFT
&kp LEFT_CONTROL  &kp LEFT_ALT  &kp LEFT_COMMAND  &kp SPACE  &to 1  &to 2  &to 3             &to 4              &kp ENTER  &to 0  &tog 5     &kp RIGHT_COMMAND  &kp RIGHT_ALT  &kp RIGHT_CONTROL
            >;
        };

        layer_1 {
            bindings = <
        .......
        .......
        .......
        
        Scroll {
            bindings = <
&trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans
&trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans
&trans  &trans  &trans  &trans  &trans  &trans                  &trans  &trans  &trans  &trans  &trans  &trans
&trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans
            >;

            sensor-bindings =
                <&mouse_scrl SCRL_DOWN SCRL_UP>,
                <&mouse_scrl SCRL_UP SCRL_DOWN>;
        };
    };
};

新規にkeymap.keymapと同じディレクトリに prj.conf を作ります

新規ファイル作成

  • config > prj.conf
  • 以下をコピペ
CONFIG_HEAP_MEM_POOL_SIZE=4096
CONFIG_ZMK=y

west.yml の変更

私のリポジトリ内にあるpaw3222のデバイスドライバー(マウスセンサーモジュールのソフトウェアの事です)を使用します。

manifest:
  remotes:
    - name: zmkfirmware
      url-base: https://github.com/zmkfirmware
    - name: nuovotaka
      url-base: https://github.com/nuovotaka
  projects:
    - name: zmk
      remote: zmkfirmware
      revision: main
      import: app/west.yml
    - name: zmk-driver-paw3222-alpha
      remote: nuovotaka
      revision: main
  self:
    path: config

コードの変更について

オンライン上(codespasesを利用する)で変更するかローカル上(お持ちのPCでコードを変更する)で行うか二通りの方法があります。 オンライン上での変更には、リソース(オンライン上での場所を確保する必要があるためある程度までは無料となっています。)が必要で料金がかかる場合があります。

  • codespasesの活用 こちらはオンライン上でコードの変更をするものです。リポジトリはgithub上に上げたモノをお使いください。

  • codespasesの利用と停止 こちらはcodespasesの利用開始と停止方法が解説されています。 終了するときは、コードをgithub上へコミット(アップロードのこと)してください。そして、codespasesを停止します。

  • 作業がある程度終わって一週間以上コードの変更をしない場合は、codespasesをdeleteした方が良いです。

上記コードを適用して上下左右が反転する場合

  • トラボを通常の状態で動かした場合に反転しているか?
  • スクロールボタンを押下した場合に反転しているか?

下記コードを xxxx.overlay ファイルで記述していると思うのですが、当方のケースデザインがセンサー位置を上にしている関係上、下記の記述でないとうまく動作しない状況です。

    trackball_listener: trackball_listener {
        compatible = "zmk,input-listener";
        device = <&trackball>;
        input-processors = <&zip_xy_transform (INPUT_TRANSFORM_XY_SWAP | INPUT_TRANSFORM_X_INVERT)>;

        scroll {
            layers = <5>;
            input-processors =
                <&zip_xy_transform (INPUT_TRANSFORM_XY_SWAP | INPUT_TRANSFORM_X_INVERT)>,
                <&zip_xy_to_scroll_mapper>;
        };
    };

上記コードについて

  • 最初の input-processors が通常のトラボの動きになります

  • scroll { この中の input-processors は } カーソルが停止し画面スクロールするときの挙動を記述するところになります。

  • INPUT_TRANSFORM_XY_SWAP xyを入れ替えるモノです

  • INPUT_TRANSFORM_X_INVERT x値の値を反転するモノです

  • 元のファームの場合は、通常のトラボの動きが下記のように記述されています。反転してしまった場合は下記のように変更してください。

        device = <&trackball>;
        input-processors = <&zip_xy_transform (INPUT_TRANSFORM_X_INVERT | INPUT_TRANSFORM_Y_INVERT)>;

最後に

  • キーボードの情報ソース:このはな技術室 さん
  • paw3222デバイスドライバー:AI活用によるコード補完
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment