5
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 5 years have passed since last update.

ErgoDoxEZのLEDLightingの明度調整方法について

Last updated at Posted at 2018-09-03

#ErgoDoxEZのLED Lighting調整
LED Lighting調整男と言えば、この私の出番かと^^

ErgoDoxEZを高い金出して買った癖して、放置するとは何事だ。
ましてや、LED Lighting付きを買って放置するとは許さんぞ・・・と。
数日間奮闘の末、ようやく本体裏面についているLEDを点灯させることに成功した。
やはり、答えはマニュアルに書いてあった。
※調査しながら執筆しているため、光量などが適切になされていない(気づいたのはかなりあと)。

vim.jpg

彩度調整のために、慣れない英語を眺めていたら英語の妖精が舞い降りて、教えてくれた。
もしかしたらキーボードの妖精かも知れない。
前回の投稿で、hue変数について、調べていたとき、もしかしたらと思い、ネットに助けを求めた。

ウィキペディア:HSV色空間
HSV (HSB) モデル
HSV 色空間から RGB 色空間への変換

マニュアルに使っていた文言がモロに出ていた。

#rgblight_sethsv_at
rgblight_setrgb_at関数のような扱いをすると思えば良いのだろうか。

Set a single LED to the given HSV value, where h is between 0 and 360, s/v are between 0 and 255, and led is between 0 and RGBLED_NUM (not written to EEPROM)

第1引数:H(色相 (Hue))
第2引数:S(彩度 (Saturation))
第3引数:V(明度 (Value))
第4引数:LEDの指定

##とりあえず発光させた。明度Value
どこに何を当てはめるのかは、四足動物のように、経験で得る。
(上を発光前・下を発光後にしたが、上画像はいらなかったな)

白色.jpg

keymap.c
	rgblight_sethsv_at(0, 0, 255, 0);	// ←これ.
	rgblight_sethsv_at(50, 0, 0, 1);
	rgblight_sethsv_at(0, 50, 0, 2);
	rgblight_sethsv_at(0, 0, 0, 3);
	rgblight_sethsv_at(0, 0, 200, 4);	// ←これ.
	rgblight_sethsv_at(100, 0, 0, 5);
	rgblight_sethsv_at(0, 100, 0, 6);
	rgblight_sethsv_at(0, 0, 0, 7);
	rgblight_sethsv_at(0, 0, 100, 8);	// ←これ.
	rgblight_sethsv_at(200, 0, 0, 9);
	rgblight_sethsv_at(0, 200, 0, 10);
	rgblight_sethsv_at(0, 0, 0, 11);
	rgblight_sethsv_at(0, 0, 50, 12);	// ←これ.
	rgblight_sethsv_at(255, 0, 0, 13);
	rgblight_sethsv_at(0, 255, 0, 14);

(ソースコードのどこに記載するのかは省略)

関数の第4引数に、LEDの指定番号を記載する。
第3引数には、明度を指定するため、何かしらの大きい値(>0)が設定されている箇所が光っている。

キーボードの左手側を裏返してみた場合、左端が0から始まり、右端が14で終わる。
明度のあるLEDは、0・4・8・12の4個だけだ。
他のLEDは、明度が0になっている。
明度があるLEDでは、第1・第2引数が0なので、色はついていないように見える。

##とりあえず色に強弱付けた。彩度Saturation
白色を使いたいだけならば、難しいHSVを使う必要は無い。
色ぐらい緩急付けたいと思う。
(明度は最大にした)

彩度.jpg
[]書きは、第2引数への値を示す。

keymap.c
	rgblight_sethsv_at(  0,   5, 255,  0);	// ←これ.
	rgblight_sethsv_at(  0,   0,   0,  1);
	rgblight_sethsv_at(  0,   0,   0,  2);
	rgblight_sethsv_at(  0,   0,   0,  3);
	rgblight_sethsv_at(  0,  50, 255,  4);	// ←これ.
	rgblight_sethsv_at(  0,   0,   0,  5);
	rgblight_sethsv_at(  0,   0,   0,  6);
	rgblight_sethsv_at(  0,   0,   0,  7);
	rgblight_sethsv_at(  0, 100, 255,  8);	// ←これ.
	rgblight_sethsv_at(  0,   0,   0,  9);
	rgblight_sethsv_at(  0,   0,   0, 10);
	rgblight_sethsv_at(  0,   0,   0, 11);
	rgblight_sethsv_at(  0, 255, 255, 12);	// ←これ.
	rgblight_sethsv_at(  0,   0,   0, 13);
	rgblight_sethsv_at(  0,   0,   0, 14);

