Arduinoと戯れる!

Arduino 入門 Lesson 04 【RGBダイオード制御編】

arduinoArduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 04
【RGBダイオード制御編】

「Arduino」を使ったマイコンのプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

本日はLesson 04 RGBダイオード制御編です。

 

回路図とブレッドボード図を追記しました。
誤記修正:スケッチのPIN番号修正

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

正規品の本体単品がほしい方はこちらとなります。

 

スポンサーリンク

はじめに

Lesson 04では、RGBダイオード(以下RGB LED)を利用して色の変化を楽しみます。

RGB LEDは赤、緑、青のLEDが一つになったLEDです。

この3色の輝度を変更することにより、色の変化を確認することができます。

このLessonを実践することで、テレビの原理も子供に理解してもらうことが可能かと思います。

ぜひ子供と一緒に、実験感覚でやってみることをお勧めします。

 

Lesson 04 目標

RGB LEDを使い、RGB LEDの各輝度を変更する作業を通して、RGB LEDの色が3色以外の色になっていることを確認します。

また、輝度の変更はパルス幅変調(PWM)にて制御します。

難しい言葉がでてきましたが、簡単に説明すると、「LEDがONしている時間を制御する」ということです。

この、PWMについても理解することが目標となります。

また、楽しんで遊ぶことも目標の1つです。

 

準備

さっそく、準備にとりかかりましょう。

 

必要なもの

 

使用部品説明

使用部品の説明をしていきます。

 

ブレッドボード

ブレッドボードを使用することで、半田を使用することなく穴に素子を挿すことで接続ができます。

ブレッドボードの詳細はLesson 03を参照してください。

 

RGB LED

赤、緑、青の3色のLEDが一つになったLEDです。

下図に示すように4本のリード線があります。

3本のリード線が、それぞれ青、緑、赤となりANODE(+極)となります。

残りの一本がCATHODE(陰極)になります。

 

RGB-LED

 

Lesson 03でも説明しましたが、LEDは大電流を流すと、焼き切れてしまいます。
直接電源に接続することはしないようにしましょう。
必ず、抵抗などで電流を制限して使いましょう。

 

手持ちがないかたは以下からどうぞ。

 

単純に多数のLEDを光らせたい方は、セットで購入がおすすめです。

種類が豊富で色々と楽しめます。

 

抵抗

名前の通り、抵抗は電流の流れを妨げる働きがあります。

本Lessonでは220Ωの抵抗を使います。

抵抗の詳細な説明に関しては、Lesson 03を参照してください。

カラーコードの説明があります。

 

抵抗のセット

 

Jumper wire(配線)

UNOの電源ポートとブレッドボードの接続や素子どうしを接続に使います。

 

Jumper wireは「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

PWM制御の説明

PWMのパルスは下に示すような、周期的なパルスのことです。

本Lessonではこのパルスの5Vになっている期間、0Vになっている期間を制御します。

 

PWM

 

PWM制御

PWM信号の周波数は約490Hzです。

時間に直す場合は、逆数を取れば良く「時間=1/周波数」の関係があります。

よって、1/490=0.00204・・・

約0.002秒(約1/500秒)

となります。

下に示すように、1/500秒ごとに同じパルスを繰り返します。

その時に5Vになっている期間、0Vになっている期間を制御することでLEDの点滅のスピードが変わります。

この変化が人間の目には明るさが変わっているように見えることになります。

「analogWrite」関数には0~255の値を設定することができます。

この値によって1/500秒の間の5Vの期間、0Vの期間を制御できるようになっています。

 

PWM

 

使用する関数とピン番号

UNOは「analogWrite」関数を使用することによって、指定したピンからアナログ値(PWM波)を出力します。

LEDの明るさを変えたいときや、モータの回転スピードを調整したいときに使えます。

UNOのボードでは、デジタルピン「3、5、6、9、10、11」でこの機能が使えます。

 

実践 回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、RGB LEDを動かしていきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

図に示すように、UNO、RGB LED、抵抗を接続します。

使用するポートは、PWM制御可能なピンである「3、5、6」です。

本Lessonでは、「3(青)、5(緑)、6(赤)」としたいと思います。

RGB LEDのCathodeはGNDに接続します。

 

回路図がこちら。

