目次 [ 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文の繰り返しに投げ込めるようになるので、結構シンプルなスケッチで収まります。
お試しください。