SSブログ

虹色イルミネーション [Arduino]

フルカラーLEDにグラデーションのような色の変化をさせてみようと思います。
rainbow1.png
こんな感じでRGBをそれぞれ変化させればいいのですが、この台形状の波形を1行のコードで表現してみたいと思いました。
そこで、、
aをある色が完全消灯から完全点灯になるまでの時間(台形の斜辺の部分の時間)とすると、
rainbow2.png
(1) y = x
(2) y = x - 2a (グラフをy軸方向に下げる)
(3) y = | x - 2a | (絶対値をとる)
(4) y = - | x - 2a | (反転)
(5) y = 2a - | x - 2a | (y軸方向に上げる)
(6) min, max で 0~a までの間に収める、xは0~6a以内(6aの剰余で)

analogWriteでは0~255までの256段階の値をとりますが、値と値の間隔は255個なので、a=255とします。
これをマクロ関数にすると、
#define GET_RAINBOW(TONE,COLOR) (max( min( 510 - abs( ( (TONE) + 510 * (COLOR) ) % 1530 - 510 ), 255 ), 0 ))
    // TONE(色調) 0-1529, COLOR(RGBの選択) 0-2

1行で表現できました。
digital 9, 10, 11のPWMを使います。LEDとの間に適度な抵抗をはさんで
illumi328.jpg
// Full Color LED で 虹色イルミネーション

#define GET_RAINBOW(TONE,COLOR) (max( min( 510 - abs( ( (TONE) + 510 * (COLOR) ) % 1530 - 510 ), 255 ), 0 ))
    // TONE(色調) 0-1529, COLOR(RGBの選択) 0-2

void setup()   {
  pinMode( 9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop()
{
  for(int t=0; t<1530; t++) {
    analogWrite(  9, GET_RAINBOW(t,0) );
    analogWrite( 10, GET_RAINBOW(t,1) );
    analogWrite( 11, GET_RAINBOW(t,2) );
    delay(5);
  }
}

スケッチをアップロード!

赤の発色がいまひとつ。計算上の抵抗値は問題なさそうなんだけど、、。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。