8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GENEROSITYAdvent Calendar 2024

Day 1

M5Stack NanoC6でNeoPixelを操作する

Last updated at Posted at 2024-11-30

アドベントカレンダーの記事ですので、クリスマスに合わせた内容がよいと思い、クリスマスツリーのイルミネーション用にLEDを光らせることにしました。

光らせるのはこちらのNeoPixelタイプのフルカラーLEDです。

コントロールにはM5Stack NanoC6を使おうと思います。

小さくて1000円くらいで買えるのでとてもいいですね。

準備

NanoC6はUIFLowに対応していないので、Arduino IDEを使い開発します。
このページの説明通りに設定していきます。

デバッグなどのために Serial.println() を使いたい場合、
"ツール" → "USB CDC On Boot" → "Enabled" に設定しないと表示されないので注意です。

接続

M5NanoC6とNeoPixelを接続します。
NeoPixelとの接続には、簡単に接続ができるGROVEコネクタを使います。今回はLEDの個数もあまり多くないので、電源もここから取ろうと思います。

NeoPixelには接続向きがあります。矢印などが書いてあるので確認して接続してください。

M5NanoC6への給電はモバイルバッテリーを使います。

端子 Pin No
G(GND) G
5V(VCC) 5V
G2 GPIO2

一部のみの紹介になりますので、ソースコードの全体はこちらに上げてあります。

LED制御

Arduino IDEのライブラリマネージャーからAdafruit NeoPixelをインストールします。

#include <Adafruit_NeoPixel.h>

#define LED_PIN 2 // GPIOのピン番号
#define LED_COUNT 50 // LEDの個数

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// 開始
strip.begin();

// 色を設定
strip.setPixelColor(i, targetColor);

// LEDの状態を更新
strip.show();

web server

サーバーを立てて、ブラウザからLEDの色をコントロールできるようにしようと思います。

Wifiに接続します。

// WiFi station modeで接続
WiFi.mode(WIFI_STA);

// SSIDとパスワードを設定
WiFi.begin(ssid, pass);       

// 接続されるまで繰り返します
while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    if (WiFi.status() == WL_CONNECT_FAILED) {
        Serial.println("Connect Failed");
    }
}
Serial.println("Connected");

ブラウザで表示されるHTMLを作成し、設定します。

// ポート番号80でサーバーを定義
WebServer server(80);

// htmlは R"()" 内に記載
char html[] = R"(
  <!DOCTYPE html>
  <html lang="jp">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Color Select</title>
    <script>
      document.addEventListener('DOMContentLoaded', function() {
        const form = document.getElementById("form")
        const submitButton = document.getElementById("submit-button")
        
        submitButton.onclick = () => {
          const formData = new FormData(form)
          const action = form.getAttribute("action")
          const options = {
            method: 'POST',
            body: formData,
          }
          fetch(action, options).then((e) => {
            if(e.status === 200) {
              return
            }
          })
        }
      })
    </script>
    <style>
      // 省略
      // CSSを記載
    </style>
  </head>
  <body>
    <!-- 省略 -->
    <!-- LEDの色を選択するためのフォームを配置 -->
  </body>
  </html>
)";

void handleRoot() {
    // POSTで送られた値を取得
    if (server.method() == HTTP_POST) {
        String val = server.arg("color");

        // 色を変える
        changeColorSequential(val.c_str(), 10); 
    }

    // 値をクライアントに返す
    server.send(200, "text/html", html);
}

void setup() {
    // ルートアクセス時のHTMLを登録
    server.on("/", handleRoot);
    // サーバー開始
    server.begin();
}

WiFi.localIPで確認できるIPにブラウザからアクセスします。

WiFi.localIP();

完成

ブラウザで選択した色へと変化するようになりました:christmas_tree:

8
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?