Arduinoでアナログ出力
牛歩すぎてもう… ブログ初めて10日でまだLEDやってる。
さて今回は、LEDにアナログ信号を送り明るさを変化させてみる。
使用したのは ・RGB LED ・抵抗(330Ω) x3
RGB LEDには4本のリード線があり、一番長いのがGND、それ以外がR(赤)、G(緑)、B(青)の内蔵されたLEDに対応している。 個々のLEDに対するアナログ信号を連続的に制御することで、綺麗なイルミネーションができるというわけだ。
無数にある光の色のうち、特に、赤(Red)緑(Green)青(Blue)の3色を、目に見える光の中での、最も基本の色として「光の三原色」と呼んでいます。 これは、このわずか3つの色の組み合わせで、この世に存在するほとんど全ての色を作り出すことができるためです。
RGBの3色ですべての色が作れるということは、実はたいへん重要な意味があります。 例えばパソコンやテレビや携帯(けいたい)電話のディスプレイにカラー写真を表示する時、この3つの色についてだけ、どれだけの明るさで表示すればよいかの計算をしておけばすむわけです。 ディスプレイの画面を拡大して観察するとこの3色で表示されていることが確認できます。
さて、アナログ出力と言ったが、実はArduinoで制御しているのはPWM(Pulse Width Modulation)信号という疑似アナログ信号である。
ローム社のHPから図と説明を引用すると、
PWM(Pulse Width Modulation)信号とは、パルス幅を変えることで、FETなどの素子に流れる電流の時間を変化させ、ヒーターやモーターを制御する信号
である。
電圧High(H)とLow(L)の状態を一定のパルス周期で繰り返し、実効的な印可電圧を制御している。
つまり、実際は電圧High状態の時間とLow状態の時間で高速でLEDが明滅しているのだが、人間の目にはそれを認識できないため、明るさが変化しているかのように見える。
今回の回路とスケッチはこんな感じ。
// ピンの定義 #define BLUE 3 #define GREEN 5 #define RED 6 void setup() { pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(BLUE, OUTPUT); digitalWrite(RED, HIGH); digitalWrite(GREEN, LOW); digitalWrite(BLUE, LOW); } // define variables int redValue; int greenValue; int blueValue; // main loop void loop() { #define delayTime 10 // 次の色に変化するまでの時間 redValue = 255; greenValue = 0; blueValue = 0; for(int i = 0; i < 255; i += 1) // i=0-254で赤から緑に段階的に色が変化する { redValue -= 1; greenValue += 1; analogWrite(RED, redValue); analogWrite(GREEN, greenValue); delay(delayTime); } redValue = 0; greenValue = 255; blueValue = 0; for(int i = 0; i < 255; i += 1) // i=0-254で緑から青に段階的に色が変化する { greenValue -= 1; blueValue += 1; analogWrite(GREEN, greenValue); analogWrite(BLUE, blueValue); delay(delayTime); } redValue = 0; greenValue = 0; blueValue = 255; for(int i = 0; i < 255; i += 1) // i=0-254で青から赤に段階的に色が変化する { blueValue -= 1; redValue += 1; analogWrite(BLUE, blueValue); analogWrite(RED, redValue); delay(delayTime); } }
loop部は3つのセクションに分かれていて、すべて同様の動作をさせている。
初めは赤→緑に段階的に色を変化させる。
アナログ出力の制御にはanalogWrite()
関数を使用する。
analogWrite(ピン番号, DUTY比);
とすることで、アナログ出力を決定する。DUTY比は0-254の整数値である。
初めのセクションでは、赤の出力値を255、緑、青を0として、
forループ内で赤を-1、緑を+1してアナログ出力したのち、
delayTime
だけ待機して次のステップに移る、ということをしている。
2つめ、3つめのセクションについても同様。