フルカラーLEDでRGB三色交互にLチカ【マイコン Lチカ道場 Arduino編 1-8】

フルカラーLEDでLチカ Arduino
当サイトのリンクにはアフィリエイト広告が含まれています。

マイコンボードArduino NanoとフルカラーLEDを使って、三色交互にLチカさせてみようという試みです。

フルカラーLEDとは、赤色(R)、緑色(G)、青色(B)の3色のLEDが、一つのパッケージにまとめられたものです。
3色を組み合わせることで、光りの三原色で表されるように、いろんな色を再現することができるはずです。今回はそれも試してみたいとおもいます。

このページは、マイコン Lチカ道場 Arduino編「1-8:RGB三色交互にLチカ」に対応するページです。

スポンサーリンク

回路図

今回の回路は下記になります。

PWMを利用するため、LEDはピン9、10、11に繋ぎます。

フルカラーLEDでLチカする回路図

部品リスト

使用する部品は下記になります。

マイコンボードはELEGOO製のArduino Nano互換品を使用しています。※詳細は参考リンク

品名参照名数量数値・仕様
抵抗R11330Ω
抵抗R2,R32220Ω
フルカラーLEDD11OptoSupply製:OSTBABS4C2B

使用するフルカラーLED

今回使用するのは、秋月電子で購入できるフルカラーRGB LED
OptoSupply製:OSTBABS4C2B です。

OptoSupply製:OSTBABS4C2Bの外観写真

この製品は、下の図のとおり、各色のLEDが独立しているので使いやすいですね。
アノードかカソードのどちらかが共通になっているものを、アノードコモンやカソードコモンと言います。

ちなみに、今回の回路図のような使い方だと、カソードコモンのものでも良いということになります。

OptoSupply製:OSTBABS4C2Bの外形図
外形図(データシートより)

LEDの順方向電圧(VF)は、赤色2.1V、緑色3.1V、青色3.1Vです。(@IF=20mA)

ブレッドボードに刺すために、面実装部品にリード線をはんだ付けしてみました。
ちょっと無理やり感がありますが…

ブレッドボードに挿せるようにリード線をはんだ付けした様子。

下記は、LEDのIF-VF特性を測ってみた結果です。
赤色(R)、緑色(G)、青色(B)それぞれ電流IFを流してその時の電圧VFを確認してみました。

OptoSupply製:OSTBABS4C2Bの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互換ボードです。

使用しているオシロスコープは下記になります。

タイトルとURLをコピーしました