先日作成した、MachiKania 用のキーバット(6ボタンの小型自作キーボード)をWebブラウザでキーマップを自由に変更できるVial に対応させましたが、今度はRP2040-Zeroにオンボードで搭載されているRGBLEDを光るようにしました。
なぜLEDを光らせるようにしたかというと、Vial対応でレイヤーも4つまで自由に設定できるので、現在どのレイヤーなのかをわかるようにRGBLEDを光らせて色でレイヤーが分かるようにしようという目的です。
ただ光らせるだけなら簡単で、下記を参考に各ファイルを修正すれば良いです。
この例では、ラズパイピコでGP16にRGBLEDを接続していますが、RP2040-Zero のオンボードLEDも内部で GP16 に接続されているので、そのまま使えます。
上記の記事中、 info.json は keyboard.json に読み替えます。
keyboard.json の
"features": {
の最後の行以降に下記(~省略~の次の行以降)を追加します。
LEDは1つしかないので、 led_count は 1です。
keyboard.json
"features": {
~省略~
"rgblight": true
},
"rgblight": {
"led_count": 1
},
"ws2812": {
"driver": "vendor",
"pin": "GP16"
},
そして、単に光らせるだけなら、keyboard.c に下記を追加すればよいです。
void keyboard_post_init_user(void) {
rgblight_sethsv(127, 255, 100)
}
ですが、ここでの目的はレイヤー毎にLEDの色を変えることなのでこれは追加しないでおきます。
レイヤー毎にLEDの色を変える方法をもう少し調べてみました。
参考になったのは、下記。
QMKの環境構築~レイヤ毎にLEDの光り方を変える #C - Qiita
この記事の中ほどにレイヤー毎にLEDの色を変える例がありますが、LEDのマトリックスを組んでいる例なのでLEDが1つの場合どうなるのかが分かりませんでしたが、AI(copilot) の手助けも借りてレイヤー毎に色を変える設定ができました。
まず、 vial\config.h に下記を追加します。
config.h (追加)
/* LED Setting */
#define RGBLIGHT_LAYERS // 機能の有効化
#define RGBLIGHT_LED_COUNT 1 // LEDの個数
#define RGBLIGHT_MAX_LAYERS 4 // (最大32)
#define LED_LAYOUT(LED0){LED0}
#define RGBLIGHT_LED_MAP LED_LAYOUT(0)
そして、vial\keyboard.c は下記のようにしました。(4ボタンの場合の例)
修正・追加が多いので1つ1つは説明しないでファイル全部を掲載。
keyboard.c
// Copyright 2023 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
#define MATRIX_ROWS 1
#define MATRIX_COLS 4
enum layer_number {
_1ST = 0,
_2ND,
_3RD,
_4TH
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* ┌──┬──┬──┬──┐
* │LEFT│RGHT│DOWN│ UP │
* └──┴──┴──┴──┘
*/
[_1ST] = LAYOUT(
KC_LEFT, KC_RGHT, KC_DOWN, KC_UP
),
[_2ND] = LAYOUT(
KC_LEFT, KC_RGHT, KC_DOWN, KC_UP
),
[_3RD] = LAYOUT(
KC_LEFT, KC_RGHT, KC_DOWN, KC_UP
),
[_4TH] = LAYOUT(
KC_LEFT, KC_RGHT, KC_DOWN, KC_UP
)
};
/////// LED Setting ////////
#ifdef RGBLIGHT_LAYERS
const rgblight_segment_t PROGMEM rgb_layer_1st[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, 0,0,100} // WHITE
);
const rgblight_segment_t PROGMEM rgb_layer_2nd[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, 170,255,100} //BLUE
);
const rgblight_segment_t PROGMEM rgb_layer_3rd[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, 85,255,100} //GREEN
);
const rgblight_segment_t PROGMEM rgb_layer_4th[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, 0,255,100} //RED
);
const rgblight_segment_t* const PROGMEM rgb_layers[] = RGBLIGHT_LAYERS_LIST(
rgb_layer_1st,
rgb_layer_2nd,
rgb_layer_3rd,
rgb_layer_4th
);
void keyboard_post_init_user(void) {
rgblight_layers = rgb_layers;
};
layer_state_t layer_state_set_user(layer_state_t state) {
rgblight_set_layer_state(0, layer_state_cmp(state, _1ST));
rgblight_set_layer_state(1, layer_state_cmp(state, _2ND));
rgblight_set_layer_state(2, layer_state_cmp(state, _3RD));
rgblight_set_layer_state(3, layer_state_cmp(state, _4TH));
return state;
}
#endif // RGBLIGHT_LAYERS
ポイントだけ説明すると、Vial対応まではレイヤーを定義しなくても自動的に4レイヤー使えるようになっていましたが、LEDの色をレイヤー毎に指定しないといけないので、レイヤーを _1ST _2ND _3RD _4TH という名前で作成。(レイヤー名は _ で始めるのが慣例らしい)
/// LED Setting /// 以降は完全にテンプレ。4レイヤーならレイヤー名だけ変えれば動く。
あ、あと RGBLIGHT_LAYER_SEGMENTS の指定は、HSVで指定して好みの色や明るさに設定することができます。
{0, 1, 0,0,100} // WHITE
の最初の {0, 1 は、1番目のLEDから1個目のLEDという意味で、LED1個しかないので全てこれを設定、後の残りの3つの数字がHSV。
HSVの指定方法は AI(copilot) に質問したら、分かりやすい回答だったのでそのまま貼っておく。

これでファイルの修正は完了。
コンパイル( make <keyboard_name>:vial )して RP2040-Zero に転送して動作確認します。
この例だとどのキーにもレイヤー変更をアサインしていないので、vial (https://get.vial.today/)でどれかのキーに Layers タブにある TO(1) とかを設定してレイヤーを変更するキーをアサインしてLEDの色が変わるのを確認します。
これでレイヤー毎にLEDの色を変更することができました。
よかった、よかった。