Arduino-lesson04-08

 

こちらがブレッドボード図。

Arduino-lesson04-09

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

図に示すように、ブレッドボードを使用してUNO、RGB LED、抵抗を配線で接続しましょう。

回路図同様、使用するポートは、「3、5、6、GND」です。

本Lessonでは、「3(青)、5(緑)、6(赤)」としています。

RGB LEDのCathodeはGND。

穴に挿入しづらいときは、ラジオペンチなどを使用すると良いかもしれません。

 

下記はつないで電源を入れた状態です。

接続時は電源はつながないでください。

arduino

 

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにコードを書き込んで行きましょう。

ELEGOOのキッドを購入されたかたは、メーカーHPの製品Super Starter Kitから、チュートリアル入手していれば、その中にコードが梱包されています。

本Lessonでは、チュートリアルのコードを利用していきたいと思います。

チュートリアルの入手方法については「Arduino 入門編」を参照ください。

 

IDE統合環境の「ファイル」⇒「開く」で梱包されているコードを開きます。

ファイル名は「RGB_LED.ino」

開いたら、編集しても良いように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

今回は「04_RGB_LED」と名前をつけて保存しました。

 

ここで「マイコンボードに書き込み」をクリックすれば下記で説明するコードが書き込まれます。

色々な色に変化するのがわかると思います。

 

コマンドの説明

これまでのLessonにでてきていないコマンドについて説明します。

コマンド説明
#define 定数名 値プログラム中の定数に対して名前を付けることができます。
例:#define BLUE 3
の場合、BLUEと記述されているところが全て3という値に置き換えられます。
int-32768から32767の値の範囲を取る整数型を意味します。
例:int redValue;
redValue上記値の範囲での整数型と定義するということです。
for (初期化; 条件式; 加算) {
//実行される文;
}
{ }で囲まれたブロックを繰り返し実行します。
analogWrite(pin, value)指定したピンからアナログ値(PWM波)を出力します。Unoのボードでは、デジタルピン3、5、6、9、10、11でこの機能が使えます。

 

サンプルコード

各コードの脇に脇に解説をつけています。

参考にして、色々と変えて遊んでみてください。

※一部修正しました。

//Lesson 04 RGBダイオード
//フルカラーの表示
//https://omoroya.com/

const int RED   = 6;   //RED変数に6を設定
const int GREEN = 5;   //GREEN変数にを5設定
const int BLUE  = 3;   //BLUE変数に3を設定
int delayTime   = 10;  //変数に10を設定
int redValue;          //整数型で定義
int greenValue;        //整数型で定義
int blueValue;         //整数型で定義

void setup() {
  pinMode(RED, OUTPUT);      //RED(6番ピン)をOUTPUT定義
  pinMode(GREEN, OUTPUT);    //GREEN(5番ピン)をOUTPUT定義
  pinMode(BLUE, OUTPUT);     //BLUE(3番ピン)をOUTPUT定義
  digitalWrite(RED, HIGH);   //REDをON
  digitalWrite(GREEN, LOW);  //GREENをOFF
  digitalWrite(BLUE, LOW);   //BLUEをOFF
}

void loop()
{
  redValue   = 255; //REDのPWL初期値設定
  greenValue = 0;   //GREENのPWL初期値設定
  blueValue  = 0;   //BLUEのPWL初期値設定

  for (int i = 0; i < 255; i += 1) //0~255にインクリメント
  {
    redValue -= 1;                  //変数を-1
    greenValue += 1;                //変数を+1
    analogWrite(RED, redValue);     //REDの輝度変更
    analogWrite(GREEN, greenValue); //GREENの輝度変更
    delay(delayTime);               //設定した時間だけ待つ
  }

  //以下基本は同じ。輝度を変えるLEDが異なるだけ。
  redValue = 0;     //REDのPWL初期値設定
  greenValue = 255; //GREENのPWL初期値設定
  blueValue = 0;    //BLUEのPWL初期値設定

  for (int i = 0; i < 255; i += 1)
  {
    greenValue -= 1;                //変数を-1
    blueValue += 1;                 //変数を+1
    analogWrite(GREEN, greenValue); //GREENの輝度変更
    analogWrite(BLUE, blueValue);   //BLUEの輝度変更
    delay(delayTime);               //設定した時間だけ待つ
  }

  //以下基本は同じ。輝度を変えるLEDが異なるだけ。
  redValue = 0;    //REDのPWL初期値設定
  greenValue = 0;  //GREENのPWL初期値設定
  blueValue = 255; //BLUEのPWL初期値設定

  for (int i = 0; i < 255; i += 1)
  {
    blueValue -= 1;               //変数を-1
    redValue += 1;                //変数を+1
    analogWrite(BLUE, blueValue); //BLUEの輝度変更
    analogWrite(RED, redValue);   //REDの輝度変更
    delay(delayTime);             //設定した時間だけ待つ
  }
}

 

