ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【ESP32】ESP32でフルカラーLEDを使ってみる

 かなり間が空いてしまいましたが、久々のブログ記事です。

 今回はタイトルにあるようにESP32-DevKitCを使ってフルカラーLEDを使ってみた備忘録になります。

 では始めます。


1:使用する部品
 今回使用する部品は以下になります。


2:PL9823について
 商品ページにあるデータシートを読んでもどうピンを使えば良いかわかりにくかったので自分なりにまとめます。

 まず型番についてですが「PL9823-F5」と「PL9823-F8」の2種類があります。F5とF8の違いは砲弾部分の大きさが5mmか8mmかの違いです。

 ピン配置は以下のようになっています。
f:id:rikoubou:20200114172602p:plain

 VDDとGNDはわかると思います。

 DINは入力の信号線で、このピンにRGBの情報を送ります。
 DOは出力の信号線で、このLEDを数珠繋ぎのように繋げた時に次のLEDに情報を出力するためのピンです。

 このフルカラーLEDを使うにはAdafruitが出している以下のライブラリを使用します。

 これでフルカラーLEDの使い方がわかったので、実際にライブラリを入れてサンプルを動かしていきます。


3:Adafruit_NeoPixelライブラリをインストール
 以下のページを開きます。

 右上にある「Clone or download」をクリックして出てきた「Download ZIP」をクリックしてライブラリのzipファイルをダウンロードします。
f:id:rikoubou:20200114174023p:plain

 zipファイルをダウンロードしたらArduino IDEを起動させて「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール」を選択します。
f:id:rikoubou:20200114174315p:plain

 先ほどダウンロードしたzipファイルを指定すればライブラリがインストールされます。

 ちなみにこれはArduino用のライブラリですが、ESP32でも使えることは確認しています。


4:フルカラーLEDを動かすサンプル
 まずは1つのLEDで試してみるために以下のように回路を組みます。

・回路図(1つだけの場合)
f:id:rikoubou:20200114174608p:plain

 書き込むサンプルコードは以下の通りです。PINの番号はArduinoで指定できるピン番号以内を設定する必要があるようなので注意が必要です。

・ESP32_ColorLED.ino

#include <Adafruit_NeoPixel.h>

#define PIN            5 // ピン番号(Arduino用ライブラリなのでArduinoのピン番号以内にする必要あり)
#define NUMPIXELS      1 // LEDを繋げている個数

// RGBの並びにする
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_RGB + NEO_KHZ800);

int delayval = 500;
int rgb[]= {100, 100, 100}; // RGBの配列

void setup() {
  Serial.begin(115200);
  pixels.begin();
  ledOn();    // LED点灯
  printRGB(); // RGBの値を表示
}

void loop() {
  if (Serial.available() > 0) {
    setRGB();   // シリアルがあればRGBの値を設定
    ledOn();    // LED点灯
    printRGB(); // RGBの値を表示
  }
  delay(delayval);
}

/**
 * LEDを点灯する関数
 */
void ledOn() {
  for(int i = 0; i < NUMPIXELS; i++){
    pixels.setPixelColor(i, pixels.Color(rgb[0],rgb[1],rgb[2])); // RGB設定
    pixels.show(); // LED点灯
  }
}

/**
 * シリアルの文字列の情報からRGBの値を設定する関数
 */
void setRGB() {
  String s = getSerialCommand(); // シリアルを文字列として取得

  for (int i = 0; i <= 2; i++) {
    int comma = s.indexOf(","); // コンマ区切り
    if (comma > 0) {
      rgb[i] = s.substring(0, comma).toInt();
      s = s.substring(comma + 1);
    } else {
      rgb[i] = s.toInt();
    }
  }
}

/**
 * シリアル通信で送られたコマンドを文字列にする関数
 */
String getSerialCommand() {
  String s = "";
  while (Serial.available() > 0) {
    char c = Serial.read();
    s = s + String(c);
  }

  // 最後の改行を削除(Macだと改行が飛ばない場合があるので判定)
  if (s.indexOf("\n") > -1) {
    s = s.substring(0, s.length()-1);
  }
  return s;
}

/**
 * 現在のRGBの値を表示させる関数
 */
void printRGB() {
  Serial.print("(R, G, B)=(");
  Serial.print(rgb[0]);
  Serial.print(", ");
  Serial.print(rgb[1]);
  Serial.print(", ");
  Serial.print(rgb[2]);
  Serial.println(")");
}

 上記の回路でサンプルではシリアルモニタからLEDのRGBの値を変更できます。

 シリアルモニタを立ち上げてRGBをコンマ区切りで入力して「送信」ボタンをクリックして送信します(値の上限下限は設定してないので注意してください)。
f:id:rikoubou:20200114175841p:plain

 すると送信した値で設定されてLEDの色が変わります。
f:id:rikoubou:20200114180116p:plain

 次に複数のLEDを繋げて使ってみます。

・回路図(2つの場合)
f:id:rikoubou:20200114180236p:plain

 DOピンを次のLEDのDINピンに繋ぐことで数珠繋ぎ的にLEDを増やしています。

 ソースコードの方は以下の部分を修正するだけです。

#define NUMPIXELS      2 // LEDを繋げている個数(2個なので2に変更する)

 これで2つのLEDの色を同時に変更することができます。

 さらにLEDの数を増やす場合も同様にして増やすことができます。


 以上がESP32でフルカラーLEDを使ってみたやり方についてです。

 1つのLEDで様々な色を出すことができるので触っていて楽しいです。

 ただ電池で駆動させた場合も試してみたのですが、電圧が下がっているせいかLEDの色が全く違う色になってしまったので安定した電圧で制御するのが前提になりそうです。


・参考資料