keyballのための はじめてのQMK firmware キーマップ作成編
前回の記事でQMK_firmware 0.18.17でのビルド環境が整いました。
さっそく、オリジナルのファームウェアを作っていきましょう。
編集するファイル
キーマップ作成で主に編集するのは、前回作ったyour_keymapフォルダ以下のファイルたちです。
keymap.c
これがキーマップのメインです。
キーの配置だけでなく、レイヤーや独自キーの設定などもここに書いていきます。
しかし、最初から欲張るとうまくいかないので、開発するときは少しずつ進めていきましょう。
rules.mk
QMKが提供する膨大な機能のうち、どれを使ってどれを使わないかを決めるためのファイルです。
config.h
rules.mkでは有効/無効だけを設定するのに対して、詳細な設定をするためのファイルがconfig.hです。
機能の細かい挙動などを設定することができます。
ファームウェア作成時に注意すること
最初から全部盛りしない
前項でも書きましたが、最初から欲張らないことが大切です。
ひとつずつやっていきましょう。
ファームウェアのサイズに注意する
keyballのファームウェアは、メモリ容量の少ないpro microでトラックボール、RGBLED、OLEDディスプレイを動かすために軽量化されています。
それでも機能を追加できる余裕は大きくないので、一部の機能はトレードオフになる可能性があります。
コンパイルが終わった際に全体のサイズと最大値に対する割合が表示されるので参考にしましょう。
自分が使いたい機能の中で、優先順位は決めておきましょう。
サンプル1. REMAPで使えるキーを増やす
手始めに、Twitterのkeyballコミュニティで要望の多かった、ボリューム/ミュートの有効化です。
テキストエディタでrules.mkを開くと、すでにこの3行が書かれているはずです。
RGBLIGHT_ENABLE = yes
OLED_ENABLE = yes
VIA_ENABLE = yes
ファイルの最後に↓この記述を追加して保存します。
EXTRAKEY_ENABLE = yes
編集後のrules.mkファイルはこのようになります。
RGBLIGHT_ENABLE = yes
OLED_ENABLE = yes
VIA_ENABLE = yes
EXTRAKEY_ENABLE = yes
この状態でyour_keymapをコンパイルすると、REMAPでSPECIAL→MEDIAキーを使うことができるようになります。
ファームウェアをコンパイル→書き込みして確認してみましょう。
サンプル2. TAP/HOLDの閾値を変更する
TAP/HOLDを設定したキーで、思ったタイミングよりHOLDになるのが遅くてTAP TAPになってしまったり、逆に早すぎて意図しないショートカットが発動するような場合に、HOLDに切り替わる時間を変更することができます。
テキストエディタでconfig.hを開いて、ファイルの最後に↓のコードを追加してください。
#define TAPPING_TERM 250
数字の単位はミリ秒です。標準では200msに設定されているので、好みの長さに変更しましょう。
文字キーのHOLDに装飾キー(Shift / Alt / Ctrl / Win / Command)を設定している場合、↓の設定をしておくのも良いかもしれません。
#define IGNORE_MOD_TAP_INTERRUPT
なお、TAP/HOLDの挙動を設定するためのオプションは他にもいくつかありますが、それだけで1記事書けるくらい複雑ですのでここでは割愛します。
興味のある方は公式ドキュメント(英語)を確認してみてください。
基本的には標準の挙動で困ることは無いと思います。
サンプル3. RGBLEDをレイヤーに連動させる
こちらはもう少し踏み込んだ内容です。
現在のレイヤーに合わせて、RGBLEDの色を変化させてみます。
keybap.cを開いて、↓この記述を探してください。
layer_state_t layer_state_set_user(layer_state_t state) {
// Auto enable scroll mode when the highest layer is 3
keyball_set_scroll_mode(get_highest_layer(state) == 3);
return state;
}
キー配列のすぐ下、56行目あたりにあると思います。
この" return state; "の直前に、↓のコードを挿入します。
uint8_t layer = biton32(state);
switch (layer) {
case 0:
rgblight_sethsv(HSV_RED);
break;
case 1:
rgblight_sethsv(HSV_BLUE);
break;
case 2:
rgblight_sethsv(HSV_GREEN);
break;
case 3:
rgblight_sethsv(HSV_WHITE);
break;
}
このようになります。
layer_state_t layer_state_set_user(layer_state_t state) {
// Auto enable scroll mode on layer 2
keyball_set_scroll_mode(get_highest_layer(state) == 3);
uint8_t layer = biton32(state);
switch (layer) {
case 0:
rgblight_sethsv(HSV_RED);
break;
case 1:
rgblight_sethsv(HSV_BLUE);
break;
case 2:
rgblight_sethsv(HSV_GREEN);
break;
case 3:
rgblight_sethsv(HSV_WHITE);
break;
}
return state;
}
このコードでは、文字レイヤーで赤、レイヤー1で青、2で緑、3で白に光ります。左右のMCUに同じファームを入れないと連動しませんのでそれだけ注意。
コードの中にある HSV_RED などを変更すれば、好きな色に変えられます。
使える色はQMKのドキュメントに一覧があります。
※色を指定するときはHSV_hogeで指定してください。詳しくは以前の記事で。