RGBフルカラーLEDの色を段々に変化点灯させますパート1

〔パート2〕 〔パート3〕 〔Arduinoの動かせ方入門に戻る〕



RGB3色フルカラーLEDを配線して、赤色→黄色→緑色→水色→青色→紫色に変化させます。
HSVの色空間モデルを真似たS/V無し(LEDだし必要ないかなっと?)でHのみで制御してます。

@まずは、下記図画面の様に配線しましょう。
 LEDのことは下の方を見て下さい。(LED足の向きに注意)

RGBLED1

Aarduinoボード(Arduino Duemilanove 328)はUSBケーブルで接続して、arduino IDEを起動させます。

BIDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
 ちょっと寄り道のスケッチで、LEDを赤色→緑色→青色で点灯させます。
 LEDの点灯チェックと明るさチェックと配線チェックが出来ますね。
---------------------------------------------------------------------
 void setup() {
     pinMode( 9,OUTPUT) ;     // 赤LED接続のピン(9番)をデジタル出力に設定
     pinMode(10,OUTPUT) ;     // 青LED接続のピン(10番)をデジタル出力に設定
     pinMode(11,OUTPUT) ;     // 緑LED接続のピン(11番)をデジタル出力に設定
     digitalWrite( 9,LOW) ;
     digitalWrite(10,LOW) ;
     digitalWrite(11,LOW) ;
 }
 void loop() {
     digitalWrite( 9,HIGH) ;  // 赤LEDを点灯
     digitalWrite(10,LOW) ;
     delay(300) ;
     digitalWrite(11,HIGH) ;  // 緑LEDを点灯
     digitalWrite( 9,LOW) ;
     delay(300) ;
     digitalWrite(10,HIGH) ;  // 青LEDを点灯
     digitalWrite(11,LOW) ;
     delay(300) ;
 }
---------------------------------------------------------------------
CIDEツールバーの赤枠部分「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。

upload

D正常終了後、LEDが赤色→緑色→青色で点灯すればOKですね。

E今度は本番スケッチプログラムです、コピーペーストして貼り付けて下さい。
 スケッチをダウンロードしたい方はこちら
 ダウンロードスケッチの保存先と開き方はこちらを参照下さい。
---------------------------------------------------------------------
void setup() {
}
void loop() {
     int H ;
     int R , G , B ;

     /* HSVのH値を0-360で回します */
     for (H=0 ; H<=360 ; H++) {
          /* HSVのH値を各LEDのアナログ出力値(0-255)に変換する処理 */
          if (H <= 120) {
               /* H値(0-120) 赤-黄-緑     */
               R = map(H,0,120,255,0) ;     // 赤LED R←→G
               G = map(H,0,120,0,255) ;     // 緑LED G←→R
               B = 0 ;
          } else if (H <= 240) {
               /* H値(120-240) 緑-水色-青 */
               G = map(H,120,240,255,0) ;   // 緑LED G←→B
               B = map(H,120,240,0,255) ;   // 青LED B←→G
               R = 0 ;
          } else {
               /* H値(240-360) 青-紫-赤   */
               B = map(H,240,360,255,0) ;   // 青LED B←→R
               R = map(H,240,360,0,255) ;   // 青LED R←→B
               G= 0 ;
          }
          /* RGBLEDに出力する処理   */
          analogWrite(9,R) ;                //  9番ピンから赤LEDの出力
          analogWrite(11,G) ;               // 11番ピンから緑LEDの出力
          analogWrite(10,B) ;               // 10番ピンから青LEDの出力
          delay(100) ;
     }
}
---------------------------------------------------------------------
FIDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。

G正常終了後、LEDが段々に赤色→黄色→緑色→水色→青色→紫色と変化して行くと思います。

《やさしく解説》

RGB3色フルカラーLEDについて

RGBLED2

LEDには極性が有ります、
一番長い足がGND(カソードコモン)です、arduinoのGND端子に接続します。
赤の足を330Ωの電流制限抵抗を介してarduinoの9番ピンに接続します。
青の足を470Ωの電流制限抵抗を介してarduinoの10番ピンに接続します。
緑の足を220Ωの電流制限抵抗を介してarduinoの11番ピンに接続します。