ほぼ、違いが分からない。
唯一12番目の255を設定した赤っぽくなっているのは、区別がつく。
それ以外は、白っぽい色に見える。

##とりあえず鮮やかにした。色相Hue
白一色でもなければ、赤一色にしたいわけでもない。
色を付けたい。
(そして、ピントをどこに合わせれば良いのか分からず、見にくいままという・・・。)

色相.jpg
[]書きは、場所を示す。
3種類の数字の羅列は、引数への値を示す。

keymap.c
	rgblight_sethsv_at( 50,   5, 255,  0);	// ←これ.
	rgblight_sethsv_at(  0,   0,   0,  1);
	rgblight_sethsv_at( 50, 255, 255,  2);	// ←これ.黄色っぽい
	rgblight_sethsv_at(  0,   0,   0,  3);
	rgblight_sethsv_at(100,  50, 255,  4);	// ←これ.
	rgblight_sethsv_at(  0,   0,   0,  5);
	rgblight_sethsv_at(200, 255, 255,  6);	// ←これ.青色っぽい
	rgblight_sethsv_at(  0,   0,   0,  7);
	rgblight_sethsv_at(200, 100, 255,  8);	// ←これ.
	rgblight_sethsv_at(  0,   0,   0,  9);
	rgblight_sethsv_at(  0,   0,   0, 10);
	rgblight_sethsv_at(  0,   0,   0, 11);
	rgblight_sethsv_at(355, 255, 255, 12);	// ←これ.赤色っぽい
	rgblight_sethsv_at(  0,   0,   0, 13);
	rgblight_sethsv_at(  0,   0,   0, 14);

明度は、適量が良いな。
彩度は最大にして問題ないようだ。
問題は色相だ。
微妙な数字加減で色が変わるというのが分かりかけてきた。

##多彩な色を奏でる
HSVを構成する要素の解説を見ながら色を設定した。
想定外なのは、360が赤になると思っていたが、発光しなかった点だ。

360は発光無し.jpg

keymap.c
	rgblight_sethsv_at(  0, 255, 255,  0);	// 赤っぽい
	rgblight_sethsv_at(  0,   0,   0,  1);
	rgblight_sethsv_at(300, 255, 255,  2);	// 紫っぽい
	rgblight_sethsv_at(  0,   0,   0,  3);
	rgblight_sethsv_at(190, 255, 255,  4);	// 水色っぽい
	rgblight_sethsv_at(  0,   0,   0,  5);
	rgblight_sethsv_at( 60, 255, 255,  6);	// 黄色っぽい
	rgblight_sethsv_at(  0,   0,   0,  7);
	rgblight_sethsv_at( 30, 255, 255,  8);	// 尿っぽい黄
	rgblight_sethsv_at(  0,   0,   0,  9);
	rgblight_sethsv_at(130, 255, 255, 10);	// 緑っぽい
	rgblight_sethsv_at(  0,   0,   0, 11);
	rgblight_sethsv_at(250, 255, 255, 12);	// ババ臭い紫
	rgblight_sethsv_at(  0,   0,   0, 13);
	rgblight_sethsv_at(360, 255, 255, 14);	// 発光無し(赤と思ったが)

表と見比べなくてもRGBとHSV・HSBの相互変換ツールがある。

##決まり切った色を使う。
過去投稿に、すでに用意されたRGB色を使ったことがある。
それが今回のHSVも用意されている。

カラフル.jpg
残りのLED.jpg

keymap.c
	rgblight_sethsv_white_at(      0 );
	rgblight_sethsv_red_at(        1 );
	rgblight_sethsv_coral_at(      2 );
	rgblight_sethsv_orange_at(     3 );
	rgblight_sethsv_goldenrod_at(  4 );
	rgblight_sethsv_gold_at(       5 );
	rgblight_sethsv_yellow_at(     6 );
	rgblight_sethsv_chartreuse_at( 7 );
	rgblight_sethsv_green_at(      8 );
	rgblight_sethsv_springgreen_at(9 );
	rgblight_sethsv_turquoise_at( 10);
	rgblight_sethsv_teal_at(      11 );
	rgblight_sethsv_cyan_at(      12 );
	rgblight_sethsv_azure_at(     13 );
	rgblight_sethsv_blue_at(      14 );
