Arduino 入門
Lesson 04
【RGBダイオード制御編】
「Arduino」を使ったマイコンのプログラミングを子供と一緒に学習するブログ。
少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。
本日はLesson 04 RGBダイオード制御編です。
Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
はじめに
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つです。
準備
さっそく、準備にとりかかりましょう。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - 共通カソードRGB 発光ダイオード(足が4本あります)
- 抵抗 220Ω 1本
- M-M Jumper wire(UNOと部品をつなぐための配線)
使用部品説明
使用部品の説明をしていきます。
ブレッドボード
ブレッドボードを使用することで、半田を使用することなく穴に素子を挿すことで接続ができます。
ブレッドボードの詳細はLesson 03を参照してください。
RGB LED
赤、緑、青の3色のLEDが一つになったLEDです。
下図に示すように4本のリード線があります。
3本のリード線が、それぞれ青、緑、赤となりANODE(+極)となります。
残りの一本がCATHODE(陰極)になります。
直接電源に接続することはしないようにしましょう。
必ず、抵抗などで電流を制限して使いましょう。
手持ちがないかたは以下からどうぞ。
単純に多数のLEDを光らせたい方は、セットで購入がおすすめです。
種類が豊富で色々と楽しめます。
抵抗
名前の通り、抵抗は電流の流れを妨げる働きがあります。
本Lessonでは220Ωの抵抗を使います。
抵抗の詳細な説明に関しては、Lesson 03を参照してください。
カラーコードの説明があります。
抵抗のセット
Jumper wire(配線)
UNOの電源ポートとブレッドボードの接続や素子どうしを接続に使います。
Jumper wireは「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
PWM制御の説明
PWMのパルスは下に示すような、周期的なパルスのことです。
本Lessonではこのパルスの5Vになっている期間、0Vになっている期間を制御します。
PWM制御
PWM信号の周波数は約490Hzです。
時間に直す場合は、逆数を取れば良く「時間=1/周波数」の関係があります。
よって、1/490=0.00204・・・
約0.002秒(約1/500秒)
となります。
下に示すように、1/500秒ごとに同じパルスを繰り返します。
その時に5Vになっている期間、0Vになっている期間を制御することでLEDの点滅のスピードが変わります。
この変化が人間の目には明るさが変わっているように見えることになります。
「analogWrite」関数には0~255の値を設定することができます。
この値によって1/500秒の間の5Vの期間、0Vの期間を制御できるようになっています。
使用する関数とピン番号
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に接続します。
回路図がこちら。
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
図に示すように、ブレッドボードを使用してUNO、RGB LED、抵抗を配線で接続しましょう。
回路図同様、使用するポートは、「3、5、6、GND」です。
本Lessonでは、「3(青)、5(緑)、6(赤)」としています。
RGB LEDのCathodeはGND。
穴に挿入しづらいときは、ラジオペンチなどを使用すると良いかもしれません。
下記はつないで電源を入れた状態です。
接続時は電源はつながないでください。
コードの書き込み
接続が終わったら、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;
また、違った色の変化が見られると思います。
動作確認
実際に光らせた状態がこちら。
もし、小型の除ける顕微鏡などありましたらテレビ画面をのぞいてみてください。
液晶画面が赤、緑、青のかたまりが一つあり、画面上にそのかたまりがたくさん並んでいるのが見えるはずです。
こんな感じに見えるはずです。
もし手元になければ、ぜひ一台あった方が良いと思います。
手軽に色々と遊べます。
お勧めの携帯型顕微鏡を記載しておきます。
外へ手軽に持っていける携帯型顕微鏡・ズーム機能で対象物に合わせて観察できる
・LEDライト内蔵で見やすい
・電源の心配なく外で使用可能
・倍率:60-120倍
・電源:単4形アルカリ乾電池1本(別売)
・重量:約30g(電池含まず)
値段もお手頃で、使いやすいです。
まとめ
今回は以下の内容について理解してもらいました。
- 赤、緑、青の輝度の違いにより、RGB LEDの色が3色以外の色になっていることを理解する。
- 輝度の変更はパルス幅変調「PWM」にて制御することを理解する。
今回は、この「PWM」というのを理解することがポイントです。
また、楽しんで遊ぶことも目標の1つでした。
今回のLessonは、なかなか良かったです。
Lesson 04 【RGBダイオード制御編】はここまで。
ぜひ、みなさんもやってみてください。
次回はLesson 05は【プッシュボタンスイッチ編】です。
デジタル入力について理解できる内容となっています。
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
いつも,楽しく拝見しております.
抵抗,RGB LED,220Ω抵抗,UNOを接続しましたが,LEDがうまく点灯しません.
電気工作初心者のため,不具合の原因が見つけられず困っております.
UNOにUSBケーブルを挿し,電源を供給した際,一瞬だけLEDが点灯したあと消灯しました.
また,抵抗やLEDの足にピンセットで触れている間だけ点灯しました.
お忙しいところ恐れ入りますが,ご教授いただけますと幸いです.
コメントありがとうございます。
>抵抗やLEDの足にピンセットで触れている間だけ点灯しました。
とありますので、ブレッドボードの接続不良ではないでしょうか?
ブレッドボードを交換してみてください。
もしくは、UNO側の接続不良。
普通のLEDであれば点灯しますか?
迅速なお返事をありがとうございました.
接触不良を疑いましたが,下記のごりらさんのコメントと同じ内容でした.
コードを入力して初めて点灯がスタートして,解決しました.
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ごりら より:
2021年2月9日 5:45 PM
「接続」の章で抵抗とUNOとLEDを繋いだらLEDがつくと思ったんですが、コードを書かないとつかないんですね。早とちりしてました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
解決したとのこと、よかったです!
ご質問失礼いたします。
Arduinoを使って,PWM制御で 20V-0Vのパルス電位を発生させたいと考えているのですが,その場合どういった回路が考えられるでしょうか。
外部電力源を回路に組み込むのは分かるのですが,20Vから0Vへの切り替えのプログラムができるものなのか,ご教授いただければ幸いです。
コメントありがとうございます。
別途、レベル変換モジュールをご用意ください。
レベルシフト回路が必要になります。
返事が遅くなりすいません。
delay(delayTime);の待ち時間変更はif・else文で上手くいきました。
ただdelayTimeの待ち時間の変化が分かりにくかったので、D4にトランジスタを付けてLEDのcommonに繋ぎ、点滅する様にもしました。
また、手持ちの3色LEDがアノードcommonだったので、回路の方も色々変えました。
Lesson36ですが、REDがD4になっていますが、PWM端子でなくてもanalogWriteは機能しますか??
次は、analogReadとステッピングモーター(正転・逆転)を試したいと思います。
コメントありがとうございます。
>Lesson36ですが、REDがD4になっていますが、PWM端子でなくてもanalogWriteは機能しますか??
たしかに、間違えています。。
記載ミスなどコメントいただけると、とても助かります。
記事内の回路図、スケッチを修正しました。
ありがとうございます。
点滅間隔を変えたいのですが、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)あたりを入れて、明度・輝度を揃えようと思います。
コメントありがとうございます。
下記は、
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してを繰り返したいです。
void loop()
の中にfor文を記入されていると思いますので、for文を抜けたあと
void loop()の中の他の記述を処理したあと最初に戻り
また、for文に戻ってきて、10から始まります。
したいことができていませんか?
for文についてなんですが、i<255 という条件式は254を超えたらfor文のループを脱出できるということでよろしいですか?
コメントありがとうございます。
i < 255 は255未満となります。 例えば下記の場合、for文の処理を255回繰り返すことになります。 ※0~254で1ずつインクリメントのため255回 for(i = 0; i < 255; i++)
「接続」の章で抵抗とUNOとLEDを繋いだらLEDがつくと思ったんですが、コードを書かないとつかないんですね。早とちりしてました。
コメントありがとうございます。
UNOの5V電源へ、LEDと抵抗をつなげばコードを書かなくても点灯しますよ。
5V – LED – 330Ω – GND
と接続してみてください。
同じセットを購入し何から学べばいいか調べていて、見つけました!
子どもたちと同じくらいの初心者なので少しづつ勉強していきたいと思います。
(青色のピンコードが表記だと4に設定されていますが、回路上だと3じゃないかと思います!)
コメントありがとうございます。
ご指摘いただき助かります。
スケッチ側を「3」に修正しました!
初めまして。理工学部に通っている大学生です。電気電子を専攻しているので自分でも何か実際にいじってみようとarduinoの互換機を買ったところこのページにたどり着きました。とってもわかりやすいです。これからこのブログと一緒に勉強していきたいと思います。
コメントありがとうございます!
誰かの役にたっていると思えると更新する意欲も湧いてきます。
「Lesson 04 目標」の項目にある「RED LED」は「RGB LED」の間違いかと存じます.
情報科学専攻の大学院生です.
Arduino勉強したてでこのサイトわ利用させていただいています.
とても分かりやすく,初歩的なことも理解できますし,ちょっと勉強不足ぽいなと感じるところは飛ばしたとしても,きちんとしたいことが出来るのでありがたいです.ありがとうございます!
コメントありがとうございます。
誰かの役にたっていると思えると更新する意欲も湧いてきます。
また、誤字指摘助かります。
修正しておきました。
UNOを購入して、このブログを参考しております。
質問につきまして、
PIN3,5,6はアナログ出力ですが、
サンプルコードのメイン関数内において
digitalWrite(RED, HIGH);
digitalWrite(GREEN, LOW);
digitalWrite(BLUE, LOW);
というコードが存在する意味がわかりません。
実際に試したら、削除しても問題ないです。
理解しました、初期値ですね。
はい、その通りです。
短いスケッチを描く場合は、数値で指定してしまっても問題ありません。
ピン番号を色で区別しておけば、わかりやすいかなということです。