酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

色空間のお勉強(フルカラーLED制御 その1)

2016年10月18日 23時41分35秒 | マイコン(ESP32・Arduino等)

まじめにフルカラーLEDを点灯実験する前に勉強してみた。

RGB

 ・3原色を24bitで表したもの

 ・コンピュータ内部で用いられる形式

HSV

 ・色相(Hue)                      RGB連続カラー 0..360(0..100)で色を表す(スペクトル風)

 ・彩度(Saturation)            鮮やかさ。最低はグレー最高は各色

 ・明度(Value)                    明るさで黒から白へ変化のイメージ

の三つの成分からなる色空間

画像はWikiから借用

三角錐モデルの場合は、

 ・底辺(上)の円周縁がRGB最高彩度

 ・底辺(上)の水平が彩度で周辺ほど鮮やか 0..100

 ・頂点(下)が明度ゼロで黒 0..100

【適用分野】

 HSVは明るさや鮮やかさなど人間の直観的な捉え方に沿っているので、グラフィックデザイナーはHSVを利用する傾向と

【変換】

 Wikiの「HSV色空間」にRGBHSVの変換式ソースが掲載されている。

なるほど、今までの謎が解けましたわい。

 

Arduinoソフトウエア処理】

 ・RGBの値を各色ごとに0..255に変化させても思ったような連続的な色にならないのはHSV形式で変化させていないからカナ

HSVで数値を連続的に変化させて、HSV=>RGB変換をかけて連続的に明るさを変えるのが良さげではあるが、HのみでSVは無視したソースを発見

以下ソースのオリジナルサイト http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/RGBLED/RGBLED1.htm

 H   青を0にして、赤・緑を点灯し表示割合を変えていく

 H   赤を0にして、緑・青を点灯し表示割合を変えていく

 H   緑を0にして、青・赤を点灯し表示割合を変えていく

 と言った処理です。

     for (H=0 ; H          /* HSVのH値を各LEDのアナログ出力値(0-255)に変換する処理 */
          if (H                /* H値(0-120) 赤-黄-緑     */
               R = map(H,0,120,255,0) ;     // 赤LED R←→G
               G = map(H,0,120,0,255) ;     // 緑LED G←→R
               B = 0 ;
          } else if (H                /* H値(120-240) 緑-水色-青 */
               G = map(H,120,240,255,0) ;   // 緑LED G←→B
               B = map(H,120,240,0,255) ;   // 青LED B←→G
               R = 0 ;
          } else {
               /* H値(240-360) 青-紫-赤   */
               B = map(H,240,360,255,0) ;   // 青LED B←→R
               R = map(H,240,360,0,255) ;   // 赤LED R←→B
               G= 0 ;
          }
          analogWrite(9,R) ; analogWrite(11,G) ; analogWrite(10,B) ;
          delay(100) ;
     }

ブレッドボードでこねてみた。3色生産時期が全く違うLEDなので、明るさが大きく違う。

緑に至っては20年ぐらい前のLEDかな?

このソースの謎は常に一色は消灯しっぱなしなのだが、これを点灯させるとどうなんでしょ?(四の五の言わずにやってみれってさ)

15年ぐらい前に秋月で買って投げっぱだった3色混合式LED 一灯で200円(現時点秋月で40円程度、250円で1Wが買える)

もったいないので配線して光らせてみた。結構暗い・・・

一番もったいないのは使わないことです。 orz

これで以降の実験をしようかな。