leopardgeckoのブログ

Macの関連事項など

Planckキーボード:RGB LEDをコントロールする。

はじめに

今回は「Planck」といういわゆる40%キーボードの話です。

以前からPlanckを愛用しているのですが、最近Dropで予備として新たにPlanckを買い足したところ、今回のロットではなんとPCBにバックライト用のRGB LEDが装着されていました。全く知らずに買ったので嬉しい驚きでした。以前からもPCBにLEDをハンダ付けすれば一応は使える仕様になってはいたのですが、これがかなり難しいもので以前挫折してそれっきりになっていました。
これでついにハンダ付けをせずともレイヤーごとのLEDの色分け表示ができるようになったわけですが、QMK FirmwareのデフォルトのキーマップファイルにはLED関係の記述が全くないので自分で書き足さなければなりません。 QMK Firmwareのドキュメントを読めばおおよそのやり方はわかるのですが、実際に使おうと思うと多少の調べ物をしなければなりません。LEDを点灯するだけのことにそれは面倒なので、デフォルトのキーマップにそのまま追加できる形でLED用の記述を公開することにしました。
レイヤーごとのLED表示は以下のようなイメージです。(この動画はわたしが普段実際に使っているキーマップのもので、今回公開したものより複雑な動作になっています)

やり方

まず、config.hに以下の記述を追加します。
RGB LEDを光らせるだけならRGBLIGHT_ANIMATIONSを指定する必要はないのですが、これでADJUSTレイヤーにあるRGBmodキーが有効になって様々な点灯パターンを表示できるようになるので楽しいですよ。

#define RGBLIGHT_ANIMATIONS
#define RGBLIGHT_LAYERS


次に、keymap.cに以下の記述を追加します。
LOWERとRAISEレイヤーをオンにするとそれぞれLEDの色が変わります。ADJUSTレイヤーでは左右で色違いの設定にしてみました。
ここではRGB LEDの特徴を活かすために表示色をあえて自作していますが、もちろんドキュメントにあるようにHSV_REDなどのプリセットの色も使えます。色を自作する場合はHSVで指定するのですが、Hue, Saturation, Valueのいずれも[0-255]の範囲で設定する仕様のようです。こちらを参考にして設定してみると良いかと思います。
layer_state_set_userの部分はドキュメントの例ではupdate_tri_layer_stateを使う場合には難があるようなので自分なりに記述を変えています。

// 色をHSVで指定する(色は自作しなくても quantum/rgblight_list.h にあるHSV_REDなどが使える)
#define HSV_LOWER  150, 128, 255    // 青っぽい色
#define HSV_RAISE   14, 255, 255    // オレンジっぽい色

// LED用の各レイヤーで使用するLEDの番号と数と色を指定する。
const rgblight_segment_t PROGMEM my_lower_layer[] = RGBLIGHT_LAYER_SEGMENTS(  {0, 9, HSV_LOWER}  );
const rgblight_segment_t PROGMEM my_raise_layer[] = RGBLIGHT_LAYER_SEGMENTS(  {0, 9, HSV_RAISE}  );
const rgblight_segment_t PROGMEM my_adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS(
  {5, 4, HSV_LOWER},
  {1, 4, HSV_RAISE}
);

const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
    my_lower_layer,
    my_raise_layer,
    my_adjust_layer
);
void keyboard_post_init_user(void) {
    rgblight_layers = my_rgb_layers;
}

// LEDのレイヤーとキーマップで指定したレイヤーを対応させる
layer_state_t layer_state_set_user(layer_state_t state) {
    state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
    
    rgblight_set_layer_state(0, get_highest_layer(state) == _LOWER);
    rgblight_set_layer_state(1, get_highest_layer(state) == _RAISE);
    rgblight_set_layer_state(2, get_highest_layer(state) == _ADJUST);

    return state;
}

これで、レイヤーを切り替えるとLEDの色が変化するようになります。