諸々の記録

その時々 興味にある事について

RP2040-Zeroで作成したQMK(Vial対応)キーボード(キーパッド)でLED発光させた

先日作成した、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の色を変更することができました。
よかった、よかった。