11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【Arduino入門編④】RGB(フルカラー)LEDを制御してみる!アナログ出力(PWM)の解説その②

前回、Arduino UNOを使いアナログ出力(PWM)によりLEDをゆっくり点灯させたり(消灯させたり)、任意の明るさに点灯させたりをやってみました。

analogWrite関数を使いPWM(Pulse Width Modulation)制御を使いデューティー比を指定する事によりデジタル出力のHIGH(5V)やLOW(0V)だけでは出来ない点灯をやってみました。

【Arduino入門編③】PWM制御でLEDをゆっくり点灯&消灯させてみる!アナログ出力(PWM)の解説その①

今回はその復讐も兼ねアナログ出力(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を点灯させてみましょう。
デジタル出力に関してはこちらも参考にして下さい。

【Arduino入門編②】複数のLEDを点滅(Lチカ)させてみる!デジタル出力の解説その②

回路はこんな感じで組んでみました。
デジタルピン9・10・11にそれぞれ赤色・緑色・青色LEDの順に繋いでいます。(今回カソードコモンタイプのLEDを使っています)
電流制限抵抗は全て220Ω位のもので大丈夫だと思います。
抵抗値の計算方法は後述します。

そして今回は手元に制限抵抗付きのものがあったのでこちらを使ってみました。(回路は全く同じです)

これは単体のRGB LEDに制限抵抗(150Ω)が内蔵され端子付きなのでブレッドボーに取り付けやすくテスト用としては最適です。(後述するセンサーセットに入っています)

簡単なスケッチとなりますがこちらを用意しました。
デジタル出力で使うdigitalWrite関数はHIGH(5V)かLOW(0V)の出力となるので単純に赤色⇒緑色⇒青色を順に点灯させるだけのスケッチとなります。(これまでやってきたデジタル出力の復習です)

 

この投稿をInstagramで見る

 

フルカラーRGB LEDの点灯テスト✴️ . . . #arduino #esp32 #arduinofun #arduinoide #arduinolove #arduinoprojects #electronics #iot #電子工作

東京バード(@bird_tokyo)がシェアした投稿 –

アナログ出力(PWM)で点灯させてみる

それではここからが本題、PWMでRGB LEDを点灯させてみましょう。
とは言っても前回の内容が理解できていれば非常に簡単です。
LEDの数が単に3つに増えただけです。

まずはこちらのスケッチを動かしてみましょう。
配線は先程使った回路でPWM制御に使える9・10・11番ピンに繋いでいるのでそのまま使いまわします。

赤色⇒緑色⇒青色の順でLEDがゆっくりと点灯していきます。
簡単ですね!

RGB LEDをグラデーションで点灯させてみる

それでは最後にグラデーションで点灯させてみましょう。
グラデーション方法はスケッチによりいろんな点灯パターンが作れそうですが、簡単にこんなスケッチを作ってみました。

今回はこれまでやってきたデジタル出力とアナログ出力(PWM)の復習としてRGB LEDを使ってそれぞれ点灯させてみました。
digitalWriteおよびanalogWrite関数が難なく使えるようになっていれば今回の目標は達成です。

今回はじめてRGBタイプのLEDを使ったのですが制限抵抗の値をどれくらいにするのか少し迷いました。
折角なので少しその話もしておきます。

LEDの電流制限抵抗の計算方法

Arduinoの出力電圧はHIGHの状態で約5Vとなっています。
そしてLEDには定格値がありArduinoに直接繋げるとそれを越してしまい破損に繋がります。
それを防ぐために1本抵抗を入れるわけですが、その抵抗値ってどうやって求めたらいいのか?

以前こちらの記事でも少しご紹介しました。
赤色LEDの場合、一般的に順方向電圧(VF)は約2.0V・順方向電流(IF)は約20mAくらいの製品が多いようです。
ここからオームの法則を使い大体150Ω 以上の抵抗を繋げれば大丈夫という話をしました。
LEDに接続する抵抗はそんなに厳密に値を出さなくても実際のところは300〜1kΩくらいのものを使えば問題ないと思います。

【Arduino入門編②】複数のLEDを点滅(Lチカ)させてみる!デジタル出力の解説その②

今回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に関しては大体この値に近いものとなっています。

これが分かればあとはオームの法則を使い抵抗値を計算するだけなので簡単です。
計算方法も秋月さんのサイトに書かれているので参考にしてみて下さい。

参考 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:設定したいピンの番号
mode:入力として使いたい場合「INPUT」、出力として使いたい場合は「OUTPUT」と記載。

【例】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などでも簡単に入手が出来るので実際に点灯させていろいろ試して下さい。

created by Rinker
Kaito Denshi(海渡電子)

また今回私は制限抵抗付きのものを使用しました。
端子も付いているのでブレッドボードでのテストに最適です。
単品での販売が見つかりませんでしたが、こちらの37センサーモジュールスターターキットに付属しているものです。
こちらも今後いろいろと使ってご紹介していこうかと考えています。

37センサーモジュール スターター キット Arduinoに対応
HiLetgo

最後に!

前回のアナログ出力(PWM)について理解出来ていればデューティー比を指定してそれぞれの色で256段階の明るさを指定し3色合わせてフルカラーを表現できるという事です。
単にLEDの数が増えただけなので簡単でしたね!

これまでデジタル出力とアナログ出力(PWM)についてやってきました。
次回は入力としてデジタル入力についてやってみたいと思います。

その他 Arduino入門編 記事一覧
【Arduino入門編㉛】INA219モジュールで電圧・電流を計測する基本的な方法! 【Arduino入門編㉚】マイコンのデジタル端子(I/O)不足を解消!『I/Oエキスパンダー(MCP23017)』の基本的な使い方! 【Arduino入門編㉙】SPI通信の基礎知識!SPIで使われる信号線や接続方法などについて! 【Arduino入門編㉘】ソフトウェアシリアルを使ってみる! 【Arduino入門編㉗】赤外線(IR)モジュールを使いリモコンの信号を読み取り送受信する方法! 【Arduino入門編㉖】UARTシリアル通信の基礎知識!Arduino間でのデータのやり取りなどをやってみる! 【Arduino入門編㉕】ステッピングモーターを動かしその基礎を理解する!(28BYJ-48 & ULN2003) 【Arduino入門編㉔】Arduinoで7セグメントLEDを制御してみよう!(スタティック制御 / ダイナミック制御) 【Arduino入門編㉓】PCA9685 16チャンネルPWMサーボモータードライバを使って複数のサーボモーターを同時に制御してみる!(最大16台) 【Arduino入門編㉒】ArduinoでDCモーターを制御する。【L298Nデュアルモータードライバ】 【Arduino入門編㉑】温湿度センサー(DHT11)を使い温度と湿度を計測する! 【Arduino入門編⑳】Arduino Uno R3ボードのピン配列&基本機能まとめ! 【Arduino入門編⑲】RTC(リアルタイムクロック)モジュールDS3231を使いシンプルな時計を作る![I2C通信] 【Arduino入門編⑱】I2C通信の基礎!LCDディスプレイに文字を表示させてみる![後編] 【Arduino入門編⑰】LCDディスプレイに文字を表示させてみる![前編][1602 LCDモジュール] 【Arduino入門編⑯】サーボモーターをジョイスティックやシリアルモニタから動かしてみる! 【Arduino入門編⑮】Arduino Unoへの電力供給(外部電源)および電源出力端子の使い方!【追記】 【Arduino入門編⑭】センサーシールド(Sensor Shield)を使ってみる! 【Arduino入門編⑬】テスト環境に便利!Arduino拡張ボード(シールド)プロトタイプシールドを使ってみる! 【Arduino入門編⑫】光センサー(Cdsセル)をアナログ入力ポートで読み取り制御に使ってみる!

コメントを残す