・以下残りの
	rgblight_sethsv_purple_at(  12);
	rgblight_sethsv_magenta_at( 13);
	rgblight_sethsv_pink_at(    14);

ぱっと見た感じの感想は・・・見にくい。
もう少し何とかならないのか・・・。
明度が強いのが原因か!?
しかし、用意されているHSVは、値を変更することが出来ないため、参考までにとどめるべきか。
場所は、過去の投稿で示したとおり、rgblight_list.hに記載されている。

##決まり切った色の明度を落とす
上記のヘッダ内容を参考に、明度を落とそうと思ったが、goldenrodturquoisetealなどすでに明度が落とされている。
そのため、私がやりたかった光量調整とは違う意味なのかも知れない。
明度を落とした場合、違う色になるということだよね...
そもそも明度とは、その名の通り、色の明るさのこと。
明るければ、白に近くなり、暗ければ黒に近くなる。
よくよく考えれば、そこまでぎらぎら光っているように思えなかったことも関係あるかも知れない。

ちくび.jpg

keymap.c
	rgblight_sethsv_at (  0, 255, 255, 0);	// ←これHSV.
	rgblight_setrgb_at( 0x00,0x00,0x00, 1);
	rgblight_setrgb_at( 0x00,0x00,0x00, 2);
	rgblight_setrgb_at( 0x00,0x00,0x00, 3);
	rgblight_setrgb_at (0xFF, 0x00, 0x00, 4);	// ←これRGB.
	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, 0xFF, 8);	// ←これRGB.
	rgblight_setrgb_at(0x00,0x00,0x00,9);
	rgblight_setrgb_at(0x00,0x00,0x00,10);
	rgblight_setrgb_at(0x00,0x00,0x00,11);
	rgblight_sethsv_at (240, 255, 255, 12);	// ←これHSV.
	rgblight_setrgb_at(0x00,0x00,0x00,13);
	rgblight_setrgb_at(0x00,0x00,0x00,14);

全然光量が違う。
やはり、私がやりたかったことは、'光量調整'だな。
RGB指定で、光量調整したい欲求が出てきた。

##光量調整
今までの検証は、全て失敗した。
過去の設定を見直しておらず、比較できない作業をしていた。
今更気づいたが、今後は正式な検証をするため、上記は参考程度にとどめてくれたらと思う。
(正式な検証とは?)

100パーセント.jpg

両端がHSVで、挟まれている2つがRGB。
失敗した理由は、光量を制限していたため...

config.h
#define RGBLIGHT_LIMIT_VAL 50

大分抑えていたため、RGBに比べて、HSVが弱い光りになっていた。
大変残念な行動力だと思う。
何が、経験だよ。

上記を無効化し、下記を有効化した。

config.h
#define RGBLIGHT_EFFECT_BREATHE_MAX 50

そうした場合、100%の光量でビッカビカに光り輝いていた。

RGBLIGHT_LIMIT_VAL The maximum brightness level
RGBLIGHT_EFFECT_BREATHE_MAX The maximum brightness for the breathing mode. Valid values are 1 to 255

google翻訳.jpg

単発の発光は、RGBLIGHT_LIMIT_VALが対応するようだな。

##以下"RGBLIGHT_LIMIT_VAL"の値変更
コンパイルめんどくさいorz
(値を変更する度に、コンパイルが必要)

config.h
#define RGBLIGHT_LIMIT_VAL xxx
keymap.c
	rgblight_sethsv_at (  0, 255, 255, 0);	// ←これ.
	rgblight_setrgb_at( 0x00,0x00,0x00, x);
	rgblight_sethsv_at (240, 255, 255, 12);	// ←これ.
	rgblight_setrgb_at(0x00,0x00,0x00,x);

###10とRGB
10は、光っているのかどうか判断できない。

10との混在.jpg

10パーセントのみの光り.jpg

しかし、部屋の電気を消し、直接LEDを目視すれば、美しい光を放つことが分かった。
当然、昼間はもとより、暗闇でも机の反射ですら気づかない程度の光りになる。
敏感な人でなければ、使わないテカリ具合だろう。
(2枚目の写真は、RGBを消している)

###20
10値とほぼ変わらない光量だった。

