【Arduino】フルカラーLEDの使い方|気持ちを色で表す
CHA 記事内に商品プロモーションを含む場合がありますみなさんは気持ちを表現するときどのように表現しますか?声に出す、表情に出す、色々とあると思います。今回はロボットの気持ちを色で表現します。
私たちが笑ったり怒ったりするように、ロボットが黄色や赤色で気持ちを表現したら素敵だと思いませんか?
今回の記事で解説すること- フルカラーLEDの仕組み
- フルカラーLEDの使い方
- 気持ちを色で表現するロボットの作り方
私のブログで登場するロボットはArduinoを搭載した車輪ロボット「NR-02」です。下記記事のArduinoを始めるならこれを買えばOKの見出しで必要なパーツを紹介しています。
Contents- 解説動画
- ロボットの気持ちを表現するとは?
- フルカラーLEDの仕組み
- フルカラーLEDの使い方
- フルカラーLEDの回路
- フルカラーLEDの配線図
- フルカラーLEDのプログラム
- ロボットの気持ちを色で表現する方法
- ロボットの気持ちを色で表現するソースコード
- プログラムの解説
- まとめ
解説動画
今回の記事はこちらの動画をまとめたものです。
ロボットの気持ちを表現するとは?
今回は色でロボットの気持ちを表現しています。実際のロボットの映像はこちらです。(↓ロボットが動いてLEDが光る部分から再生されます。)
鳴き声だけでなく色がつくことでさらに可愛くなりますね!
CHAほぼR2-D2です!(CHA比)
フルカラーLEDの仕組み
フルカラーLEDはこんな見た目をしています。
出典:秋月電子通商赤色LEDと比べると、フルカラーLEDは足の数が多いことが分かります。
チャボット足が4本もあるなんて混乱しそうだよ!
CHA最初は不安に思いますよね。意外と作りはシンプルなので解説します!
フルカラーLEDはR(赤)、G(緑)、B(青)の3色が1つのLEDに収められています。この3色は光の三原色です。赤、緑、青を混ぜることでたくさんの光の色を表現することができます。
上の図を見ると足が6本ありそうですけど、実物は4本しかないですよね?
足が4本のワケは下の図の通りです。
- LEDの入口(アノード)を共通にしたアノードコモン
- LEDの出口(カソード)を共通にしたカソードコモン
このどちらかを共通にする仕組みのおかげで、足が4本でいいのです。
CHAちなみにコモンは共通という意味です。電気電子分野ではポピュラーな表現!
フルカラーLEDの使い方
ではフルカラーLEDを実際に使ってみましょう。フルカラーLEDはこちらから購入可能です。
このフルカラーLEDを使ってこんな光らせ方をしてみましょう。(↓フルカラーLEDの点灯部分から再生されます。)
CHA大切な人と一緒にイルミネーションLED見てみませんか♡?
フルカラーLEDの回路回路はLチカの回路を3つ作るだけです。
アノードコモンの場合は、電源部分を共通にします。Arduino側に抵抗を通して繋ぐ形です。カソードコモンの場合は、GNDを共通にします。Arduinoから抵抗を通してフルカラーLEDに繋ぐ形です。
この図の通りとてもシンプルな回路です。
チャボットフルカラーLEDのどの足がどこに繋がるかLEDを見ても分からないよ?
CHAデータシートやマニュアルを見れば大丈夫!
例えばこちらのカソードコモンのフルカラーLED。
出典:秋月電子通商「OSTA5131A-R-PG-B データシート(akizukidenshi.com)」<https://akizukidenshi.com/download/ds/optosupply/OSTA5131A-RPGB.pdf>足の長さが実は1本1本違うんです。データシートの左図に①~④で示された足に長さが書いてあります。それを右の①~④の名称と照らし合わせれば分かります。
ちなみにアノードコモンはLOWを出力したら光るのに対し、カソードコモンはHIGHの出力で光ります。慣れるまではHIGHで光る方が分かりやすいです。そのためカソードコモンの使用をおすすめします。
フルカラーLEDの配線図配線図はこのようになります。
回路図だけで分からない人はこの配線図を参考にしてください!
フルカラーLEDのプログラムプログラムの解説です。
フルカラーLEDのプログラムのソースコードソースコードは以下の通りです。
const int PIN_LED_R = 11; //フルカラーLEDのR const int PIN_LED_B = 10; //フルカラーLEDのB const int PIN_LED_G = 9; //フルカラーLEDのG void lightRGB(int red, int green, int blue) { analogWrite(PIN_LED_R, red); analogWrite(PIN_LED_G, green); analogWrite(PIN_LED_B, blue); } void setup() { // put your setup code here, to run once: } void loop() { for (int i = 0; i <= 255; i++) { lightRGB(i, 0, 0); delay(10); } for (int i = 0; i <= 255; i++) { lightRGB(255, i, 0); delay(10); } for (int i = 255; i >= 0; i--) { lightRGB(i, 255, 0); delay(10); } for (int i = 0; i <= 255; i++) { lightRGB(0, 255, i); delay(10); } for (int i = 255; i >= 0; i--) { lightRGB(0, i, 255); delay(10); } for (int i = 0; i <= 255; i++) { lightRGB(i, 0, 255); delay(10); } for (int i = 0; i <= 255; i++) { lightRGB(255, i, 255); delay(10); } for (int i = 255; i >= 0; i--) { lightRGB(i, i, i); delay(10); } } フルカラーLEDのソースコードの解説配線図でも示したように、Arduinoの9~11番にそれぞれG,B,Rの色が繋がります。9~11番はanalogWriteが使えるので、ここにフルカラーLEDを繋いでます!
このRGBの色のバランス(それぞれに入る数値)は色を変更するたびに、その色に見合った数値が必要です。そこでlightRGBという関数を作りました。
ではスムーズに色を変えている仕組みはなんでしょう。正解はfor文を使っていたからです!
lightRGB(i, 0, 0);のi部分が0から255まで1ずつ増えています。()内はR,G,Bの順なので、徐々に赤色が強くなる…という仕組みです。
以下同じfor文を使っていきます。
この仕組みが分かってから再度、先ほどの動画を見ていただくと理解が深まります。
チャボット何個目のfor文なのか分かった!
ロボットの気持ちを色で表現する方法
今回はスピーカーを使ったロボットの鳴き声と組み合わせたプログラムにしました。
鳴き声に合わせて、フルカラーLEDを使って色が表現されるプログラムです。
今回のプログラムのポイント- 起動時:赤→緑→青→白の順に点灯
- 目の前に障害物がある:赤
- 障害物が無くなった:黄色
ソースコードは以下の通りです。
#define HAPPY 1 // #define ANGER 2 #define WAKEUP 3 const int PIN_MOTOR_L_A = 6; //左モータA const int PIN_MOTOR_L_B = 9; //左モータB const int PIN_MOTOR_R_A = 5; //右モータA const int PIN_MOTOR_R_B = 3; //右モータB const int PIN_BUTTON = 8; //押しボタンスイッチ const int PIN_LED_R = 11; //フルカラーLEDのR const int PIN_LED_B = 10; //フルカラーLEDのB const int PIN_LED_G = 7; //フルカラーLEDのG const int PIN_SPEAKER = 12; //スピーカー const int BEAT = 200; void lightRGB(int red, int green, int blue) { analogWrite(PIN_LED_R, red); analogWrite(PIN_LED_G, green); analogWrite(PIN_LED_B, blue); } void sing(int emotion) { if (emotion == HAPPY) { lightRGB(255, 255, 0); tone(PIN_SPEAKER,1760,BEAT / 2) ; // ラ delay(BEAT / 2) ; tone(PIN_SPEAKER,1976,BEAT / 2) ; // シ delay(BEAT / 2) ; tone(PIN_SPEAKER,1760,BEAT / 2) ; // ラ delay(BEAT / 2) ; tone(PIN_SPEAKER,1976,BEAT / 2) ; // シ delay(BEAT / 2) ; } if (emotion == ANGER) { lightRGB(255, 0, 0); tone(PIN_SPEAKER,247,BEAT / 2) ; // シ delay(BEAT / 2) ; tone(PIN_SPEAKER,247,BEAT / 2) ; // シ delay(BEAT / 2) ; } if (emotion == WAKEUP) { lightRGB(255, 0, 0); tone(PIN_SPEAKER,1047,BEAT) ; // ド delay(BEAT) ; lightRGB(0, 255, 0); tone(PIN_SPEAKER,1319,BEAT) ; // ミ delay(BEAT) ; lightRGB(0, 0, 255); tone(PIN_SPEAKER,1175,BEAT * 2) ; // レ delay(BEAT * 2) ; lightRGB(255, 255, 255); } } //前進 void moveForward(int power, int duration) { analogWrite(PIN_MOTOR_L_A, power); //左A analogWrite(PIN_MOTOR_L_B, 0); //左B analogWrite(PIN_MOTOR_R_A, power); //右A analogWrite(PIN_MOTOR_R_B, 0); //右B delay(duration); } //後退 void moveBackward(int power, int duration) { analogWrite(PIN_MOTOR_L_A, 0); //左A analogWrite(PIN_MOTOR_L_B, power); //左B analogWrite(PIN_MOTOR_R_A, 0); //右A analogWrite(PIN_MOTOR_R_B, power); //右B delay(duration); } //右旋回 void turnRight(int power, int duration) { analogWrite(PIN_MOTOR_L_A, power); //左A analogWrite(PIN_MOTOR_L_B, 0); //左B analogWrite(PIN_MOTOR_R_A, 0); //右A analogWrite(PIN_MOTOR_R_B, power); //右B delay(duration); } //左旋回 void turnLeft(int power, int duration) { analogWrite(PIN_MOTOR_L_A, 0); //左A analogWrite(PIN_MOTOR_L_B, power); //左B analogWrite(PIN_MOTOR_R_A, power); //右A analogWrite(PIN_MOTOR_R_B, 0); //右B delay(duration); } //ブレーキ void stopBreak(int duration) { digitalWrite(PIN_MOTOR_L_A, LOW); //左A digitalWrite(PIN_MOTOR_L_B, LOW); //左B digitalWrite(PIN_MOTOR_R_A, LOW); //右A digitalWrite(PIN_MOTOR_R_B, LOW); //右B delay(duration); } //フリー void stopFree(int duration) { digitalWrite(PIN_MOTOR_L_A, HIGH); //左A digitalWrite(PIN_MOTOR_L_B, HIGH); //左B digitalWrite(PIN_MOTOR_R_A, HIGH); //右A digitalWrite(PIN_MOTOR_R_B, HIGH); //右B delay(duration); } void setup() { //ピンの出力(Output)or入力(Input)設定 pinMode(PIN_MOTOR_L_A, OUTPUT); //左モータA pinMode(PIN_MOTOR_L_B, OUTPUT); //左モータB pinMode(PIN_MOTOR_R_A, OUTPUT); //右モータA pinMode(PIN_MOTOR_R_B, OUTPUT); //右モータB pinMode(PIN_BUTTON, INPUT); //スイッチ sing(WAKEUP); //起動完了の鳴き声 //スタートボタンを押されるのを待つ while(digitalRead(PIN_BUTTON)==0); delay(1000); //1秒待つ } void loop() { int sensor_value; //距離センサの値 sensor_value = analogRead(A0); //センサの値を読み取る if (sensor_value < 270) { //270より小さい場合(遠い場合) moveForward(255, 10); } else { stopBreak(500); sing(ANGER); moveBackward(127, 500); turnRight(127, 500); stopBreak(500); sing(HAPPY); } } プログラムの解説フルカラーLEDのみを使ったプログラムではarduinoと繋ぐのに9~11番を使用しました。しかし9番はモータで使いたいので、緑(G)は7番に移動させます。
7番はanalogWriteを使えないピンですので、LOWかHIGHのどちらかになってしまいます。
ですが、プログラム上はanalogWriteを使います。7番に繋いで使うと、0を入力で0(LOW)、1以上を入力で255(HIGH)という2パターンになります。
チャボットどうしてanalogWriteのままにするの?
CHAもしも緑(G)を滑らかに変化させたくなったときに、モータとピン番号を入れ替えるだけで済むからです。
色の変化は鳴き声の箇所に一緒に入れるだけです。
起動時に関しては、鳴き声に合わせてド(赤)→ミ(青)→レ(緑)→(白)とするので、それぞれの音とセットでプログラムします。
ちなみに障害物の有る無しは測距センサを使って判断しています。
まとめ
今回の記事ではフルカラーLEDの使い方と、鳴き声に合わせて気持ちを色で表現する方法を紹介しました。
この色の表現は一例ですので、ぜひみなさんのセンスを光らせた色の表現をしてみてください。完成したら、ぜひ、CHAに(@CHAfreeschool )見せてくださいね!
今回の記事で解説したこと- フルカラーLEDの仕組み
- フルカラーLEDの使い方
- 気持ちを色で表現するロボットの作り方
もっとロボットに色々なプログラムをつけてみませんか?例えば、光センサ搭載で自動でライトが点灯するロボット。実践して、パワーアップしたロボットにしましょう!
あわせて読みたい光センサを使ったロボットを作ろう|部屋が暗いと自動でライトがつくプログラミングの変数が理解できなければ、こちらの記事です。何故変数を使った方がいいのかこれを読めば理解できます!
あわせて読みたい【Arduino初級】数値の調整を効率化!「変数」の使い方を解説!最後まで読んでいただき、ありがとうございました!以上、CHAでした!
#analogWrite#Arduino#LED#ものづくり スポンサーリンク ABOUT ME CHATwitterYouTube「勉強に自由を!」をスローガンに、学校に限らず、好きな時に、好きな場所で、好きなことをYouTubeで勉強できるようになればいいなと思って授業動画を作っています!