マイコンボードArduino NanoとフルカラーLEDを使って、三色を組み合わせてランダムな色でLチカさせてみようという試みです。
また、ランダムで光らせるためにPWMを使用し、その値をLCDキャラクタディスプレイに表示させてみます。
このページは、マイコン Lチカ道場 Arduino編「1-9:RGB三色ランダムな色でLチカ」に対応するページです。
回路図
回路図は下記になります。
基本的には前回「フルカラーLEDでRGB三色交互にLチカ」と同じですが、LCDキャラクタディスプレイ(I2C接続)を追加してみました。
部品リスト
使用する部品は下記になります。
品名 | 参照名 | 数量 | 数値・仕様 |
抵抗 | R1 | 1 | 330Ω |
抵抗 | R2,R3 | 2 | 220Ω |
フルカラーLED | D1 | 1 | OptoSupply製 OSTBABS4C2B |
LCDモジュール | – | 1 | HiLetgo製 20X4 キャラクタLCDディスプレイ |
マイコンボードはELEGOO製のArduino Nano互換品、LCDキャラクタディスプレイは下記のものを使用しています。
※詳細は参考リンクへ
前回に引き続き、フルカラーLEDは「OptoSupply製:OSTBABS4C2B」を使用しました。
このLEDの詳細は、前回の記事を参照ください。
使用するLCDキャラクタディスプレイ
HiLetgo製のI2C接続、20桁×4行のLCDキャラクタディスプレイです。
Amazonで購入しました。
下の写真のように、裏面にPCF8574TによるI2C変換基板が取り付けられています。
ここをArduino Nanoに接続します。
電源は5Vで動作します。
I2C接続のため、Arduino Nanoには通信線2本で接続します。
SCLピン:ArduinoのA5ピンへ接続
SDAピン:ArduinoのA4ピンへ接続
I2Cアドレスは、初期値「0x27」または「0x3F」のいずれかのようです。
私の購入したものは、「0x27」でした。
プログラム(スケッチ)
やりたいこと
- 0.5秒おきにランダムに色を変える。
- RGB各色はPWMで明るさを0~255段階でランダムに可変。
- LCDキャラクタディスプレイを追加して、上記のRGB各色のPWM幅を%で表示させる。
プログラム
#include <Wire.h> //I2C通信用のライブラリ
#include <LiquidCrystal_I2C.h> //I2C接続LCD用のライブラリ
LiquidCrystal_I2C lcd(0x27,20,4); // I2Cアドレス0x27か0x3F、20文字、4列
const int LED_B = 9; //LEDを接続するピン(PWM出力490Hz:3,9,10,11、980Hz:5,6)
const int LED_G = 10;
const int LED_R = 11;
int RandomNoisePin = A0; //ノイズによるランダム値を読み込むため、A0ピンを未接続としておく
int PWM_B = 0; //PWM用の変数、3色分
int PWM_G = 0;
int PWM_R = 0;
void setup() {
pinMode(LED_B, OUTPUT); //LED_Bピンを出力にする
pinMode(LED_G, OUTPUT); //LED_Gピンを出力にする
pinMode(LED_R, OUTPUT); //LED_Rピンを出力にする
randomSeed(analogRead(RandomNoisePin)); //ノイズによるランダム値を読み込んで疑似乱数列のスタート地点を設定
//LCD用
lcd.init();//LCD初期化
lcd.backlight();//LCDバックライト点灯
lcd.setCursor(0,0);//カーソルを0列、1行目へセット
lcd.print("----- NobuLabo -----");//テスト用文字列を表示
lcd.setCursor(0,1);//カーソルを0列、2行目へセット
lcd.print("ABCDEFGHIJKLMNOPQRST");//テスト用文字列を表示
lcd.setCursor(0,2);//カーソルを0列、3行目へセット
lcd.print("UVWXYZ0123456789abcd");//テスト用文字列を表示
lcd.setCursor(0,3);//カーソルを0列、4行目へセット
lcd.print("Random L\xc1\xb6"); //カタカナ「チカ」を文字コードで入力してみた。
delay(1000); //1秒間待ち(表示のため)
}
void loop() {
//0~255のランダム値を取得、RGB3色分
PWM_B = random(0, 255);
PWM_G = random(0, 255);
PWM_R = random(0, 255);
//0~255のランダム値でLEDをPWM点灯
analogWrite(LED_B, PWM_B);
analogWrite(LED_G, PWM_G);
analogWrite(LED_R, PWM_R);
//LCD用
lcd.home(); //カーソルをホームポジション(左上)へ移動
lcd.clear(); //表示をクリア
lcd.setCursor(0, 0); //カーソルを0列、1行目へセット
lcd.print("R="); //文字列R=を表示
lcd.print(PWM_R/2.55 ,1);//2.55で割って小数点一桁まで表示
lcd.print("%"); //文字列%を表示
lcd.setCursor(0, 1); //カーソルを0列、2行目へセット
lcd.print("G=");
lcd.print(PWM_G/2.55 ,1);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("B=");
lcd.print(PWM_B/2.55 ,1);
lcd.print("%");
delay(500);//0.5秒間待ち
}
主な動作の説明はコメント文を参照ください。
今回はI2CでLCDキャラクタディスプレイを接続するので、ライブラリ「Wire」を使用します。
LCDキャラクタディスプレイについては、ライブラリ「LiquidCrystal_I2C」を使用しました。
※デフォルトではインストールされていないので、ライブラリマネージャから追加しました。
Random関数については、以前の記事で紹介しています。
動作確認
ブレッドボードに組んだ状態が下記になります。
LCDキャラクタディスプレイの裏面と、ブレッドボード上の部品などとのショートには気を付けてください。
※撮影のためにブレッドボード上に置こうとしたら、ショートしてArduino Nanoから煙が上がりました…
フルカラーLEDの色と、LCDキャラクタディスプレイの表示を確認しました。
電源ONのタイミングで、下記のように文字をテスト表示させています。
LED点灯時は、PWM幅をRGB各色で255をMAX100%として表示しています。
RGB各色の強弱で色が調整できていることを確認しました。
【動画で見てみよう】
消費電流は、約72mAです。
まとめ
Arduino NanoとフルカラーLEDを使って、三色を組み合わせてランダムな色でLチカさせてみました。
また、LCDキャラクタディスプレイを使用して、PWMの値を表示させてみることに成功しました。
簡単なプログラムで動作させることが出来ましたが、意外とつまずきもありました…
・MsTimer2ライブラリを使用すると、PWM3・11が競合するので他に変更する必要がある。
→PWMピンを他(5など)に変えることで対策できました。
・MsTimer2の割込み関数の中にLCD表示用の命令を入れても動かなかった…
→これは良くわからなかったため、今回はMsTimer2を使わないプログラムにしました。
いずれもコンパイルエラーは出ないため、なぜ動かないのか悩みました。
ライブラリの中身や、使われているマイコンの機能をちゃんと知って使わないといけませんね。
引き続き、さらに難しいLチカに挑戦していきましょう。
参考リンク
使用したLCDキャラクタディスプレイモジュール
Arduino Nano 純正品
今回使っているのは、ELEGOO製のArduino Nano互換ボードです。