前回、Arduino UNOを使いアナログ出力(PWM)によりLEDをゆっくり点灯させたり(消灯させたり)、任意の明るさに点灯させたりをやってみました。
analogWrite関数を使いPWM(Pulse Width Modulation)制御を使いデューティー比を指定する事によりデジタル出力のHIGH(5V)やLOW(0V)だけでは出来ない点灯をやってみました。
今回はその復讐も兼ねアナログ出力(PWM)を使いRGB LEDを制御してフルカラーで点灯させてみたいと思います。
目次
【Arduino】RGB(フルカラー)LEDをPWMで制御し点灯させてみる!
今回の目標
前回、アナログ出力(PWM)についてご紹介しました。
PWM制御によりLEDをゆっくり点灯させたり任意の明るさに固定したりと、LEDをアナログ的に点灯させる事が出来ました。
今回はそのPWM制御を使いRGB LED(3色のLEDが1つにパッケージされたもの)を制御してLEDをイルミネーションのように光らせてみたいと思います。
RGB(フルカラー)LEDとは?
今回使うRGB LEDですが、これまで使ってきた単色(赤や青など)のLEDと使い方は基本的に同じです。
ただ、光の三原色である赤(RED)・緑(GREEN)・青(BLUE)の3つのLEDが1つにパッケージングされているのでピン(足)の数は4本となっています。(画像引用:秋月電子通商)
回路は下図のようになり各色LEDにつながったピンとGND(またはVcc)が共通となっているので4本足になっています。
LEDのカソード側(マイナス側)が共通となったものをカソードコモンタイプ、またアノード側(プラス側)が共通となったものをアノードコモンタイプと呼びます。
回路図を見ると分かりますが、単純に3色のLEDが1つになった製品です。
という事は前回やったアナログ出力(PWM)で各LEDをそれぞれ制御して点灯させればどうなるか?
アナログ出力(PWM)で使うanalogWrite関数を使えばデューティー比を0〜255の256段階変え明るさを制御できるので、それが3色あるわけですから256の3乗、つまり約1670万色(フルカラー)の色を表現する事ができるということになります。
それではやってみましょう。
まずはデジタル出力でRGB LEDを点灯させてみる
まずは復習としてデジタル出力でRGB LEDを点灯させてみましょう。
デジタル出力に関してはこちらも参考にして下さい。
回路はこんな感じで組んでみました。
デジタルピン9・10・11にそれぞれ赤色・緑色・青色LEDの順に繋いでいます。(今回カソードコモンタイプのLEDを使っています)
電流制限抵抗は全て220Ω位のもので大丈夫だと思います。
抵抗値の計算方法は後述します。
そして今回は手元に制限抵抗付きのものがあったのでこちらを使ってみました。(回路は全く同じです)
これは単体のRGB LEDに制限抵抗(150Ω)が内蔵され端子付きなのでブレッドボーに取り付けやすくテスト用としては最適です。(後述するセンサーセットに入っています)
簡単なスケッチとなりますがこちらを用意しました。
デジタル出力で使うdigitalWrite関数はHIGH(5V)かLOW(0V)の出力となるので単純に赤色⇒緑色⇒青色を順に点灯させるだけのスケッチとなります。(これまでやってきたデジタル出力の復習です)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | //Arduino入門編④ デジタル出力でRGB LEDを点灯 //https://burariweb.info int LED_PIN_R = 9; // デジタルピン9番に赤色LEDを割り当てる(変数) int LED_PIN_G = 10; // デジタルピン10番に緑色LEDを割り当てる(変数) int LED_PIN_B = 11; // デジタルピン11番に青色LEDを割り当てる(変数) int WAIT = 500; // 待ち時間の指定 void setup(){ pinMode(LED_PIN_R, OUTPUT); // それぞれのピンを出力に設定 pinMode(LED_PIN_G, OUTPUT); pinMode(LED_PIN_B, OUTPUT); } void loop(){ digitalWrite(LED_PIN_R, HIGH); digitalWrite(LED_PIN_G, LOW); // 赤色LEDを点灯しその他を消灯 digitalWrite(LED_PIN_B, LOW); delay(WAIT); digitalWrite(LED_PIN_R, LOW); digitalWrite(LED_PIN_G, HIGH); // 緑色LEDを点灯しその他を消灯 digitalWrite(LED_PIN_B, LOW); delay(WAIT); digitalWrite(LED_PIN_R, LOW); digitalWrite(LED_PIN_G, LOW); // 青色LEDを点灯しその他を消灯 digitalWrite(LED_PIN_B, HIGH); delay(WAIT); } |
アナログ出力(PWM)で点灯させてみる
それではここからが本題、PWMでRGB LEDを点灯させてみましょう。
とは言っても前回の内容が理解できていれば非常に簡単です。
LEDの数が単に3つに増えただけです。
まずはこちらのスケッチを動かしてみましょう。
配線は先程使った回路でPWM制御に使える9・10・11番ピンに繋いでいるのでそのまま使いまわします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | //Arduino入門編④ アナログ出力(PWM)でRGB LEDを点灯 //https://burariweb.info int LED_PIN_R = 9; // デジタルピン9番に赤色LEDを割り当てる(変数) int LED_PIN_G = 10; // デジタルピン10番に緑色LEDを割り当てる(変数) int LED_PIN_B = 11; // デジタルピン11番に青色LEDを割り当てる(変数) int WAIT = 5; void setup(){ pinMode(LED_PIN_R, OUTPUT); // それぞれのピンを出力に設定 pinMode(LED_PIN_G, OUTPUT); // PWM出力(anarogWrite関数)は pinMode(LED_PIN_B, OUTPUT); // この項目は省略可! } void loop(){ analogWrite(LED_PIN_R, 0); // 全てのLEDを消灯 analogWrite(LED_PIN_G, 0); analogWrite(LED_PIN_B, 0); for(int i=0; i<=255; i++){ analogWrite(LED_PIN_R, i); // 赤色LEDを0~255までの輝度で点灯 delay(WAIT); } analogWrite(LED_PIN_R, 0); // 全てのLEDを消灯 analogWrite(LED_PIN_G, 0); analogWrite(LED_PIN_B, 0); for(int i=0; i<=255; i++){ // 緑色LEDを0~255までの輝度で点灯 analogWrite(LED_PIN_G, i); delay(WAIT); } analogWrite(LED_PIN_R, 0); // すべてのLEDを消灯 analogWrite(LED_PIN_G, 0); analogWrite(LED_PIN_B, 0); for(int i=0; i<=255; i++){ // 青色LEDを0~255までの輝度で点灯 analogWrite(LED_PIN_B, i); delay(WAIT); } } |
赤色⇒緑色⇒青色の順でLEDがゆっくりと点灯していきます。
簡単ですね!
RGB LEDをグラデーションで点灯させてみる
それでは最後にグラデーションで点灯させてみましょう。
グラデーション方法はスケッチによりいろんな点灯パターンが作れそうですが、簡単にこんなスケッチを作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | //Arduino入門編④ RGB LEDをイルミネーション点灯 //https://burariweb.info int LED_PIN_R = 9; // デジタルピン9番に赤色LEDを割り当てる(変数) int LED_PIN_G = 10; // デジタルピン10番に緑色LEDを割り当てる(変数) int LED_PIN_B = 11; // デジタルピン11番に青色LEDを割り当てる(変数) int WAIT = 10; void setup(){ } void loop(){ for(int i=0; i<=255; i++){ analogWrite(LED_PIN_R, i); // 赤色と緑色のグラデーション analogWrite(LED_PIN_G, 255-i); analogWrite(LED_PIN_B, 0); delay(WAIT); } for(int i=0; i<=255; i++){ analogWrite(LED_PIN_R, 255-i); // 赤色と青色のグラデーション analogWrite(LED_PIN_G, 0); analogWrite(LED_PIN_B, i); delay(WAIT); } for(int i=0; i<=255; i++){ analogWrite(LED_PIN_R, 0); // 緑色と青色のグラデーション analogWrite(LED_PIN_G, i); analogWrite(LED_PIN_B, 255-i); delay(WAIT); } } |
今回はこれまでやってきたデジタル出力とアナログ出力(PWM)の復習としてRGB LEDを使ってそれぞれ点灯させてみました。
digitalWriteおよびanalogWrite関数が難なく使えるようになっていれば今回の目標は達成です。
今回はじめてRGBタイプのLEDを使ったのですが制限抵抗の値をどれくらいにするのか少し迷いました。
折角なので少しその話もしておきます。
LEDの電流制限抵抗の計算方法
Arduinoの出力電圧はHIGHの状態で約5Vとなっています。
そしてLEDには定格値がありArduinoに直接繋げるとそれを越してしまい破損に繋がります。
それを防ぐために1本抵抗を入れるわけですが、その抵抗値ってどうやって求めたらいいのか?
以前こちらの記事でも少しご紹介しました。
赤色LEDの場合、一般的に順方向電圧(VF)は約2.0V・順方向電流(IF)は約20mAくらいの製品が多いようです。
ここからオームの法則を使い大体150Ω 以上の抵抗を繋げれば大丈夫という話をしました。
LEDに接続する抵抗はそんなに厳密に値を出さなくても実際のところは300〜1kΩくらいのものを使えば問題ないと思います。
今回220Ωの抵抗を接続して説明しましたが、厳密にいうとLEDの定格は色により大きく変わってきます。
詳しくは各パーツのデータシートを確認するのが1番です。
この項目は少し余談という事で、興味があれば読んで下さい。
例として秋月電子通商さんで販売されている5mm赤色LED(OSDR5113A)というLEDをみてみましょう。
データシートも見れるので一緒に確認して下さい。
データシートを見てみましょう。
Absolute Maximum Ratingという表があります
最大絶対定格という意味になり部品の限界値を意味します。
次にElectrical Optical Characteristicsという表にDC Foward Voltageが順方向電圧VFにあたりMin(最低値)1.8V・Typ(一般値)2.0V・Max(最大)2.5Vで書かれています。
この部分の一般値を読むので順方向電圧VFは2.0Vとなります。
またIF=20mAとあるので順方向電流は20mAとなります。
一般的によく使われている赤色LEDに関しては大体この値に近いものとなっています。
これが分かればあとはオームの法則を使い抵抗値を計算するだけなので簡単です。
計算方法も秋月さんのサイトに書かれているので参考にしてみて下さい。
同様に例として秋月さんで販売されているRGBフルカラーLED(OSTA5131A)を見てみましょう。
順方向電流IF=20mAに対し、順方向電圧VFの値は赤色が2.0V、緑色が3.6V、青色が3.6Vとなっています。
色によりLEDの定格は結構変わるようですね。
これで計算すると赤色150Ω、緑色青色が70Ωという計算になりますが、最近のLEDはかなり低い電流でも明るく光ってくれるので実際にはこれより大きな抵抗を繋げても問題ないかと思います。
そしてRGB LEDの場合、色により抵抗値を変えて接続してもいいのですが・・・。
さらに見てみると、データシートには同じ電流IF20mAを流した場合でも光る強さ(カンデラ:mcd)が変わってきます。
RGBの3色を合わせて点灯させるわけですからその辺りも本当は考えた方が(揃える?)いいのか?という話になりますが・・・
テストレベルではそこまで意識する必要はなく、そして今回は上記により暗い赤を基準に抵抗値を補正して全て220Ωとしました。もちろんこんな厳密にする必要はあまりなく、一番大きな抵抗値に揃えて繋いでやれば問題ないと思います。
この項目ではデータシートの見方や計算の概要が分かればいいと思います。
また今回実際に使った制限抵抗付きのRGB LEDには全て150Ωの制限抵抗が取り付けられていました。
今回使った関数(コマンド)まとめ
関数 | 使用方法 |
pinMode(pin,mode); | Arduinoが持っているデジタル入出力ピン(D0~D13)の設定(入力 or 出力)をする。 pin:設定したいピンの番号 【例】pinMode(13, OUTPUT); |
digitalWrite(pin,value); | 指定したpinに”HIGH(5V)” または “LOW(0V)”を出力します。 pinMode()関数とペアで使い、指定したピンがpinMode()関数でOUTPUTに設定されている場合、次の電圧にセットされます。 HIGH:5V LOW:0V(GND) 【例】digitalWrite(13,HIGH); |
analogWrite(pin, value); | 指定したピンにアナログ値(PWMパルス)を出力します。 LEDの輝度を調整したり、モーターの回転速度を変えたり、サーボモーターの制御などに使われます。【書式】analogWrite(pin, value); pin:出力させたいピン番号 value:デューティー比(0〜255)※デジタル出力のように事前にpinMode関数を使い出力設定する必要はありません! |
今回のポイント
- RGB LEDは3色のLEDが1つにパッケージングされ、フルカラー表示が可能!(256×256×256=約1670万色)
- analogWrite関数によるPWM出力は0〜255のデューティー比で指定する!
今回使ったパーツ
Arduino UNO
Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数メーカーから販売されています。
互換品でも正規品と比べて特に問題なく使用でき数百円程度で購入が可能なのでArduino学習用としていいですね!
Arduino スターターキット
また、これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。
私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)
そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)
参考 チュートリアルダウンロードELEGOO基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。
スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーなど必要なものを増やしていき・・・。
RGB LEDはELEGOOのスターターキットには付属しているようです。
RGB LED
上記ELEGOOのArduinoスターターキットにはRGB LEDが1つ付属しているようです。
手持ちになければ国内Amazonなどでも簡単に入手が出来るので実際に点灯させていろいろ試して下さい。
また今回私は制限抵抗付きのものを使用しました。
端子も付いているのでブレッドボードでのテストに最適です。
単品での販売が見つかりませんでしたが、こちらの37センサーモジュールスターターキットに付属しているものです。
こちらも今後いろいろと使ってご紹介していこうかと考えています。
最後に!
前回のアナログ出力(PWM)について理解出来ていればデューティー比を指定してそれぞれの色で256段階の明るさを指定し3色合わせてフルカラーを表現できるという事です。
単にLEDの数が増えただけなので簡単でしたね!
これまでデジタル出力とアナログ出力(PWM)についてやってきました。
次回は入力としてデジタル入力についてやってみたいと思います。
コメントを残す