Arduino Uno R4 WiFi の要素検証(HTTPサーバーによるLED制御とドット表示)

概要

本記事では、Arduino Uno R4 WiFi の要素検証として、
HTTPサーバーを立て、ブラウザからオンボードLEDのON/OFFを制御し、
その状態をドットマトリクスに表示する検証を行います。

「通信・制御・表示を一体として動作させること」を目的とした検証です。

実証の目的

  • (ローカルエリア内での)HTTPサーバーとしての動作確認
  • ブラウザからの入力によるLED制御の確認
  • 状態(ON/OFF)のドット表示による可視化確認

対象機材

  • Arduino Uno R4 WiFi
  • Wi-Fiアクセスポイント(2.4GHz)
  • PCまたはスマートフォン(ブラウザ)

実証内容

① Wi-Fi接続とHTTPサーバー起動

Arduino Uno R4 WiFi をWi-Fiに接続し、HTTPサーバーを起動します。

② ブラウザからの制御

ブラウザからアクセスし、LEDのON/OFFを切り替えます。

③ ドットマトリクス表示

LEDの状態(ON / OFF)をドットマトリクスに表示します。


サンプルコード

#include <WiFiS3.h>
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;
WiFiServer server(80);

// --- 接続設定 ---
const char* ssid = "yourssid";
const char* password = "yourpassword";

// --- 表示・制御用 ---
#define CHAR_WIDTH 6
#define MAX_MSG 64
char message[MAX_MSG] = "READY";
uint8_t frame[8][12];
const int ledPin = LED_BUILTIN; // オンボードLED (D13)

// 5x7フォントデータ (0-9, '.', ' ', A-Z)
const uint8_t font_data[][5] = {
  {0x3E,0x41,0x41,0x41,0x3E}, // 0
  {0x00,0x42,0x7F,0x40,0x00}, // 1
  {0x42,0x61,0x51,0x49,0x46}, // 2
  {0x21,0x41,0x45,0x4B,0x31}, // 3
  {0x18,0x14,0x12,0x7F,0x10}, // 4
  {0x27,0x45,0x45,0x45,0x39}, // 5
  {0x3C,0x4A,0x49,0x49,0x30}, // 6
  {0x01,0x71,0x09,0x05,0x03}, // 7
  {0x36,0x49,0x49,0x49,0x36}, // 8
  {0x06,0x49,0x49,0x29,0x1E}, // 9
  {0x00,0x60,0x60,0x00,0x00}, // .
  {0x00,0x00,0x00,0x00,0x00}, // Space
  {0x7E,0x11,0x11,0x11,0x7E}, // A (Index 12)
  {0x7F,0x49,0x49,0x49,0x36}, // B
  {0x3E,0x41,0x41,0x41,0x22}, // C
  {0x7F,0x41,0x41,0x22,0x1C}, // D
  {0x7F,0x49,0x49,0x49,0x41}, // E
  {0x7F,0x09,0x09,0x09,0x01}, // F
  {0x3E,0x41,0x49,0x49,0x7A}, // G
  {0x7F,0x08,0x08,0x08,0x7F}, // H
  {0x00,0x41,0x7F,0x41,0x00}, // I
  {0x20,0x40,0x41,0x3F,0x01}, // J
  {0x7F,0x08,0x14,0x22,0x41}, // K
  {0x7F,0x40,0x40,0x40,0x40}, // L
  {0x7F,0x02,0x04,0x02,0x7F}, // M
  {0x7F,0x04,0x08,0x10,0x7F}, // N
  {0x3E,0x41,0x41,0x41,0x3E}, // O (Index 26)
  {0x7F,0x09,0x09,0x09,0x06}, // P
  {0x3E,0x41,0x51,0x21,0x5E}, // Q
  {0x7F,0x09,0x19,0x29,0x46}, // R
  {0x46,0x49,0x49,0x49,0x31}, // S
  {0x01,0x01,0x7F,0x01,0x01}, // T
  {0x3F,0x40,0x40,0x40,0x3F}, // U
  {0x1F,0x20,0x40,0x20,0x1F}, // V
  {0x3F,0x40,0x38,0x40,0x3F}, // W
  {0x63,0x14,0x08,0x14,0x63}, // X
  {0x07,0x08,0x70,0x08,0x07}, // Y
  {0x61,0x51,0x49,0x45,0x43}  // Z
};

int getFontIndex(char c) {
  if (c >= '0' && c <= '9') return c - '0';
  if (c == '.') return 10;
  if (c == ' ') return 11;
  if (c >= 'A' && c <= 'Z') return (c - 'A') + 12;
  return 11;
}

void setup() {
  Serial.begin(115200);
  matrix.begin();
  pinMode(ledPin, OUTPUT);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  server.begin();
  IPAddress ip = WiFi.localIP();
  String(ip.toString()).toCharArray(message, MAX_MSG);
  Serial.println("\nServer started at: " + ip.toString());
}

void handleClient() {
  WiFiClient client = server.available();
  if (!client) return;

  String request = client.readStringUntil('\r');
  client.flush();

  if (request.indexOf("GET /on") != -1) {
    digitalWrite(ledPin, HIGH);
    strcpy(message, "  ON  ");
  } else if (request.indexOf("GET /off") != -1) {
    digitalWrite(ledPin, LOW);
    strcpy(message, "  OFF  ");
  }

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println();
  client.println("<h1>LED Control</h1>");
  client.println("<p><a href=\"/on\">Turn ON</a></p>");
  client.println("<p><a href=\"/off\">Turn OFF</a></p>");
  client.stop();
}

void scrollText() {
  int len = strlen(message);
  int totalWidth = len * CHAR_WIDTH;

  for (int offset = 0; offset < totalWidth + 12; offset++) {
    handleClient(); // スクロール中もリクエストをチェック
    memset(frame, 0, sizeof(frame));

    for (int i = 0; i < len; i++) {
      int charPos = i * CHAR_WIDTH - offset;
      if (charPos > 11 || charPos < -5) continue;
      int fontIdx = getFontIndex(message[i]);
      for (int col = 0; col < 5; col++) {
        int x = charPos + col;
        if (x < 0 || x > 11) continue;
        uint8_t colData = font_data[fontIdx][col];
        for (int row = 0; row < 7; row++) {
          if (colData & (1 << row)) frame[row][x] = 1;
        }
      }
    }
    matrix.renderBitmap(frame, 8, 12);
    delay(60);
  }
}

void loop() {
  scrollText();
}

結果

  • HTTPサーバーとして動作することを確認
  • 同じローカルエリア内でブラウザからLEDのON/OFF制御が可能
  • 状態に応じてドットマトリクス表示が切り替わることを確認

考察

本検証により、Arduino Uno R4 WiFi 単体で、
通信(HTTP)・制御(LED)・表示(ドット)を連携できることを確認しました。

簡易的なWebインターフェースと可視化機能を組み合わせることで、
小規模なIoT機器としての構成が可能と考えられます。


位置づけ(要素検証として)

本検証は複数の機能を組み合わせていますが、
小規模な範囲での確認であり、要素レベルの実証に該当します。

今後はROS2連携などを含めた統合検証へ展開していきます。


実証に関するご相談はこちら