ArduinoのPWMでフルカラーLEDを制御する
ArduinoでフルカラーLEDを点灯させるために
今回は、ArduinoでフルカラーLEDを点灯させていきたいと思います。
まずフルカラーLEDとは何?っていうところから説明していき、実際にArduinoで点灯制御やPWMを使用した調光制御などをしていきます。
フルカラーLEDとは?
フルカラーLEDとは、よく使用される単色のLEDとは異なり、内部に赤、緑、青の発光するLEDチップが内蔵されている半導体です。
電流の大きさを変えてそれぞれの色の光の強度を変え、3色の混合割合を変えることによって、発光色を変化させて使用します。
フルカラーLEDには端子が4本付いています。1番長い端子は3つのLEDチップすべてに繋がっています。
他の端子は3つのLEDチップに1本ずつ繋がっています。
フルカラーLEDには、共通端子が陽極(アノードコモン)のタイプと陰極(カソードコモン)のタイプがあり、今回はカソードコモンのフルカラーLEDを使用していきます。
ArduinoでフルカラーLEDの点灯制御をする
Arduinoから信号を出力してフルカラーLEDを点灯させます。
フルカラーLEDは3色がそれぞれON / OFFの2パターンがあるため、フルカラーLEDの点灯パターンは全部で2^3 = 8パターンとなります。
RED GREEN BLUE YELLOW MAGENTA CYAN WHITE BLACK の8パターンです。
これらを点灯するための回路図と配線図は以下のように設計しました。
プログラムはこのように作りました。
#define R 9 //9番ピンには赤 #define G 11 //11番には緑 #define B 10 //10番には青 void setup(){ pinMode(R,OUTPUT); pinMode(G,OUTPUT); pinMode(B,OUTPUT); } void loop(){ //red digitalWrite(R,HIGH); //赤が点灯 delay(500); //500ミリ秒待機 digitalWrite(R,LOW); //赤を消灯 //green digitalWrite(G,HIGH); //緑を点灯 delay(500); digitalWrite(G,LOW); //緑を消灯 //blue digitalWrite(B,HIGH); //青を点灯 delay(500); digitalWrite(B,LOW); //青を消灯 //yellow digitalWrite(R,HIGH); //赤が点灯 digitalWrite(G,HIGH); //緑を点灯 delay(500); //500ミリ秒待機 digitalWrite(R,LOW); //赤を消灯 digitalWrite(G,LOW); //緑を消灯 //cyan digitalWrite(B,HIGH); //青を点灯 digitalWrite(G,HIGH); //緑を点灯 delay(500); //500ミリ秒待機 digitalWrite(B,LOW); //青を消灯 digitalWrite(G,LOW); //緑を消灯 //Purple digitalWrite(R,HIGH); //赤が点灯 digitalWrite(B,HIGH); //青を点灯 delay(500); //500ミリ秒待機 digitalWrite(R,LOW); //赤を消灯 digitalWrite(B,LOW); //青を消灯 //white digitalWrite(R,HIGH); //赤が点灯 digitalWrite(G,HIGH); //緑を点灯 digitalWrite(B,HIGH); //青を点灯 delay(500); //500ミリ秒待機 digitalWrite(R,LOW); //赤を消灯 digitalWrite(B,LOW); //青を消灯 digitalWrite(G,LOW); //緑を消灯 delay(500); //500ミリ秒待機 }
少々長ったらしいですが、これで全8色の出力ができました。
実際にこのプログラムを動かすと以下の動画のような動作になります。
このようになれば、正常に動作しています。
PWM信号でフルカラーLEDの発色制御を行う
以前の記事でArduinoのPWM制御を行いました。
【Arduinoで電子工作-3】AD変換を使用して電圧値を出力する【シリアル通信】
その記事で、PWMのduty比を変更することでLEDの電流値に流れる電流値を制御し、光量の調整を行いました。
今回は同様のことをフルカラーLEDの3色それぞれにPWM信号を送信し、発色制御をしていきます。
回路はそのままで行い、プログラムのみを変更します。
各色に流すduty比の変化は以下のグラフのようにサインカーブを描くようにします。
それぞれの位相をずらすことで自然にいろんなパターンの色の変化を見ることができます。
実際のプログラムは以下のようになります。
#define R 9 //9番ピンには赤 #define G 11 //11番には緑 #define B 10 //10番には青 void setup(){ pinMode(R,OUTPUT); pinMode(G,OUTPUT); pinMode(B,OUTPUT); } void loop(){ uint8_t r,g,b; uint8_t i; for ( i = 0 ;; i++){ r= (sin(2 *3.14 / 255 * i)+1) *(255/2); g= (sin(2 *3.14 / 255 * (i+85))+1) *(255/2); b= (sin(2 *3.14 / 255 * (i+170))+1) *(255/2); analogWrite(R , r); analogWrite(G , g); analogWrite(B , b); delay(20); } }
実際に動かしたときの動画が以下のようになります。
自然に色が変わっている様子がわかると思います。
今回はサインカーブを描くように制御しましたが、
3色でArduinonoのPWM機能を使用すると、
256*256*256 = 16777216色も出すことができるため、いろんな発色の仕方があると思います。
センサの値を読み込んでその値をしようしたり、グラフの数式を変更させたり、時と場合に合った様々な使用方法があります。
いろいろとチャレンジしてみてはいかがでしょうか?
今後は、複数のフルカラーLEDを使用したダイナミック点灯やカラーセンサーを使用した電子工作とかをしてみたいと思っています。