Release 2016.9.18 / Update 2016.12.31

フルカラーLEDを使う

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

お試しください。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください