こんにちは、てっちーです。赤・緑・青が1つのパッケージに入った、RGB LEDを使ったArduinoプログラミングをしてみます。Arduinoの機能で、LEDの明るさを制御して、いろいろな色を作ってみましょう。光の3原色の赤・緑・青で多くの色ができることを確認したいと思います。
目標
RGB LEDを使っていろいろな色で光らせる
今回やること
- RGB LEDで赤・緑・青の各色を点灯させる
- Arduinoで明るさ(階調)を調整する
- 色々な色を点灯させる
回路構成
RGB LED
RGB LEDの端子配置は下の図のとおりです。一番長い足が、カソードと呼ばれていて、GNDに接続します。
回路図
回路構成は下記の図のとおりです。Arduino UNOのRGB LED4つの端子に、3に青、5に緑、6に赤、カソードにGNDを接続してください。LEDですので、端子3、端子5、端子6に、抵抗を直列につなぎます。また、LEDの端子の並びが間違えると動きませんので、よく注意してください。
回路イメージ
回路は下の図のように構成してみてください。下の抵抗は220Ωを使っていますが、少しまぶしいので、1kΩの抵抗でも良いです。
サンプルコード
Elegooのチュートリアルにあるサンプルコードを使います。「Arduino UNO チュートリアルダウンロード – Elegoo版」を参考にチュートリアルをダウンロードして、 “English/code/Lesson 4 RGB LED/RGB LED/RGB_LED.ino”をコピーした後、ArduinoIDEで開いてください。
USBケーブルとArduinoを接続した後、コンパイルしてArduino UNOにプログラムを書きこんでみてください。参考までにコンパイルして書き込みは下記のボタンになります。
Arduino UNOでLEDを制御するしくみ
LEDは、電圧をかけて電流を流すことで光らせることができます。上の回路では端子3,5,6にプラスの電圧をかけてやればLEDを光らせることができそうです。Arduino UNOの端子は、GPIO(ジーピーアイオー)と呼ばれる汎用入出力で、プログラムすることで、電圧をかけたり、電圧を感知したりできます。
GPIO(汎用入出力 General Purpose Input/Output)
GPIOは、プログラムで制御出来て、デジタル信号を出したり、受け取ったりできる端子の事です。つまり、信号を出す出力と信号を受け取れる入力の2つの状態を持つことができます。デジタル信号とは、0と1の2つ状態をとる信号の事です。0と1はそれぞれLOW(ロウ)とHIGH(ハイ)とも表現します。次にGPIOの入力と出力について説明します。
出力
0と1に相当する電圧を出力します。Arduino UNOでは、電源と同じ5Vの電圧(HIGH)とGNDと同じ0Vの電圧(LOW)の2種類の電圧を出すことができます。今回の回路では出力として使っていて、HIGHの電圧を出すとLEDが光り、LOWの電圧を出すとLEDが消える様になっています。
入力
端子が入力状態のとき、入力されている電圧が、HIGHかLOWかを知ることができます。
プログラムコード
ここで少し詳しくプログラムについて説明したいと思います。プログラムについて知りたい方は読んでください。最初なので、項目が多いですが頑張ってください。
define(デファイン)
defineは、ある文字列に別の数値や文字列の別名を付けることができます。下の例では、BLUE(青)を3、GREEN(緑)を5、RED(赤)を6と別名を付けています。これは、回路でLEDと接続した端子、3に青、5に緑、6に赤に対応させて、BLUE、GREEN、REDの文字でLEDを点けたり消したりするプログラムできるように設定を行っています。
pinMode(buttonBpin, INPUT_PULLUP);
setup関数
“void setup()”は、関数と呼ばれるものです。setup関数は特殊な関数で、プログラム開始時に1回だけ、その後に{}の中身が実行されます。プログラム開始時とは電源投入時やリセット時に発生します。
{}の中にある、pinMode関数とdigitalWrite関数はGPIOの状態を変えることのできる関数です。pinMode関数は、入力(INPUT)と出力(OUTPUT)状態を変えることができます。digitalWrite関数は、端子が出力の時にHIGHを出すかLOWを出すかを決めることができます。
下記の例では、defineで別名を付けたRED,GREEN,BLUEの端子を出力状態にして、REDのLEDを光らせて、GREENとBLUEは消すとの設定をしています。
void setup() { pinMode(RED, OUTPUT); // REDを出力に設定 pinMode(GREEN, OUTPUT); // GREENを出力に設定 pinMode(BLUE, OUTPUT); // BLUEを出力に設定 digitalWrite(RED, HIGH); // REDをHIGHに設定 digitalWrite(GREEN, LOW); // GREENをHIGHに設定 digitalWrite(BLUE, LOW); // BLUEをHIGHに設定 }
変数
変数とは、プログラムで使う数や文字を入れられる箱のようなものです。中には1つしか入らず、後から何かを入れると先に入っていたものはなくなってしまいます。下の例では、redValue, greenValue, blueValueという3つの変数を作って(宣言して)います。”int“は整数を入れる変数を宣言することを意味しています。
int redValue; int greenValue; int blueValue;
loop関数
loop関数も特殊な関数で、setup関数が実行された後に{}の中身がずっと繰り返し実行される関数です。
void loop() { … }
loop関数の{}の中には、for文が3つ入っています。最初のfor文は下のようになっています。for文も繰り返し実行するための関数で、ここでは変数iに1を足しながら、0→254まで{}の中を実行します。つまり{}の中が、255回実行されます。
for文の中のanalogWrite関数はPWMという方法でLEDの明るさを調整することができます。そしてanalogWrite(RED, redValue)とは、RED端子の明るさをredValueの値にするという意味になります。したがって、下の例では、最初の赤く光った状態から、赤を少しづつ暗く、緑を明るくしていって、最後は緑を光らせるというプログラムになります。
redValue = 255; // 変数 redValueに255を入れる greenValue = 0; // 変数 greenValueに0を入れる blueValue = 0; // 変数 blueValueに0を入れる for(int i = 0; i < 255; i += 1) // 254回繰り返す { redValue -= 1; // redValueを1小さくする greenValue += 1; // greenValueを1大きくする analogWrite(RED, redValue); // redValueの値を赤の明るさに設定する analogWrite(GREEN, greenValue); // greenValueの値を緑の明るさに設定する delay(delayTime); // 少し待つ }
2つめのfor文では、最初の緑が光った状態から、緑を暗く、青を明るくしていき、最後は青を光らせます。
3つめのfor文では、最初の青が光った状態から、青を暗く、赤を明るくしていき、最後は赤を光らせます。
そして最初に戻り、赤が光った状態から再スタートとなります。
実際の動作をみてみよう
次は、実際のLEDの色の変化を見てみてください。赤、青、緑の3つの色しかないのに、色々なに光ることが分かると思います。実は、この赤、青、緑は光の三原色と言われていて、この3色でほとんどの色を再現できます。液晶テレビの画面も虫メガネなどで拡大してみるとこの3色しか使われていないことが分かります。
余談ですが、絵の具の色の作り方はカラープリンタと同じ方法で、光の三原色とは異なる別のルールになります。光と同じように混ぜても、絵の具は光と同じ色にならないので注意してください。
変更してみよう
どう変わるか想像しながら、次のようにプログラムを変えて変化を確認してみてください。編集方法が分からない方はキーボードを使えなくても、Arduinoのプログラムを編集してみようを見てください。
- 使っていないredValue, greenValue, blueValueをfor文の前に、255を入れてみる。例えば、最初のfor文であれば、”blueValue=255;”としてみる。
- “//”はコメントに変えて無視されるようになる。これを使って、redValue, greenValue, blueValueの値を減らしたり、増やしたりしている分をコメントにして値が変わらない様にしてみる。
まとめ
今回は本格的にプログラムを使う最初の回だったのでかなり難しかったのではないでしょうか。色々ありましたが、特に重要なのは次の事です。よく覚えておいてください。
よくわからなければ、Arduinoでいろいろな色を光らせることができることだけは覚えておきましょう。
- GPIOと入力・出力、HIGH・LOWについて
- setup関数:プログラム開始時に1回実行する
- loop関数:何度も繰り返し実行する
- for文:何度も繰り返しできる
コメント