20パーセント.jpg

###30
ようやく、机の上に置いた状態でも暗闇で、机に光が反射して気づくことが出来るようになった。

30パーセント.jpg

###40
30値とほぼ変わらない。
部屋の電気を消したとは言え、ディスプレイの光りが入ってしまっているようだ。

40パーセント.jpg

###50
40値とほぼ変わらない。
やはり、机への光の反射はあるが、ブラインドタッチする場合は、ほぼ気づかない。

50パーセント.jpg

###60
50値より、少し光が強いかなという程度かな。

60パーセント.jpg

###70
う〜ん・・・60値と変わらないかな・・・。

70パーセント.jpg

よく考えたら最大255だった。
そのため、10刻みで増やしても変化があるわけないorz
今後は、一気に増やそう。

###100
70値と違いが分からない。机への反射は気づかないまま。
しかし、LEDを直接見ることが出来ないぐらい、強い光に変わった。

100%.jpg

###130
ある程度明るいが、まだ机において使うには、弱いかな。

130パーセント.jpg

###160
強い光が苦手であれば、この程度なら弱くもないので適度かな・・・と。
しかし、ブラインドタッチする場合は、やはり気づかない。
しかし、今回青と赤だから気づきにくいだけかも知れない。
2つだけだからな。

160パーセント.jpg

暗闇で光らせたとき、物に光が当たり、陰が出来るほどの強い光になっている。
10値の時は、光が弱くて、影が出来ないからちょっとした進歩かな。

###190
160値とそこまで違いは無いかな。

190パーセント.jpg
190の陰.jpg

  • 10の値で、陰を作ろうとしたが、ディスプレイの光りで影が出来ただけだったようだ。
    10の陰.jpg

###220
光りは強いが、まぶしいほどではない。
しかし、直接見るのは止めた方が良い。

220パーセント.jpg

青や赤で、1つずつは、失敗だったかも知れない。
そこまで違いが分からない。
また無駄なことを・・・"経験することほど愚かなことはない"を地で行く男が私だ。

###230
徐々に光を強くしたため、違いが全く分からない。
10と比べれば、強いはずなのだが、ゆっくりした変化は気づきにくい。
茹でガエル症候群に陥ってしまった。

230パーセント.jpg

RGBの光りを隣に置いて、比較させた方が良かったかな・・・。

###240
230値との違いは分からない。
(私の意見を信じないこと)

240パーセント.jpg

###250・255
240値との違いは無いんじゃないかな。

250と255.jpg

###結論
ErgoDoxEZは、キーボード設定が好きにできるのだからその日の気分で変えよう。
光量を気にしたところで、その日の体調によって変わるだろうから今良くても数分後には不快になるかも知れない。
不快な光量でも数日後には素敵だと思うかも知れない。

###その他
撮影技術というか、カメラの性能が悪くて、ピントが合わない。
光り具合の変化で、同じ物を2枚撮影したこともある。
上下2枚になって(説明も無く)掲載しているのは、撮影角度やピントを変えているだけ。同じソースコードを使っている。

#rgblight_sethsv_noeeprom
rgblight_setrgb関数のような扱いをすると思えば良いのだろうか。

Set all LEDs to the given HSV value where h is between 0 and 360 and s/v are between 0 and 255 (not written to EEPROM)

今回は、RGBではなく、HSVを使うと言うこと。上記の関数とは違い、LEDの指定はない。
これは、1つの関数だけで、30個のLED全てが設定できるというもの。

keymap.c
	rgblight_sethsv_noeeprom (  0, 255, 255);

(ソースコードのどこに記載するのかは省略)

red.jpg

第3引数が明度とは言え、光量調整は別にある。
そのため、255が最大で、上記の光りは、120にまで落としての表示になっている。
最大光量ではないことに注意されたし。

config.h
#define RGBLIGHT_LIMIT_VAL 120

このヘッダで、光量調整を行う。

##決まり切った色を使う。
上記関数に用意された色があるように、今回の関数にも用意された色がある。
上記で全部の色を表示させたため、今回は1色だけにとどめる。
(要望があれば、1つずつしようと思う。無職(色)だから好きな色を付けられるorz)

今回選んだのは、緑色だ。
引数の指定も無く、関数名だけで使えるのはありがたい。

keymap.c
	rgblight_sethsv_noeeprom_green();

(光量は上記と同じ120だ)
green.jpg

