虹色イルミネーション [Arduino]
フルカラーLEDにグラデーションのような色の変化をさせてみようと思います。
こんな感じでRGBをそれぞれ変化させればいいのですが、この台形状の波形を1行のコードで表現してみたいと思いました。
そこで、、
aをある色が完全消灯から完全点灯になるまでの時間(台形の斜辺の部分の時間)とすると、
(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とします。
これをマクロ関数にすると、
1行で表現できました。
digital 9, 10, 11のPWMを使います。LEDとの間に適度な抵抗をはさんで
スケッチをアップロード!
再生できない場合、ダウンロードは🎥こちら
赤の発色がいまひとつ。計算上の抵抗値は問題なさそうなんだけど、、。
こんな感じでRGBをそれぞれ変化させればいいのですが、この台形状の波形を1行のコードで表現してみたいと思いました。
そこで、、
aをある色が完全消灯から完全点灯になるまでの時間(台形の斜辺の部分の時間)とすると、
(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との間に適度な抵抗をはさんで
// 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); } }
スケッチをアップロード!
再生できない場合、ダウンロードは🎥こちら
赤の発色がいまひとつ。計算上の抵抗値は問題なさそうなんだけど、、。
2011-07-18 22:24
nice!(0)
コメント(0)
トラックバック(0)
コメント 0