マイコンボードArduino NanoとフルカラーLEDを使って、三色交互にLチカさせてみようという試みです。
フルカラーLEDとは、赤色(R)、緑色(G)、青色(B)の3色のLEDが、一つのパッケージにまとめられたものです。
3色を組み合わせることで、光りの三原色で表されるように、いろんな色を再現することができるはずです。今回はそれも試してみたいとおもいます。
このページは、マイコン Lチカ道場 Arduino編「1-8:RGB三色交互にLチカ」に対応するページです。
回路図
今回の回路は下記になります。
PWMを利用するため、LEDはピン9、10、11に繋ぎます。
部品リスト
使用する部品は下記になります。
マイコンボードはELEGOO製のArduino Nano互換品を使用しています。※詳細は参考リンクへ
品名 | 参照名 | 数量 | 数値・仕様 |
抵抗 | R1 | 1 | 330Ω |
抵抗 | R2,R3 | 2 | 220Ω |
フルカラーLED | D1 | 1 | OptoSupply製:OSTBABS4C2B |
使用するフルカラーLED
今回使用するのは、秋月電子で購入できるフルカラーRGB LED
OptoSupply製:OSTBABS4C2B です。
この製品は、下の図のとおり、各色のLEDが独立しているので使いやすいですね。
アノードかカソードのどちらかが共通になっているものを、アノードコモンやカソードコモンと言います。
ちなみに、今回の回路図のような使い方だと、カソードコモンのものでも良いということになります。
LEDの順方向電圧(VF)は、赤色2.1V、緑色3.1V、青色3.1Vです。(@IF=20mA)
ブレッドボードに刺すために、面実装部品にリード線をはんだ付けしてみました。
ちょっと無理やり感がありますが…
下記は、LEDのIF-VF特性を測ってみた結果です。
赤色(R)、緑色(G)、青色(B)それぞれ電流IFを流してその時の電圧VFを確認してみました。
ちょっと青色の電圧がデータシートの値と比較するとおかしいですね。
無理やりはんだ付けしたので、ダメージを与えてしまっている可能性もあります。
抵抗はVF特性からみて10mAくらい流すような値に設定しています。
プログラム(スケッチ)
やりたいこと
まずは、青(B)→緑(G)→赤(R)の順に交互に点灯させてみます。
また、せっかくなのでRGB三色を組み合わせて点灯させて、光の三原色のとおり色が表現できるか確認してみましょう。
※光の三原色から見て
赤+緑で黄色になるか
緑+青でシアン
赤+青で赤紫(マゼンタ)
赤+緑+青で白色
プログラム
今回のプログラムは下記になります。
const int LED_B = 9; //LEDを接続するピン(PWM出力490Hz:3,9,10,11、980Hz:5,6)
const int LED_G = 10;
const int LED_R = 11;
const int wait = 1000; // 点滅の速さを決めるウェイト時間(ms)
int led_state = 0; //Lチカ状態定義用の変数
void setup() {
pinMode(LED_B, OUTPUT); //LED_Bピンを出力にする
pinMode(LED_G, OUTPUT); //LED_Gピンを出力にする
pinMode(LED_R, OUTPUT); //LED_Rピンを出力にする
}
void loop() {
switch(led_state){
case 1: //led_stateが0の時に実行する処理
analogWrite(LED_B, 255); //LED_BをPWMで点灯させる
analogWrite(LED_G, 0); //LED_Gは消灯
analogWrite(LED_R, 0); //LED_Rは消灯
break; //swich文から抜ける
case 2:
analogWrite(LED_B, 0); //LED_Bは消灯
analogWrite(LED_G, 255); //LED_GをPWMで点灯させる
analogWrite(LED_R, 0); //LED_Rは消灯
break;
case 3:
analogWrite(LED_B, 0); //LED_Bは消灯
analogWrite(LED_G, 0); //LED_Gは消灯
analogWrite(LED_R, 255); //LED_RをPWMで点灯させる
break;
case 4:
analogWrite(LED_B, 0); //赤+緑で黄色
analogWrite(LED_G, 180);
analogWrite(LED_R, 255);
break;
case 5:
analogWrite(LED_B, 255); //緑+青でシアン
analogWrite(LED_G, 255);
analogWrite(LED_R, 0);
break;
case 6:
analogWrite(LED_B, 255); //赤+青で赤紫(マゼンタ)
analogWrite(LED_G, 0);
analogWrite(LED_R, 255);
break;
case 7:
analogWrite(LED_B, 255); //赤+緑+青で白色
analogWrite(LED_G, 255);
analogWrite(LED_R, 255);
break;
default: //どのcaseにも一致しない場合に実行
analogWrite(LED_B, 0); //全て消灯
analogWrite(LED_G, 0);
analogWrite(LED_R, 0);
led_state = 0; //led_stateを0に戻す
}
led_state +=1;
delay(wait);
}
主な動作の説明はコメント文に記載しています。
今回は、switch case文をつかってみました。
変数(led_state)を1ずつ増加させ、case 1~7に定義した状態でRGB各色のLEDを点灯させています。
どのcaseにも該当しない時は、default:の部分で変数(led_state)を0に戻します。
厳密には、一番初めはled_state=0なので、default:の部分を実行しています。その後、+1されてcase 1の処理に入ります。
また、PWM(analogWrite)で、明るさを可変出来るようにしてみました。
ほとんど255なので、パルス幅100%のONしっぱなしですが、case 4の黄色のみ、緑を少し弱めの180にしてみました。
この方がより黄色っぽく見えたためです。
PWMの幅を調整することで、微妙な色味を表現することができます。
動作確認
下記が実際にブレッドボードに組んだ状態の写真です。
330Ωの抵抗が無かったため、1kΩを3本並列にして、333Ωとして使っています。
さっそく動作確認の結果、青(B)→緑(G)→赤(R)の順に正常に点灯していることが確認できました。
また、同時に複数の色を点灯させて、光の三原色の通りに他の色を表現することが出来ました。
動作時の波形をオシロスコープで確認してみました。
1秒おきに、LEDの点滅状態が変わっていることが見てわかりますね。
また、黄色の時のみ、PWMで緑色を弱めにしたため、LEDが細かくON・OFFしていることがわかります。
【動画で見てみよう】
まとめ
Arduino NanoとフルカラーLEDを使って、三色交互にLチカさせてみました。
また、三色の組み合わせで別の色が表現可能なことを確認できました。
PWMで明るさを調整することで、さらにいろんな色を表現する事が出来そうですね。
引き続きさらに難しいLチカに挑戦して行きましょう。
参考リンク
Arduino Nano 純正品
今回使っているのは、ELEGOO製のArduino Nano互換ボードです。
使用しているオシロスコープは下記になります。