2026年11月8日日曜日

シリアル制御フルカラーテープLEDを使う(その4)

ここで少し横道にそれて、ArduinoでフルカラーテープLEDを扱ったらどんな具合か試してみた。秋月で Seeed Studio XIAO ESP32C3 とI2Cレベル変換モジュールを買ってテープLEDに繋げた。このESP32C3は160MHzのクロックで動く32ビットプロセッサなのでPICに比べて十分に高性能である。回路は誰が考えても同じようなものだろう。ESP32C3からの出力は3.3VレベルなのでI2Cレベル変換モジュールで5Vレベルに変換してLEDに与える。後で実際に試してみたら3.3Vレベルでも動いた。


回路は簡単なのでブレッドボード上に組み立てた。

Copilotに相談して作ったテストスケッチは次の通り。

#include <FastLED.h>

#define LED_PIN     10   // LEDのDINに接続したGPIOピン番号
#define NUM_LEDS    120  // LEDの総数
#define BRIGHTNESS  64   // 明るさ(0〜255)最初は電力消費を抑えるため低めに設定

CRGB leds[NUM_LEDS];

void setup() {
  Serial.begin(115200);
  // put your setup code here, to run once:
  // SK6812のRGBモデルは通常「GRB」の順序でデータを受け取ります
  // もし色が赤と緑で反転する場合は、GRBをRGBに変更してください
  FastLED.addLeds<SK6812, LED_PIN, GRB>(leds, NUM_LEDS);
 
  // 全体の明るさを制限
  FastLED.setBrightness(BRIGHTNESS);
 
  // 起動時に一度すべて消灯
  FastLED.clear();
  FastLED.show();
  Serial.println("*** Program Start");
}

void loop() {
  // put your main code here, to run repeatedly:
  // パターン1: 1つずつ順番に点灯(流れる光)
  for(int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CRGB::Blue; // 青色に設定
      FastLED.show();
    delay(20);
    leds[i] = CRGB::Black; // 次に進む前に消灯
  }

  // パターン2: 全体をゆっくりレインボーに変化させる
  for (int j = 0; j < 255; j++) {
    fill_rainbow(leds, NUM_LEDS, j, 5);
    FastLED.show();
    delay(10);
  }
}
 

 これで手間も要らず簡単に動いた。 更にESP32C3をスタンドアロンのアクセスポイント & DNS とする次のスケッチも作成した。
 
#include <WiFi.h>
#include <WebServer.h>
#include <FastLED.h>
#include <ESPmDNS.h>

#define LED_PIN     10
#define NUM_LEDS    120
CRGB leds[NUM_LEDS];

// ★APモードのWi-Fi設定(好きな名前に変更できます)
const char *ssid = "ESP32-APmDNS";
const char *password = "12345"; // 8文字以上
const char *dnsname = "esp32";

WebServer server(80);

// スマホから「赤」ボタンが押されたときの処理
void handleRed() {
  fill_solid(leds, NUM_LEDS, CRGB::Red);
  FastLED.show();
  server.send(200, "text/plain", "Color changed to Red");
}

// スマホから「消灯」ボタンが押されたときの処理
void handleOff() {
  FastLED.clear();
  FastLED.show();
  server.send(200, "text/plain", "LED Off");
}

// 操作用の簡易ホームページを表示する処理
void handleRoot() {
  String html = "<html><body>";
  html += "<h1>ESP32 LED Controller2</h1>";
  html += "<p><button onclick=\"location.href='/red'\" 
        style='font-size:20px; padding:10px;'>RED</button></p>";
  html += "<p><button onclick=\"location.href='/off'\" 
        style='font-size:20px; padding:10px;'>OFF</button></p>";
  html += "</body></html>";
  server.send(200, "text/html", html);
}

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

  FastLED.addLeds<SK6812, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.clear();
  FastLED.show();

Serial.println("*** Starting HTTP server.");
  // ★APモードの開始
  WiFi.softAP(ssid, password);
Serial.println("HTTP server started");

Serial.println("*** Starting mDNS.");
  if (!MDNS.begin(dnsname)) {
    Serial.println("Error setting up mDNS responder!");
    while(1) { delay(1000); }
  }
Serial.println("mDNS responder started. Hostname: esp32.local");

  // アクセス先URLの設定
  Serial.println("*** Allocating access dir.");
  server.on("/", handleRoot);
  server.on("/red", handleRed);
  server.on("/off", handleOff);
  server.begin();

// 5. mDNSに「HTTPサービス(ポート80)」を提供していることを登録(オプション)
  MDNS.addService("http", "tcp", 80);

  Serial.println("ESP32 Serial RGB-LED Driver & APmDNS Ready!");
}

void loop() {
  server.handleClient(); // スマホからのアクセスを常に監視
}
 

このスケッチでは、携帯でWiFiを”ESP32-APnDNS”というアクセスポイントに接続(パスワードは12345)した後ブラウザを立ち上げ "esp32.local" というホストにアクセスすると、テープLEDを赤点灯にするか消灯するかのメニュー(ボタン)が表示される。 ボタンを押すとテープLEDが反応する。

 

(続く) 
 
 

0 件のコメント:

コメントを投稿