🔄

cocot46plusのロータリーエンコーダーへのキーコード割り当て

2025/03/01に公開

cocot46plus に搭載されたロータリーエンコーダーの操作、つまみを押す、反時計回りに回す、時計回りに回すのそれぞれへのキーコードの割り当て方法。

つまみを押した時の動作

つまみを押した時の動作はkeymap.cのkeymap配列でデフォルトでKC_MS_BTN3になっている所で指定できる。

make aki27/cocot46plus:default でファームをビルドして QMK Toolbox などで書き込むと反映される。

なお、その項目の左右にある KC_PGUP, KC_PGDN の所は飾りです。そこを変えてもつまみを回したときの動作は変わりません。

つまみを回した時の動作

そもそもデフォルトだと PageUp, PageDown ではなく音量のUp, Down の動作をしていて、keymap.cにはそんな指定をしている箇所はない。この動作は quantum/encoder.c で指定されている。

keymap.c で制御するには、rules.mk に ENCODER_MAP_ENABLE = yes と書いた上でencoder_map配列中の ENCODER_CCW_CW に反時計回り(counter-clockwise)、時計回り(clockwise)のキーコードを指定する。

手元では、 ENCODER_MAP_ENABLE = yes としてファームウェアをビルドすると、サイズが大きくなり、

$ make aki27/cocot46plus:default
  ...
Creating load file for flashing: .build/aki27_cocot46plus_default.hex                               [OK]
Copying aki27_cocot46plus_default.hex to qmk_firmware folder                                        [OK]
Checking file size of aki27_cocot46plus_default.hex
 * The firmware is too large! 28862/28672 (190 bytes over)
 [ERRORS]

make[1]: *** [check-size] Error 1
make: Make finished with errors
*** [aki27/cocot46plus:default] Error 1

のようにサイズ超過のエラーになってしまったので、ひとまず VIA_ENABLE = no とすることで回避した。

お試し中の encoder_map:

const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
    [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
    [1] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) },
    [2] = { ENCODER_CCW_CW(MS_WHLR, MS_WHLL) },
    [3] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN) },
    [4] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI) },
    [5] = { ENCODER_CCW_CW(XXXXXXX, XXXXXXX) },
    [6] = { ENCODER_CCW_CW(XXXXXXX, XXXXXXX) },
};

(追記)ファームウェアサイズの縮小

KoRoNさんの記事

https://zenn.dev/koron/articles/98324ab760e83a

を参考にしてOLEDの処理からsnprintfを外したら、他の機能を無効化せずともファームウェアビルドできるようになりました。

https://github.com/aki27kbd/qmk_firmware/pull/8

Discussion