Release 2016.9.18 / Update 2016.12.31

(日本語) フルカラーLEDを使う

Sorry, this entry is only available in 日本語. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

LEDはArduinoで最初に扱うパーツです。基本的なパーツですが、今回はRGB(フルカラー)LEDの扱いについて書いてみます。

まず簡単に単色LEDから。

単色LEDを使う

電流の向き

スイッチを使ったLEDのON/OFFはArduinoで最初の頃に試すかと思います。

1color_led_1_breadboard

#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を制御しますが、これは逆にも出来ます。

1color_led_2_breadboard

LEDに関するつなぎ方が逆になっていることに注意してください。

今度はボタンを押したときOFFになると思います。

これはArduinoのピンを電流の受け手にして、HIGHだとLEDからの5Vと均衡を保つので流れない。LOWにすると0Vになるので、LEDからの電流がArduinoのピンに入ってGNDに行く、という仕組みです。つまりピンのHIGH、LOWが電気の壁の役割を果たします。

これは3色LEDだと大切な知識になってくるので覚えておいてください。

analogWrite

digitalWriteでは単純なON/OFFしかできませんが、analogWrite関数を使えばLEDの明るさを調整できます。しかしこれは本当はアナログではなく、一定期間でオンオフを切り替えることで電気のトータル量を操作する仕組みです。PWMと呼ばれています。例えば1秒間の中で考えてみると、

pwm_anim
PWMイメージ(実際のパルス幅ではありません)

LEDが高速点滅することになりますが、あまりに早いので人間の目には識別できず、結果明るさは青の面積(PWM幅)で変わることになります。

analogWrite(使用ピン, PWM幅 0 – 255);

そこで可変抵抗器を使い0-255段階で明るさの調整ができるものを作ります。

1color_led_3_breadboard

#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がセットになっているだけの話になります。

3colors

アノードコモン、カソードコモン

led_illust

フルカラーLEDではほとんどの場合、足が4本しかないですが、これはRGB各色に対してVCC、またはGNDが共通になっているためです。

アノードコモン VCC(入力)共通
カソードコモン GND(出力)共通

これが分かれば、後は実際にスケッチを書いていくことが出来ます。

可変抵抗器でフルカラー調整LED

では、可変抵抗を3つ用意し、それぞれ赤、緑、青の値をいじって好きな色に出来る回路を作ります。自分の使うLEDのスペックを見てアノードかカソードか、必要な抵抗を確認してください。例ではアノードコモンのLEDを扱っています。

3color_led_breadboard

#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文の繰り返しに投げ込めるようになるので、結構シンプルなスケッチで収まります。

お試しください。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


This site uses Akismet to reduce spam. Learn how your comment data is processed.