ErgoDoxEZのLEDLightingの光量調整を諦める

上手くいかなかった。
再現も出来なかった。
そのため、途中で投げ出した。

#愚痴(読み飛ばして)
いつも通り、愚痴から始まる。
[RGB Lightingマニュアル](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_rgblight.md "feature_rgblight.md")の最初に、説明していた(そもそも前回このページを見ていたような)。
ここまでめくらだと何も成就できそうにないと思ってしまう。
落胆しないためにも光量調整ぐらいは成就したい。

なに分、英語どころか日本語もおぼつかないため、英文は拒絶反応が出てしまう。
しかし、翻訳機を使って、眺めて・・・もとい、読み解いていこうと思う。

[前回の挫折](https://qiita.com/chesscommands/items/f694c1f35f421aceeed0 "ErgoDoxEZのLED Lightingの光らせたいが、そもそもLEDが何かを教えて")を乗り越えて・・・今回も懲りずに挫折。

#ErgoDoxEZのLEDLighting数
ErgoDox_ezディレクトリ配下のヘッダファイルに記載されていた。

```ErgoDoxEZ:config.h
/* ws2812 RGB LED */
#define RGB_DI_PIN D7
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 15     // Number of LEDs
```

![ErgoDoxEZのLED数.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/688d3841-f66d-ffb0-023e-9818a01f0b91.jpeg)

15個とのこと。
そして、データピン(RGB_DI_PIN)は`D7`とのことだが、これが何を表すのか分からない。

[TFT液晶LCD+AVRマイコンで自作フォントを表示](http://necotech.org/archives/531 "ネコ技術")
[キャラクターＬＣＤ表示ライブラリ](http://nekosan0.bake-neko.net/library_c_lcd.html "PIC AVR 工作室")

気にしなくて良さそうに思えてきた。

#彩度調整
今まで光量かと思っていたが、"彩度"が正しいようだ。

```ErgoDoxEZ:config.h
#define RGBLIGHT_LIMIT_VAL 50
```

この`RGBLIGHT_LIMIT_VAL`に、255までの好きな値を与えれば、その値の彩度になる。
しかし、私の想定した光り方とは異なる点灯になった。
しかも、不思議なことに、彩度の調整は、他にもある。

```ErgoDoxEZ:config.h
#define RGBLIGHT_EFFECT_BREATHE_MAX 50
```

この設定も彩度を下げる。

#問題点
前回の投稿では、LED30個あるうち、1つずつ色を設定したが、それでは今回の彩度調整が効果を発揮せず、最高彩度で光り輝いてしまう。
そのため、一斉点灯の関数`rgblight_setrgb`を使うことにした。

しかし、問題が・・・。
なぜ、他の人がレイヤー0で無色を設定しているのか再認識させられた。

1つのLEDに色を設定している場合、意識する必要は無かったため、忘れていた。
一斉点灯させる場合、不思議なことに、レイヤー0に戻したときも発光し続けている。
しかも、指示を出していない白色で・・・。
何故なのか・・・。

原因は、過去の設定を引きずるようだ。
そのため、全く関係の無い`〜〜〜.hex`を読み込み、今までの設定を上書きすればいいようだ。
素人の初期化方法は恐ろしいと思うかも知れないが、他にやり方を知らないのだから仕方ない。
ケーブルの抜き差しをしても効果が無かった。

##憶測だが・・・。
`rgblight_mode`を使わなければ、彩度は変更出来なかった。
そして、この関数を使えば、そもそもの色設定`rgblight_setrgb`が無効化され、白一色で30個のLEDが彩度が反映された状態で、`rgblight_mode`に指定したモーションをする。
故に、彩度を有効にしつつ色を指定する場合は、モーションを自前で用意しなければならないという結論に達した。
（うっそぉぉぉぉぉ）
そんな不便なことはないよね・・・。

モーションによっては、"ジーーーーーーーーー"と言う音が聞こえてくる。
怖い。

```ErgoDoxEZ:rgblight.c
void eeconfig_update_rgblight_default(void) {
  //dprintf("eeconfig_update_rgblight_default\n");
  rgblight_config.enable = 1;
  rgblight_config.mode = 1;
  rgblight_config.hue = 0;
  rgblight_config.sat = 255;
  rgblight_config.val = RGBLIGHT_LIMIT_VAL;
  rgblight_config.speed = 0;
  eeconfig_update_rgblight(rgblight_config.raw);
}
```

```ErgoDoxEZ:keymap.c
uint32_t layer_state_set_user(uint32_t state) {
　　　・
　　　・
　　　・
  switch (layer) {
      case 0:
        #ifdef RGBLIGHT_COLOR_LAYER_0
          rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0);
        #else
        #ifdef RGBLIGHT_ENABLE
          rgblight_init();　←ここで初期化処理が行われている.
```

![hue.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/b47d35b1-8d2d-a5fa-e74c-d159b43260ac.jpeg)
そのため、必ず白色になるようだ。
変更出来そうにない。

##今まで理解できなかった関数を使うのか？
`rgblight_sethsv_at`で色指定が出来る？
否
できない。
"HSV"が何かが分からない以上、解決できない。

RGBのような指定では無理だったから調べる必要がある。

##EEPROM
よく分からないまま`rgblight_enable`・`rgblight_disable`を使ってきた。
調べてもよく違いが分からない。
しかし、EEPROMに書き込む必要は無いんじゃないかと思い始めた。

そのため、下記2点を使うことにした。

* `rgblight_enable_noeeprom`
* `rgblight_disable_noeeprom`

結果変わらず、ダメなままだった。
レイヤー0で白色のLEDが30個点灯する。
このままでは、0x00を設定する羽目になる。
設定しても通電していなければ良いだけだが・・・。

ところで、EEPROMって何？
不揮発性だから何？
使わないから何？

なぜにみなはこの程度の説明で理解できるの？

LEDの点灯にEEPROMを使うのは大げさに思うのだが、気のせいか!?

電気関係の勉強をしている人であれば、理解してLEDを光らせることが出来るのだろう。
私は愚かにも不勉強が祟り、今調べても理解できないまま経験を積む。
知ってさえいれば解決できることを知らないがために遠回りに作業をするが、正解に近づいているかも分からない。
経験とは、以下に人間を捨てた行為かが分かる。
情けないが、EEPROM程度すら調べても理解できないのだからネズミやゴキブリのように経験を積んで、身につけていくことしか出来ない。
しかも、身につけた知識が正しいかどうかも分からない状態で・・・。

#0x00
ならば、通電していないのかどうか調べることにした。
[ＰＯＲＴ入出力](http://www008.upp.so-net.ne.jp/funfly/h8_2.html "ＰＯＲＴ入出力")

> 「０」で出力無し（０Ｖ）、「１」で出力有り（５Ｖ）ですから、0x00だとＬＥＤは全部消えた状態になります。

`rgblight_setrgb(0x00, 0x00, 0x00)`
でいいってこと!?
解決？

消えたことと通電していないことは関係ないからな・・・。
[７セグメントLEDを使った数値の表示](http://startelc.com/H8/H8_7seg.html "始める電子回路")

> IO.PDR2.BYTE = 0x00;   //#0   →LOW吸い込み通電   0000 0000

0x00で通電の説明に見えるのだが、気のせいか!?


そして、他にも疑問点はある。
[PIC内蔵EEPROMへのアクセスAdd Star](http://d.hatena.ne.jp/rinie/20091214/1260808229 "明日から本気出す( ´・ω・｀)")

> 内臓のEEPROMを使う利点は何といっても電源を切ってもデータが保持されるということ。そのため上記のような動作が可能となっています。

`rgblight_enable`や`rgblight_disable`は無駄だと言うこと？
`rgblight_enable_noeeprom`(`rgblight_disable_noeeprom`)で十分？

#動作確認1
彩度だけを落とす設定を行う。

```ErgoDoxEZ:config.h
#define RGBLIGHT_EFFECT_BREATHE_MAX 50
```

```ErgoDoxEZ:keymap.c
void matrix_init_user(void) {
	#ifdef RGBLIGHT_ENABLE
		rgblight_enable_noeeprom();
	#endif
};

uint32_t layer_state_set_user(uint32_t state) {
　　　・
　　　・
　　　・
      case 1:
　　　・
　　　・
　　　・
#ifdef RGBLIGHT_ENABLE
			rgblight_setrgb_at( 0x00,0x00,0x00, 0);
			rgblight_setrgb_at( 0x00,0x00,0x00, 1);
			rgblight_setrgb_at( 0x00,0x00,0x00, 2);
			rgblight_setrgb_at( 0x00,0x00,0x00, 3);
			rgblight_setrgb_at( 0x00,0x00,0x00, 4);
			rgblight_setrgb_at( 0x00,0x00,0x00,5);
			rgblight_setrgb_at( 0x00,0x00,0x00,6);
			rgblight_setrgb_at(0x00,0x00,0x00,7);
			rgblight_setrgb_at(0x00,0x00,0x00,8);
			rgblight_setrgb_at(0x00,0x00,0x00,9);
			rgblight_setrgb_at(0x00,0x00,0x00,10);
			rgblight_setrgb_at(0x00,0x00,0x00,11);
			rgblight_setrgb_at(0x00,0x00,0x00,12);
			rgblight_setrgb_cyan_at(13);
			rgblight_setrgb_at(0x00,0x00,0x00,14);
break;
      case 2:
　　　・
　　　・
　　　・
```

![動作確認1.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/be7d17d0-7a60-4d88-c5b1-d801f46e7221.jpeg)

彩度は落ちているように見えない。

#動作確認2

```ErgoDoxEZ:config.h
#define RGBLIGHT_LIMIT_VAL 50
```

`keymap.c`は、上記の動作確認1と同じ内容のため、省略。

![動作確認2.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/d644d8dc-4108-9580-5b3a-3b8750be3a76.jpeg)

全く彩度は低下していない。

#動作確認3
モードで光りを動かす・・・つもり...

```ErgoDoxEZ:config.h
#define RGBLIGHT_LIMIT_VAL 50
```

```ErgoDoxEZ:keymap.c
uint32_t layer_state_set_user(uint32_t state) {
　　　・
　　　・
　　　・
      case 1:
　　　・
　　　・
　　　・
#ifdef RGBLIGHT_ENABLE
			rgblight_setrgb_teal( );
			rgblight_mode(1);

　　　・
　　　・
　　　・
```

そもそも光らない。
一瞬の点滅だけで、それ以降は光らない。
一瞬なので撮影は不可能。

個別LED設定直後に`rgblight_mode`を設定したとき、コンパイルエラーが発生したため、光らせ方を変更せざるを得なかった。

#動作確認4
LED点灯有効化箇所の変更

```ErgoDoxEZ:config.h
#define RGBLIGHT_LIMIT_VAL 50
```

```ErgoDoxEZ:keymap.c
uint32_t layer_state_set_user(uint32_t state) {
　　　・
　　　・
　　　・
      case 1:
　　　・
　　　・
　　　・
#ifdef RGBLIGHT_ENABLE
#ifdef RGBLIGHT_ENABLE
			rgblight_enable_noeeprom();	// 有効

			rgblight_setrgb_magenta( );	// 色を変えている.
			rgblight_mode(1);
　　　・
　　　・
　　　・
```

これも一瞬だけ光って、あと沈黙...

#動作確認5
LED点灯有効箇所は、動作確認4と同じだが、EEPROMを有効にしてみた。

```ErgoDoxEZ:config.h
#define RGBLIGHT_LIMIT_VAL 50
```

```ErgoDoxEZ:keymap.c
uint32_t layer_state_set_user(uint32_t state) {
　　　・
　　　・
　　　・
      case 1:
　　　・
　　　・
　　　・
#ifdef RGBLIGHT_ENABLE
#ifdef RGBLIGHT_ENABLE
			rgblight_enable();	// 有効

			rgblight_setrgb_magenta( );	// 色を変えている.
			rgblight_mode(1);
　　　・
　　　・
　　　・
```

一瞬だけ光って、あと沈黙する。

#結論？(諦めた)
色の指定関係なしに、白色で光り続けるが、彩度が抑えられる事象が再現できなくなってしまった。

#KeyCode
QMKのページには、キーコード割り当て表も掲載されている。
`RGB_VAI`　彩度を上げる。
`RGB_VAD`　彩度を下げる。
この2つは、GUIで設定することができ、紫色や青色なども設定できる。
ためにしに動かしてみたら、紫色でLEDを光らせた後に、彩度調整のキーを押し下げたら確かに下がった。
しかし、紫色の彩度が下がるのではなく、白色としての彩度が変化したのであって、紫色は無視された。
意味の無い彩度下げ機能だと思う。

`RGB_HUI`　色相を増やす
`RGB_HUD`　色相を減らす
紫LED設定キー押下後に、このキーを操作するが、意味が無かった。
むしろ、何の機能なのか分からなかった。
このキー押下した瞬間に、LEDの光りが消え、全てのLEDが無灯火で沈黙したままだからだ。
このキー押下後に、紫設定キー押下をすれば、反映されているのかと思えば、そうではないようで、全く変わらなかった。
そもそも色相とは何？
手相のような物？

彩度の上下キーは、上記だけでなく、他にもある。
`RGB_SAI`　彩度を上げる
`RGB_SAD`　彩度を下げる
しかし、紫設定キー押下後に、このキーを押した場合、無灯火で沈黙してしまい、上記と同じように、彩度が変わったようにはならない。

`rgblight_increase_hue`や`rgblight_increase_sat`の関数は、上記のキーコードに紐付いていそうに思うのだが・・・。

#諦める
またしても前回同様諦めることになった。

以上。