2012年4月2日月曜日

フルカラーLEDをランダムにスムーズに変化させる

NT京都2012の会場で販売していたフルカラーLED(直径8mm、LED705A1B、10個500円)を各色をランダムに決めた値になるまで、スムーズに変化させていきます。

まずはデータシート。アノードコモンのLEDです。
手持ちに220Ωがあるので、それの値で計算。
R   (5V-2.3V)÷220Ω≒12.2mA
G、B  (5V-3.3V)÷220Ω≒7.7mA
これで作ってみましょう。



◆配線

Fritzingに用意されてるフルカラーLEDとピンアサインが違うのでこうなっていますが、実際の配線にはピンアサインを確認してください。
カソードコモンのLEDなら、カソードをGNDへ。

◆Arduinoのスケッチ
int rnd_seed = 3;
int led_r = 3;
int led_g = 5;
int led_b = 6;
int led[3][4] = {
  {led_r,0,0,1},{led_g,255,255,1},{led_b,128,128,1}
};
int pin = 0;
int val = 1;
int target = 2;
int stp = 3;

void setup() {
  pinMode(led_r, OUTPUT);  pinMode(led_g, OUTPUT);
  pinMode(led_b, OUTPUT);
  randomSeed(analogRead(rnd_seed));
}

void loop(){
  for(int color = 0; color < 3; color++){
    if(led[color][val] == led[color][target]){
      led[color][target] = random(256);
      int led_diff = led[color][target] - led[color][val];
      if(led_diff>0){
        led[color][stp] = 1;
      }
      if(led_diff<0){
        led[color][stp] = -1;
      }
      if(led_diff==0){
        led[color][stp] = 0;
      }
    }
    analogWrite(led[color][pin], led[color][val]);
    led[color][val] += led[color][stp];
    delay(2);
  }
}


randomSeedについてはこちら
2次元配列に各色LEDのピン、現在値、ランダムで決まる目標値、ステップを格納します。
forループ内で、目標値(次の明るさの変化の最終値)を決め、現在値<目標値ならステップは+1、現在値>目標値なら-1。ランダムで同じ値が出たらステップ0にして次のループまで変化なし。
目標値に達すると次の目標値がランダムで決まります。

analogWriteで出力して、現在値にステップ値を加減して次の色のループに入ります。
アノードコモンなので、analogWriteの数値が大きくなると暗く、小さくなると明るくなります。カソードコモンのLEDなら数値が大きくなると明るくなります。

変化がわかりやすいように最後をdelay(2);にしていますが、飾りとしてならdelay(20);ぐらいが落ち着いた感じになるのではないでしょうか。次の動画はdelay(2);で撮影。



環境:ArduinoUno、Arduino1.0





0 件のコメント:

コメントを投稿