連載
» 2013年11月06日 09時30分 公開

アイデア・ハック!! Arduinoで遊ぼう(5):秋の夜長をロマンチックに―― 「フルカラーLED調光ランプ」を作ろう! (2/3)

[三月兎,MONOist]

ArduinoでLEDの色を変えよう!!

 それでは、Arduinoの統合開発環境「Arduino IDE」で、スケッチ(プログラム)を作成していきましょう(スケッチ1)。


const int LED_R=9;            //LED 赤
const int LED_G=11;           //LED 緑
const int LED_B=10;           //LED 青
 
const int POTPIN_R = A0;      //半固定抵抗 赤
const int POTPIN_G = A1;      //半固定抵抗 緑
const int POTPIN_B = A2;      //半固定抵抗 青
 
void setup() {
 //LEDのピンを出力に設定する
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
 
  //半固定抵抗のピンを入力に設定する
  pinMode(POTPIN_R, INPUT);
  pinMode(POTPIN_G, INPUT);
  pinMode(POTPIN_B, INPUT);
 
  Serial.begin(9600);    //シリアル通信をスタートする
}
 
void loop() {
  int potVal_R = analogRead(POTPIN_R);  //半固定抵抗(赤)の値を取得
  analogWrite(LED_R, potVal_R / 4);     //LED赤の明るさを、入力された値の1/4に指定する
 
  int potVal_G = analogRead(POTPIN_G);  //半固定抵抗(緑)の値を取得
  analogWrite(LED_G, potVal_G / 4);     //LED緑の明るさを、入力された値の1/4に指定する
 
  int potVal_B = analogRead(POTPIN_B);  //半固定抵抗(青)の値を取得
  analogWrite(LED_B, potVal_B / 4);     //LED青の明るさを、入力された値の1/4に指定する
  
  //シリアルポートに各半固定抵抗値を出力する
  Serial.print(" R:");
  Serial.print(potVal_R);
  Serial.print(" G:");
  Serial.print(potVal_G);
  Serial.print(" B:");
  Serial.println(potVal_B);
}
 
スケッチ1 「フルカラーLED調光ランプ」のスケッチ。3つの半固定抵抗値を読み取って、LEDの明るさを変化させている

 1〜3行目は、フルカラーLEDの赤・緑・青のカラーに対応したデジタルピンを指定しています。5〜7行目は、半固定抵抗に接続されているアナログ入力ピンです。こちらも、赤・緑・青のカラーに対応しています。

 11〜18行目は、既におなじみのピンモードの指定です。LEDにつなぐピンは「OUTPUT」、半固定抵抗につなぐピンは「INPUT」にします。

 20行目で、初めて使用する「Serial.begin()」が登場します(詳しくは後述)。

 23行目から始まるloop()の中で、調光を行います。24行目は、analogRead()を使って、赤の半固定抵抗値を読んでいます。Arduinoが読み取る値は、電圧(0〜5V)を0〜1023に変換したものです。25行目の「analogWrite(LED_R, potVal_R / 4)」で、LEDを光らせています。ここで「あれ? LEDを光らせるときは、『digitalWrite()』を使うんじゃなかったっけ?」と疑問を持った方もいらっしゃるでしょう。

 そうです。これまでの連載の中では、LEDを点滅させる際、digitalWrite()を使ってきました。digitalWrite()の場合、ピンに出力する値は「HIGH」か「LOW」の2択でした。つまり、LEDは「点灯」か「消灯」になります。

 今回は、analogWrite()を使っているのがポイントです。analogWrite()の場合、PWM波を出力するので、LEDの明るさを調整できます。analogWrite()には、0〜255の値を指定します。つまり、「analogWrite(LED_R,128)」とすれば、赤のLEDが50%の明るさで光るわけです(画像8)。

PWM波を出力するイメージ 画像8 analogWrite()で、PWM波を出力するイメージ。出力している%(パーセンテージ)が大きいほどLEDは明るく光る。PWM波はモーターの駆動にも使われる(※画像クリックで拡大表示)

 potVal_Rの値は、0〜1023でした。そこで、25行目では4で割って0〜255の値にしてから、analogWrite()に渡しているのです。ちなみに、このanalogWrite()は、全てのデジタル入出力ピンで使用できるわけではありません。「Arduino UNO」の場合は、“3、5、6、9、10、11”のピンがanalogWrite()に対応しています。

 今回の回路では、半固定抵抗を左いっぱいに回すと値は「0」に、右に回すにつれて値が次第に大きくなり最大「1023」になります。例えば、「R」と「G」を最大(100%)に、「B」を最小(0%)にしたら、LEDは黄色になります。3つの半固定抵抗を回して、自分好みの明かりを作ってみてください。

Copyright © ITmedia, Inc. All Rights Reserved.