keyball39でRGBLEDをレイヤーに連動させた話

せっかくLEDの光がよく回りそうなJWK Ice Whiteを載せたので、フルカラーLEDを全部搭載してみました。予想通りにとても綺麗に光るので、LEDつけてよかったと思います。

ただ光らせるだけではもったいないので、レイヤーインジケータとして各レイヤーで違う色に光るようにしたい。
テンティングのせいで見えない+ファームウェアサイズの都合で無効化しているOLEDの代わりですね。

今まで作ったキーボードでRGBLED搭載できるモデルではやっていたので、便利さは知っていますし。

しかしQMKの公式ドキュメントの通りに設定したのにRGBレイヤーが動作しない。レイヤーは確かに切り替わっているのに、RGBレイヤーは反応していないんですよね。

検索で見つけた色々なことを試した結果、最終的には公式ドキュメントとはまったく違う方法で解決しました。  

公式ドキュメントのDefining Lighting Layersの部分は全部不要で、次のようにlayer_state_set_userだけでやりたかったことはできました。

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) == 2);

    // LOWER + RAISE = ADJUST のようなTri Layersを使う場合
    // これを先に書いておかないと3の色がおかしくなる
    state = update_tri_layer_state(state, 1, 2, 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;
}

*レイヤー番号や色指定は適宜変更してください。

注意点としては、rgblight_setrgbではなくrgblight_sethsvじゃないと左右が連動しないらしいということですね。

参考ページ↓

なぜドキュメント通りの実装が動作しないのかの原因については結局わかりませんでしたが、私は今回すべてのLEDを同じ色にしたかったので、この実装で目的は十分に達成できました。
*特定のキーや範囲だけ色を変えたい場合はこのdirect operationあたりの関数を使えばできるかもしれません。

追記

この方法、もしかしてと思って試してみたら、RGBレイヤーを使うときにconfig.hに記載する諸々が無くても動くっぽい。範囲指定とかしたいなら必要そうだけど。

rules.mkのこれだけで動く

RGBLIGHT_ENABLE = yes
RGBLIGHT_DRIVER = WS2812


config.hのこれら全部いらない

// #define RGBLIGHT_LAYERS
// #define RGBLIGHT_MAX_LAYERS 8
// #define RGBLED_NUM 46 // LEDの個数
// #define RGBLED_SPLIT { 24, 22 } // (分割キーボードの場合)左右それぞれに実装したLEDの個数

この記事が気に入ったらサポートをしてみませんか?