Arduino Mega 2560 LESSON:4 RGB LED
概要
RGB LEDでいろいろな色を光らせることができます。ひとつのパーツの中にRed LEDとGreen LEDとBlue LEDが入っていて、アノードが別々になっていて、共通カソードを持つパーツがスターターキットには入っていました。
4本の足を持つLEDです。短い脚、長い脚、短い脚、短い脚のようになるように置いたとき、
- Red LEDアノード端子、共通カソード端子、Green LEDアノード端子、Blue LEDアノード端子
の順番になります。LEDのときと同じように220Ωの抵抗をそれぞれのアノード端子の手前に置くと適度な電流を得ることができます。220Ωでとりあえず安全に動作するとELEGOOは言っています。信じましょう。謎のRGB LEDですね。
Arduino Mega2560 にはピン2~13、44、45、46のパルス幅変調(PWM:Pulse Wide Modulation)出力があります。このLESSONではそのパルス幅を調整することでそれぞれのR,G,Bの強さを変えています。0Vになる瞬間を増やすことで暗くする方向に働きます。
//www.elegoo.com
//2016.12.8
// Define Pins
#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 5 // fading time between colors
redValue = 255; // choose a value between 1 and 255 to change the color.
greenValue = 0;
blueValue = 0;
// this is unnecessary as we've either turned on RED in SETUP
// or in the previous loop ... regardless, this turns RED off
// analogWrite(RED, 0);
// delay(1000);
for (int i = 0; i < 255; i += 1) // fades out red bring green full when i=255
{
redValue -= 1;
greenValue += 1;
// The following was reversed, counting in the wrong directions
// analogWrite(RED, 255 - redValue);
// analogWrite(GREEN, 255 - greenValue);
analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
delay(delayTime);
}
redValue = 0;
greenValue = 255;
blueValue = 0;
for (int i = 0; i < 255; i += 1) // fades out green bring blue full when i=255
{
greenValue -= 1;
blueValue += 1;
// The following was reversed, counting in the wrong directions
// analogWrite(GREEN, 255 - greenValue);
// analogWrite(BLUE, 255 - blueValue);
analogWrite(GREEN, greenValue);
analogWrite(BLUE, blueValue);
delay(delayTime);
}
redValue = 0;
greenValue = 0;
blueValue = 255;
for (int i = 0; i < 255; i += 1) // fades out blue bring red full when i=255
{
// The following code has been rearranged to match the other two similar sections
blueValue -= 1;
redValue += 1;
// The following was reversed, counting in the wrong directions
// analogWrite(BLUE, 255 - blueValue);
// analogWrite(RED, 255 - redValue);
analogWrite(BLUE, blueValue);
analogWrite(RED, redValue);
delay(delayTime);
}
}
analogWrite関数は第一引数が出力するピン番号で第二引数が
\[ Duty≈\frac{analogWrite値}{255}×100[\text{%}] \]
で算出されるDuty比となるanalogWrite値を指定していることになります。
AIによる作図
Duty比とは上記のようなOnとOffの割合を示すもので、Onになっている割合が人間の目で色が点滅している時間の割合の変化により明るい状態だと感じるようになる現象を使って、その色の明るさを指定しています。Onのときの明るさは抵抗によってきめられた電流値にしたがって明るくなります。これはLESSON2で勉強した内容そのものです。
プログラムはRGBの全組合せ16,777,216通りの内の765通りを実験するものになっていて全体の0.00456%しか試していませんが、色相環のまわりをうまく辿っていて鮮やかです。
AIによる作図
上記のような経路を辿っています。
説明書によるLESSON3の内容はここまでですが、赤だけ100%、緑だけ100%、青だけ100%の3状態にしてそれぞれの色の\( V_FーI_F \)値を簡単に測定をしてみようと思います。
| 色 | 実測抵抗 | 抵抗電圧 VRV_R | LED電圧 VFV_F | 計算した IFI_F |
| Hyper Red | 9.95kΩ | 3.263V | 1.743V | 約0.328mA |
| Green | 9.94kΩ | 2.795V | 2.211V | 約0.281mA |
| Blue | 10.01kΩ | 2.520V | 2.486V | 約0.252mA |
で消費電力は
| 色 | 電流 | 抵抗の消費電力 | LEDの消費電力 | 総消費電力 |
| Hyper Red | 約0.328mA | 約1.070mW | 約0.572mW | 約1.642mW |
| Green | 約0.281mA | 約0.786mW | 約0.622mW | 約1.408mW |
| Blue | 約0.252mA | 約0.634mW | 約0.626mW | 約1.260mW |
白色100%なら総消費電力は4.310mW、電流は0.861mAですね。電力会社の従量部分だけに着目すると1年間つけっぱなしでちょうど1円くらいかかる電力です。