フルカラーLEDでRGB三色をランダムにLチカ【マイコン Lチカ道場 Arduino編 1-9】

フルカラーLEDでLチカ Arduino
当サイトのリンクにはアフィリエイト広告が含まれています。

マイコンボードArduino NanoフルカラーLEDを使って、三色を組み合わせてランダムな色でLチカさせてみようという試みです。

また、ランダムで光らせるためにPWMを使用し、その値をLCDキャラクタディスプレイに表示させてみます。

このページは、マイコン Lチカ道場 Arduino編「1-9:RGB三色ランダムな色でLチカ」に対応するページです。

スポンサーリンク

回路図

回路図は下記になります。
基本的には前回「フルカラーLEDでRGB三色交互にLチカ」と同じですが、LCDキャラクタディスプレイ(I2C接続)を追加してみました。

回路図

部品リスト

使用する部品は下記になります。

品名参照名数量数値・仕様
抵抗R11330Ω
抵抗R2,R32220Ω
フルカラーLEDD11OptoSupply製
OSTBABS4C2B
LCDモジュール1HiLetgo製 20X4
キャラクタLCDディスプレイ

マイコンボードはELEGOO製のArduino Nano互換品、LCDキャラクタディスプレイは下記のものを使用しています。
※詳細は参考リンク

前回に引き続き、フルカラーLEDは「OptoSupply製:OSTBABS4C2B」を使用しました。

フルカラーLED「OptoSupply製:OSTBABS4C2B」

このLEDの詳細は、前回の記事を参照ください。

使用するLCDキャラクタディスプレイ

HiLetgo製のI2C接続、20桁×4行のLCDキャラクタディスプレイです。
Amazonで購入しました。

下の写真のように、裏面にPCF8574TによるI2C変換基板が取り付けられています。
ここをArduino Nanoに接続します。

20桁×4行LCDキャラクタディスプレイ
20桁×4行LCDキャラクタディスプレイ:裏面

電源は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のタイミングで、下記のように文字をテスト表示させています。

LCDキャラクタディスプレイのテスト表示

LED点灯時は、PWM幅をRGB各色で255をMAX100%として表示しています。
RGB各色の強弱で色が調整できていることを確認しました。

赤=14.1%、緑=23.9%、青=94.5%
赤=14.1%、緑=23.9%、青=94.5%
赤=80%、緑=63.1%、青=0.8%
赤=80%、緑=63.1%、青=0.8%
赤=3.1%、緑=49.4%、青=7.8%
赤=3.1%、緑=49.4%、青=7.8%
赤=18.8%、緑=95.3%、青=33.3%
赤=18.8%、緑=95.3%、青=33.3%
赤=67.5%、緑=2.7%、青=31.8%
赤=67.5%、緑=2.7%、青=31.8%
赤=2%、緑=93.3%、青=61.6%
赤=2%、緑=93.3%、青=61.6%

【動画で見てみよう】

消費電流は、約72mAです。

消費電流確認

まとめ

Arduino NanoとフルカラーLEDを使って、三色を組み合わせてランダムな色でLチカさせてみました。

また、LCDキャラクタディスプレイを使用して、PWMの値を表示させてみることに成功しました。

簡単なプログラムで動作させることが出来ましたが、意外とつまずきもありました…
・MsTimer2ライブラリを使用すると、PWM3・11が競合するので他に変更する必要がある。
 →PWMピンを他(5など)に変えることで対策できました。
・MsTimer2の割込み関数の中にLCD表示用の命令を入れても動かなかった…
 →これは良くわからなかったため、今回はMsTimer2を使わないプログラムにしました。

いずれもコンパイルエラーは出ないため、なぜ動かないのか悩みました。
ライブラリの中身や、使われているマイコンの機能をちゃんと知って使わないといけませんね。

引き続き、さらに難しいLチカに挑戦していきましょう。

参考リンク

使用したLCDキャラクタディスプレイモジュール

Arduino Nano 純正品

今回使っているのは、ELEGOO製のArduino Nano互換ボードです。

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