コードの内容を説明すると

初期設定した後に下記を実行
①    赤(255⇒0)、緑(0⇒255)をループ内で実行
②    緑(255⇒0)、青(0⇒255)をループ内で実行
③    青(255⇒0)、赤(0⇒255)をループ内で実行
の順番に輝度を変更して色の変化がわかるコードになっています。
※0はOFF、255は輝度最大となります。

いかがでしょうか。赤、緑、青の輝度の変化によって、色々な色に見えるのがわかったでしょうか?

 

redValue、greenValue、blueValueの数値を変えて色々と試してみると良いと思います。

数値を変更する場合は、255または0に変えてみてください。

例えば、最後のfor文の手前の設定を下記のように変えてみてください。

redValue = 0;

greenValue = 255;

blueValue = 255;

また、違った色の変化が見られると思います。

 

動作確認

実際に光らせた状態がこちら。

arduino

arduino

arduino

 

赤、緑、青によって色々な色が再現できるのはテレビと同じです。

 

もし、小型の除ける顕微鏡などありましたらテレビ画面をのぞいてみてください。

液晶画面が赤、緑、青のかたまりが一つあり、画面上にそのかたまりがたくさん並んでいるのが見えるはずです。

こんな感じに見えるはずです。

RGB

 

もし手元になければ、ぜひ一台あった方が良いと思います。

手軽に色々と遊べます。

 

お勧めの携帯型顕微鏡を記載しておきます。

Kenko 顕微鏡 Do・Nature 60-120倍 LEDライト内蔵 コンパクト携帯型 STV-120M★特徴
外へ手軽に持っていける携帯型顕微鏡

・ズーム機能で対象物に合わせて観察できる
・LEDライト内蔵で見やすい
・電源の心配なく外で使用可能
・倍率:60-120倍
・電源:単4形アルカリ乾電池1本(別売)
・重量:約30g(電池含まず)

値段もお手頃で、使いやすいです。

 

まとめ

今回は以下の内容について理解してもらいました。

  1. 赤、緑、青の輝度の違いにより、RGB LEDの色が3色以外の色になっていることを理解する。
  2. 輝度の変更はパルス幅変調「PWM」にて制御することを理解する。

今回は、この「PWM」というのを理解することがポイントです。

また、楽しんで遊ぶことも目標の1つでした。

 

今回のLessonは、なかなか良かったです。

Lesson 04 【RGBダイオード制御編】はここまで。

ぜひ、みなさんもやってみてください。

 

次回はLesson 05は【プッシュボタンスイッチ編】です。

デジタル入力について理解できる内容となっています。

Arduino 入門 Lesson 05 【プッシュボタンスイッチ編】
このLessonでは、機械的にスイッチを使ってLEDをオン、オフさせるわけではありません。スイッチを「押した」「押してない」という行為をデジタル信号としてUNOに認識させるということです。それによって、UNOから電源が供給されLEDのオン、…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分)一般プライム会員
5,000円~19,999円0.5%1.0%
2,0000円~39,999円1.0%1.5%
40,000円~89,999円1.5%2.0%
90,000円~2.0%2.5%

さらに、初回チャージで2000ポイントもらえるキャンペーンも実施中!
※いつもは1000ポイント、今なら2000ポイントです!

