目次 [ Contents ]
LEDはArduinoで最初に扱うパーツです。基本的なパーツですが、今回はRGB(フルカラー)LEDの扱いについて書いてみます。
まず簡単に単色LEDから。
単色LEDを使う
電流の向き
スイッチを使ったLEDのON/OFFはArduinoで最初の頃に試すかと思います。
#define SW 5
#define LED 9
void setup() {
pinMode(SW, INPUT_PULLUP); // SWピンを内蔵プルアップ入力に設定
pinMode(LED, OUTPUT); // LEDピンを出力に設定
}
void loop() {
if (!digitalRead(SW)) // SWピンが0だったら
{
digitalWrite(LED, HIGH);
} else { // SWピンが0以外なら
digitalWrite(LED, LOW);
}
}
ボタンのON/OFFでLEDの点灯、消灯を制御する単純なスケッチです。大抵、ピンのOUTPUTをLEDに送る電圧にしてON/OFFを制御しますが、これは逆にも出来ます。
LEDに関するつなぎ方が逆になっていることに注意してください。
今度はボタンを押したときOFFになると思います。
これはArduinoのピンを電流の受け手にして、HIGHだとLEDからの5Vと均衡を保つので流れない。LOWにすると0Vになるので、LEDからの電流がArduinoのピンに入ってGNDに行く、という仕組みです。つまりピンのHIGH、LOWが電気の壁の役割を果たします。
これは3色LEDだと大切な知識になってくるので覚えておいてください。
analogWrite
digitalWriteでは単純なON/OFFしかできませんが、analogWrite関数を使えばLEDの明るさを調整できます。しかしこれは本当はアナログではなく、一定期間でオンオフを切り替えることで電気のトータル量を操作する仕組みです。PWMと呼ばれています。例えば1秒間の中で考えてみると、

LEDが高速点滅することになりますが、あまりに早いので人間の目には識別できず、結果明るさは青の面積(PWM幅)で変わることになります。
analogWrite(使用ピン, PWM幅 0 – 255);
そこで可変抵抗器を使い0-255段階で明るさの調整ができるものを作ります。
#define VOL A0
#define LED 9
int val = 0;
void setup() {
pinMode(VOL, INPUT); // VOLピンを入力に設定
pinMode(LED, OUTPUT); // LEDピンを出力に設定
}
void loop() {
val = val * 0.9 + analogRead(VOL) * 0.1; // VOLピンの値をvalに代入
byte led_luma = map(val, 0, 1013, 0, 255); // valを0-255に収めてled_lumaに代入
analogWrite(LED, led_luma); // led_lumaの値でPWM出力
}
これでLEDの明るさを調整できるようになります。
フルカラーLED
色の三原色
美術の授業でお馴染みだと思いますが、赤、緑、青の混ぜ加減で全ての色を表現できます。これをLEDでも同様に赤、緑、青まとめて扱えばフルカラーになるよ、と。つまりフルカラーLEDと呼ばれるものは3つLEDがセットになっているだけの話になります。
アノードコモン、カソードコモン
フルカラーLEDではほとんどの場合、足が4本しかないですが、これはRGB各色に対してVCC、またはGNDが共通になっているためです。
アノードコモン VCC(入力)共通
カソードコモン GND(出力)共通
これが分かれば、後は実際にスケッチを書いていくことが出来ます。
可変抵抗器でフルカラー調整LED
では、可変抵抗を3つ用意し、それぞれ赤、緑、青の値をいじって好きな色に出来る回路を作ります。自分の使うLEDのスペックを見てアノードかカソードか、必要な抵抗を確認してください。例ではアノードコモンのLEDを扱っています。
#define LED_R 9
#define VOL_R A0
#define LED_G 10
#define VOL_G A1
#define LED_B 11
#define VOL_B A2
byte inpt [3] = {VOL_R, VOL_G, VOL_B}; // 可変抵抗の入力ピン
byte leds [3] = {LED_R, LED_G, LED_B}; // 各カラーのLED出力ピン
short vals [3] = {0, 0, 0}; // 各可変抵抗器の値格納用変数
void setup() {
for (byte i = 0 ; i < 3 ; i++)
{
pinMode(leds[i], OUTPUT); // 出力LED設定
pinMode(inpt[i], INPUT); // 入力可変抵抗設定
digitalWrite(leds[i], HIGH); // 最初はLEDがOFFになるようHIGHに
}
}
void loop() {
for (byte i = 0 ; i < 3 ; i++) // 各カラー分繰り返し
{
vals [i] = vals [i] * 0.9 + analogRead(inpt[i]) * 0.1; // 可変抵抗の値読み取り
byte led_luma = map(vals[i], 0, 1013, 0, 255); // 読み取り値を0-255に収める
analogWrite(leds[i], led_luma); // 収まった値で光らせる
}
}
前述してきた単色LEDの工程をそれぞれの色のLEDに繰り返しているだけです。
配列を使うと0.赤、1.緑、2.青という順番をつけることができ、for文の繰り返しに投げ込めるようになるので、結構シンプルなスケッチで収まります。
お試しください。