このLEDは秋月電子通商のこちらで購入しました。

電流制限抵抗
 LEDの順方向電流(IF)と順方向電圧(VF)がデータシート等に書いてあると思います、
 例えばIFが10mAで、VFが2.5Vで、arduinoのアナログ出力が5Vとすると、
 (arduino出力−順方向電圧)÷ 順方向電流 = 電流制限抵抗値
 よって、(5V - 2.5V) ÷ 0.010A = 250Ω(250Ωは無いので240Ωか270Ωを使います)
 10mAは0.010AというふうにAに変換して計算します。
 だいたい120Ω〜680Ωのあたりだと思います。

 データシートによると、このLEDは、
 赤LEDでVF=2.0V・緑と青LEDでVF=3.6V IFは最大50mAとなっています。
 今回は、赤LEDでIF=9.0mA・緑LEDでIF=6.5mA・青LEDでIF=3mAぐらいの割合で制御しています。
 抵抗値を変えると色合いが変化します、調整してみて下さい。
 (20mA以上は流さないように、arduino壊れるしぃ、目がいたい)

スケッチについて

今回はpinModeは使いませんアナログは指定不要です、
アナログは入出力のピン位置は決まっていて、デジタルの様に入出力を兼用しませんから。

analogWrite(pin,value)
 指定したピン(pin:9・10・11番ピン)からアナログ値を出力します。
 value: 出力するアナログ値(0〜255)を指定する。
 arduinoは0〜255の範囲をPWM制御(0Vと5Vを高速で入切りする制御)で出力します。

 アナログ出力はデジタルピンの3、5、6、9、10,11番ピンから出力可能です
 (PWM制御についての詳しい話はこちらのページを参考にして下さい。)

delay(value)
 プログラムを指定した時間だけ一時停止します。
 value:停止したい時間を指定します、単位はミリ秒です。
 delay(10000)なら10秒ですね、1秒は1000msです。

G=map(H,0,120,0,255)
 Hの数値を0−250の範囲に変換してGに返します。
 Hの数値は0−120の範囲内で指定します。
 例えば、H=120→G=255 H=60→G=127 H=0→G=0 となります。

HSVについて

RGBLED(HSV)1  これが通常のHSV色空間モデル図です。
 Hが色相(Hue)、色の種類を表し0〜360の範囲、又は0〜100%です。
 Sが彩度(Saturation)、鮮やかさを表し、0.0〜1.0の範囲、
 又は0〜100%です。
 Vが明度(Value)(あるいはB:Brightness)、明るさを表し、
 0.0〜1.0の範囲、又は0〜100%です。

 今回の制御はSとVは考えずにLEDまかせで、Hのみの考え方です。



RGBLED(HSV)2  赤(0°)は緑方向(120°)に向かう毎に赤を少しずつ減らしています、
 これは、アナログPWM出力で255から0にしていると言う事です。

 緑の場合は、赤から緑方向に向かうほど緑の量を増やしています、
 この場合はアナログPWM出力で0から255にしていると言う事です。

 (Hが60°なら赤も緑も半分点灯[黄色]、アナログPWM出力は127です)

 また、赤(360°)は青方向(240°)に向かう毎にも同じように赤を
 少しずつ減らしています。
 こんどは青が緑と同じように赤と混ざり合います。
 (真ん中で[紫色]になります)

 この考え方で各、赤、緑、青においてHの各値(青なら240-360と120-240)からアナログ出力値0〜255に、 map()関数でスケール変換をしてLEDにPWM出力しています。

《半固定抵抗値でLEDを可変させる回路》

上の回路に半固定抵抗を追加してその値で段々に赤色→黄色→緑色→水色→青色→紫色と変化 させる回路はこちらを参照して下さい。

《音の大きさでLEDを可変させる回路(中級編)》

音センサーを使用して、音の大きさに合わせ段々に赤色→黄色→緑色→水色→青色→紫色と変化 させる回路はこちらを参照して下さい。 *1)



追記(*1) 2012/06/18


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2012 Shigehiro Kimura All Rights Reserved.