\Amazonギフト券 2000ポイントキャンペーン/
Amazonチャージ 初回購入で2000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

  1. hibiki より:

    ご質問失礼いたします。

    Arduinoを使って,PWM制御で 20V-0Vのパルス電位を発生させたいと考えているのですが,その場合どういった回路が考えられるでしょうか。

    外部電力源を回路に組み込むのは分かるのですが,20Vから0Vへの切り替えのプログラムができるものなのか,ご教授いただければ幸いです。

    • omoroyaomoroya より:

      コメントありがとうございます。
      別途、レベル変換モジュールをご用意ください。
      レベルシフト回路が必要になります。

  2. 日曜日 より:

    返事が遅くなりすいません。
    delay(delayTime);の待ち時間変更はif・else文で上手くいきました。
    ただdelayTimeの待ち時間の変化が分かりにくかったので、D4にトランジスタを付けてLEDのcommonに繋ぎ、点滅する様にもしました。
    また、手持ちの3色LEDがアノードcommonだったので、回路の方も色々変えました。

    Lesson36ですが、REDがD4になっていますが、PWM端子でなくてもanalogWriteは機能しますか??

    次は、analogReadとステッピングモーター(正転・逆転)を試したいと思います。

    • omoroyaomoroya より:

      コメントありがとうございます。
      >Lesson36ですが、REDがD4になっていますが、PWM端子でなくてもanalogWriteは機能しますか??
      たしかに、間違えています。。
      記載ミスなどコメントいただけると、とても助かります。
      記事内の回路図、スケッチを修正しました。
      ありがとうございます。

  3. 日曜日 より:

    点滅間隔を変えたいのですが、AVR・Arduino・C言語が初心者で教えて下さい。
    delay(delayTime); //設定した時間だけ待つ
    と言う記述があるので、for文で
    for (int delayTime = 10; delayTime < 200; delayTime += 1) //10~200にインクリメント
    をvoid loop()の直下に1行だけ書いたら、ループ1回に付きdelayTimeが+1されると言う事で良いですか??
    delay(delayTime);は改変前はdelay(10);って事ではないですか??

    4本足のフルカラーLEDで変色間隔を早くしたり遅くしたりしてみたいです。

    AmazonでArduino Nanoを購入したのですが、3端子レギュレーターに保護ダイオードが付いてなくて、USB電源だけで動かしていたら壊れてしまい、外部電源12vを入れてみたらレギュレーターの出力が6v強になりAVRまで壊れてしまった感じです。
    それで、返品交換の最中なので手元にArduinoが無いので、スケッチを書き込んで今すぐには試す事が出来ません。
    Arduino IDEでスケッチの書き込みを試すと、コンパイルは成功しています。
    Arduinoが無いので書き込みエラーは出ますけど・・・

    で、3端子レギュレーターの保護ダイオードを取り付ける事は、データシートに書いてあり、必須パーツだと私は思っているのですが、中国ではあまり気にしていないようです。
    Vin<Voutが長時間続くとレギュレーターが壊れるので、VoutからVinに電圧がいくように外部保護ダイオードを入れる事って各社のレギュレーター・メーカーのデータシートには書いてあります。
    5v Voutのすぐそばに、半田ジャンパー・ショートのパターンでもあったら良いのに・・・レギュレーターを使う時だけショートさせる。

    あと、このスケッチを見る限り、それぞれのfor分の中には2色の変数しかありませんが、全色点灯の白色は出ないのですよね!?
    明暗を1:2:3の割合で変更すると、明暗回数が6の時白色が来てその反対のタイミングで、全色消灯が来ると思うのですけど。
    それと赤色のLEDのVfは他の色より小さいので、抵抗値を1.5から倍くらいにした方が良い気がします。
    私は手持ちのCRD(定電流ダイオード10mA)あたりを入れて、明度・輝度を揃えようと思います。

    • omoroyaomoroya より:

      コメントありがとうございます。
      下記は、
      10から始まって200になったらfor文のループから抜けることになります。
      インクリメントはforループ1回につき+1です。
      >for (int delayTime = 10; delayTime < 200; delayTime += 1) //10~200にインクリメント >をvoid loop()の直下に1行だけ書いたら、ループ1回に付きdelayTimeが+1されると言う事で良いですか?? 何気に簡単に壊れます。特に過電圧が加わるとAVRまで壊れると思います・・・。 >AmazonでArduino Nanoを購入したのですが、3端子レギュレーターに保護ダイオードが付いてなくて、USB電源だけで動かしていたら壊れてしまい、 >外部電源12vを入れてみたらレギュレーターの出力が6v強になりAVRまで壊れてしまった感じです。 2色に限定したのは、+と-の2値を変化させるというようにしているためで、 赤、緑、青をPWMで同時に変化させることも可能です。 >あと、このスケッチを見る限り、それぞれのfor分の中には2色の変数しかありませんが、全色点灯の白色は出ないのですよね!? はい、下記はVfに合わせて変えた方が良いと思います。 初期のLessonのため、そこまではしていないといった感じです。 ちなみに、Lesson36 では、抵抗値をVfに合わせて変えています。 >それと赤色のLEDのVfは他の色より小さいので、抵抗値を1.5から倍くらいにした方が良い気がします。 >私は手持ちのCRD(定電流ダイオード10mA)あたりを入れて、明度・輝度を揃えようと思います。

    • 日曜日 より:

      delayTimeを10~200に+1して200まで行ったら10に戻り、また+1してを繰り返したいです。

    • omoroyaomoroya より:

      void loop()
      の中にfor文を記入されていると思いますので、for文を抜けたあと
      void loop()の中の他の記述を処理したあと最初に戻り
      また、for文に戻ってきて、10から始まります。
      したいことができていませんか?

  4. ゲルバナナ より:

    for文についてなんですが、i<255 という条件式は254を超えたらfor文のループを脱出できるということでよろしいですか?

    • omoroyaomoroya より:

      コメントありがとうございます。
      i < 255 は255未満となります。 例えば下記の場合、for文の処理を255回繰り返すことになります。 ※0~254で1ずつインクリメントのため255回 for(i = 0; i < 255; i++)

  5. ごりら より:

    「接続」の章で抵抗とUNOとLEDを繋いだらLEDがつくと思ったんですが、コードを書かないとつかないんですね。早とちりしてました。

    • omoroyaomoroya より:

      コメントありがとうございます。
      UNOの5V電源へ、LEDと抵抗をつなげばコードを書かなくても点灯しますよ。
      5V – LED – 330Ω – GND
      と接続してみてください。

  6. watagashi より:

    同じセットを購入し何から学べばいいか調べていて、見つけました!
    子どもたちと同じくらいの初心者なので少しづつ勉強していきたいと思います。
    (青色のピンコードが表記だと4に設定されていますが、回路上だと3じゃないかと思います!)

    • omoroyaomoroya より:

      コメントありがとうございます。
      ご指摘いただき助かります。
      スケッチ側を「3」に修正しました!

  7. mai より:

    初めまして。理工学部に通っている大学生です。電気電子を専攻しているので自分でも何か実際にいじってみようとarduinoの互換機を買ったところこのページにたどり着きました。とってもわかりやすいです。これからこのブログと一緒に勉強していきたいと思います。

    • omoroyaomoroya より:

      コメントありがとうございます!
      誰かの役にたっていると思えると更新する意欲も湧いてきます。

  8. 初期設定 より:

    「Lesson 04 目標」の項目にある「RED LED」は「RGB LED」の間違いかと存じます.

    情報科学専攻の大学院生です.
    Arduino勉強したてでこのサイトわ利用させていただいています.
    とても分かりやすく,初歩的なことも理解できますし,ちょっと勉強不足ぽいなと感じるところは飛ばしたとしても,きちんとしたいことが出来るのでありがたいです.ありがとうございます!

    • omoroyaomoroya より:

      コメントありがとうございます。
      誰かの役にたっていると思えると更新する意欲も湧いてきます。
      また、誤字指摘助かります。
      修正しておきました。

  9. 謝成龍 より:

    UNOを購入して、このブログを参考しております。

    質問につきまして、
    PIN3,5,6はアナログ出力ですが、
    サンプルコードのメイン関数内において
    digitalWrite(RED, HIGH);
    digitalWrite(GREEN, LOW);
    digitalWrite(BLUE, LOW);
    というコードが存在する意味がわかりません。

    実際に試したら、削除しても問題ないです。

    • 謝成龍 より:

      理解しました、初期値ですね。

    • omoroyaomoroya より:

      はい、その通りです。
      短いスケッチを描く場合は、数値で指定してしまっても問題ありません。
      ピン番号を色で区別しておけば、わかりやすいかなということです。

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