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

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

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

rikoubou.hatenablog.com

 以前の記事でマイコン搭載のフルカラーLEDを使って動作させてみました。

 今回は別のマイコン搭載ではないものを使ってみたのでその備忘録です。

 では始めます。


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

 今回使用したフルカラーLEDは「LLED-TR501-A」という型番でマルツの店頭で購入したのですが、なぜかマルツオンラインで検索しても出てこないものなのでもう店頭在庫のみになっている可能性もあります。

 試してはいませんがおそらく秋月で売られている以下のものでも同じ感じで使えるかと思います。


2:LLED-TR501-Aについて
 ピン配置は以下のようになっています。
f:id:rikoubou:20200203181303p:plain

 前回と違うのはマイコン搭載ではなく、単にRGBそれぞれのピンからの電圧で色を調節するというだけです。
 なので特別なライブラリなどが必要なく、PWMの制御ができれば扱うことができます。


3:LLED-TR501-Aを動かすサンプル
 では実際に動かしていきます。以下のように回路を組んでESP32にスケッチを書き込みます。

・回路図
f:id:rikoubou:20200203181658p:plain

・ESP32_ColorLED.ino

// ピン定義
const int R = 25;
const int G = 33;
const int B = 32;

// チャンネル定義
const int R_CHANNEL = 1;
const int G_CHANNEL = 2;
const int B_CHANNEL = 3;

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

void setup() {
  Serial.begin(115200);

  // ledcSetup(チャンネル, 周波数, PWMの範囲);
  ledcSetup(R_CHANNEL, 12000, 8);
  ledcSetup(G_CHANNEL, 12000, 8);
  ledcSetup(B_CHANNEL, 12000, 8);

  // ledcAttachPin(ピン番号, チャンネル);
  ledcAttachPin(R, R_CHANNEL);
  ledcAttachPin(G, G_CHANNEL);
  ledcAttachPin(B, B_CHANNEL);

  chengeLedColor(); // LED点灯
  printRGB();       // RGBの値を表示

  Serial.println("--- setup end ---");
}

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

/**
 * LEDの色を変更する関数
 */
void chengeLedColor() {
  ledcWrite(R_CHANNEL, rgb[0]);
  ledcWrite(G_CHANNEL, rgb[1]);
  ledcWrite(B_CHANNEL, rgb[2]);
}

/**
 * 現在の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(")");
}

/**
 * シリアルの文字列の情報から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の値をコンマ区切りでシリアルとして送信するとその値でLEDの色が変わります。

 以上が今回やったフルカラーLEDでの動作確認です。

 電池でも動かしてみましたが、こちらは色に変わりはないようだったので電池で動作をする場合はこちらを使うのが良いかと思います。


・参考資料