決まり切った色が宣言されているヘッダファイルは、過去に呟いたとおりrgblight_list.hにある。

#注意点
光が強いため、LEDは直接見ない方が良い。
机において光らせるため、同じ状況で確認した方が良い。
結構目が痛くなる。

##反省
調べるにしてもスケジュールなどの目処を建てた上で調べなければ、無駄な作業になるのが分かった。
光量調整対象の関数とは思わなかった。
実に残念だよ。
反省ですらないのかな。
兎に角、検証する場合は、まっさらな状態から始めなければならないと言うことだな。

#まとめ(ソースコード)
上記で使ったソースコード
xxxになっている箇所が、個人で好きな値を設定する場所になる。
(今回の件に関係の無い箇所は削除している)

config.h
#define RGBLIGHT_LIMIT_VAL xxx
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_sethsv_at ( xxx, xxx, xxx, x);
	rgblight_sethsv_blue_at( xx );
#endif
   ・
   ・
   ・
        break;

気になるのは、レイヤーは何層まで対応しているのだろうか。
前面は、7層までだったかな。
では、背面は?
case文を増やせば対応可能?

##気になった光り速度
左右分離型のため、接続するためのケーブルが存在する。
そのためなのか分からないが、光らせるときにタイムラグが発生し、右側より左側が遅く光るように思う。
(右側がパソコン本体に接続されているため?)
今回は、"not written to EEPROM"を使ったからか?
(キーボード本体に設定している以上、ケーブル関係ないと思うのだが・・・)

##設定が面倒
既製品であれば、ここまで細かく設定しようとは思わなかったはず。
制限がある方が楽が出来る。
そのことを考えれば、HHKBは完璧なんだと思う(不満も多くなるけど)。

次は、自作キーボードに挑戦したいが、既製品も手に入れたい。
裕福な人がいたら提供して頂けないだろうか。
Ultimate Hacking Keyboard – The keyboard. For professionals.

今後

やはり、しつこいようだが、左右分離しているのだから左右分離してLEDを光らせたい。
あぁマニュアルを読めば、書いているのだろうか。
探すのが大変だ。
英語の勉強が大事だと分かるよ。
C言語が分かれば、ソースコードから出来るかどうかも判断できるだろう。

参考動画

ErgoDoxEZキーボードとは違うが、左右で時差を付けて光らせる動画を見つけた。
split planck rgb
動画のタイトルとはあわないが、Let's Split(レツプリ)だよね。

Let's Split with Adafruit NeoPixel Sticks

これでできるのだからErgoDoxEZでもできるはず。

やはり、操作者の技術力によるところがおおきいのだろう。

市販品の光り方

QMKを使っていないと思われるLEDの光り方が掲示板にあがっていたため、確認した。
これが専門家の技術力なのだろうと痛感させられたよ。

そう思っているのだが、Artemisを使うことで実現できるようだ。
何これ?

QMKとは別物なのは分かるが、個人作成の結晶?

既存での光り方

ErgoDox EZ Shine Keyboard Review!にて、光らせ方が鮮やかで興味がわいてしまう。
しかし、片方だけを光らせることはしていない。
私以外にも片側ずつを光らせたいと願う人がいる.
  Setting individual RGB LED's for under glow
やはり、何かしらの技術力が無ければ出来ないのか、もしくは根本的に出来ないのか・・・。
その判断すら出来ない技術力に呆れてしまう・・・やはり、勉強は大事だよ。
レディット掲示板を眺めていたらできそうな気配が・・・。

左右分離の点灯

やはり猛者がいる。
https://twitter.com/bronzegears/status/1069802275927982081
どう甘く見ても左右で色が違うように見える。

勘違いか?

いままで左右分離した状態でLEDを光らせていると思っていた。
しかし、左右分離した光り方に見えるだけなのではないかと自覚した。
Split Tester光り方を確認したときに、そう感じた。
(私の言いたいことはつかんで頂けただろうか)

具体的には、タイムラグと言うか、徐々に光らせているだけで、完全分離に見えないんだよな・・・。
猛者の光らせ方は完全分離に見えるし・・・。
今のところ私にはその技術が無いと言うことは確実だ。

QMKファームウェアのRGB Matrix Lightingを確認すれば分かる?
他の人は、キー押下で光らせたい欲求があるようだ。

以上。

5
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
5
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?