1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Corne Cherry で LED とレイヤーキー同時押しを実装したかった

Last updated at Posted at 2022-12-08

久しぶりにキーマップを変えようと思ったら、ソースコードのバックアップが消失していたため、復旧に5時間近くかかったので戒め。大体自分用のメモ。

ソースコード

やったことはこっちに上げてるんで参考になればどうぞ。

やりたかったこと

  1. レイヤーキー同時押しで Adjust レイヤーに移行したい
  2. LED の色をセットしたい

やったこと

Adjustレイヤーの調整

keymap.c
#define L_BASE 0
#define L_LOWER 2
#define L_RAISE 4
#define L_ADJUST 8

// 先にレイヤー状態を定義しておく

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [L_BASE] = LAYOUT_split_3x6_3(
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
       KC_TAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                         KC_Y,    KC_U,    KC_I,    KC_O,   KC_P,  KC_MINS,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LCTL,    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                         KC_H,    KC_J,    KC_K,    KC_L, KC_SCLN, KC_QUOT,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LSFT,    KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,                         KC_B,    KC_N, KC_M,  KC_COMM, KC_DOT,  KC_RSFT,
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LALT, MO(L_LOWER),  KC_SPC, KC_ENT, MO(L_RAISE), KC_RSFT
                                      //`--------------------------'  `--------------------------'
                                                  // ↑ ここがMO(1) みたいな形になっていたので修正

細かい説明は省略するが、QMK ではレイヤーの状態はビット演算で表される。レイヤーキー同時押しを有効にするため、レイヤー番号の値を修正する必要がある。

2. update_tri_layer() を追加する

keymap.c

bool process_record_user(uint16_t keycode, keyrecord_t *record) {    

  update_tri_layer(L_LOWER, L_RAISE, L_ADJUST);
  // ここを追加

  if (record->event.pressed) { 
    set_keylog(keycode, record);    
  }  
  return true;
}

update_tri_layer()を追加してやることにより、レイヤーキー同時押しを有効化できる。仕様については以下を参考されたし。

LED のアニメーション制御

セットアップ全般についてはこちらを参照

1. RGB_MATRIX を有効化するため、rules.mk を修正

rules.mk
MOUSEKEY_ENABLE = yes    
RGBLIGHT_ENABLE = no

RGB_MATRIX_ENABLE = yes
# ここを追加

# RGB_MATRIX_ENABLE = no
OLED_ENABLE     = yes
OLED_DRIVER     = SSD1306
LTO_ENABLE      = yes

# ファームウェアの容量を削減するために宣言
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = no
LTO_ENABLE = yes

2. config.h を修正

  • その上で、設定したいアニメーションを、#define にて宣言しておく
  • 今回の場合、ENABLE_RGB_MATRIX_TYPING_HEATMAPと宣言し、アニメーションを設定した。
  • アニメーションについては以下を参考に

3. LEDの色を設定

  • config.hを修正したのみだと、LEDは赤色にしか光らないのでデフォルトの色を設定
keymap.c
bool oled_task_user(void) {
    rgb_matrix_sethsv(HSV_AZURE);
    // ここで色を HSV 形式でセットしてやる
    if (is_keyboard_master()) {
        
        oled_render_keylog();
    } else {
        oled_render_logo();
    }
    return false;
}
  • rgb_matrix_sethsv() にて色を設定する
  • この関数を呼び出す場所は特にこだわらなくても良い?
  • rgb_matrix_set_color_all() なんかを使うとLEDが激しくちらつくので注意
  • 色についてはこちらを参照

感想

バックアップはちゃんととろう。(戒め)
これで 3 台目組んでも大丈夫だね。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?