Arduino Uno R4 WiFi の要素検証(ドット表示によるIPアドレス表示)

概要

本記事では、Arduino Uno R4 WiFi の要素検証として、
Wi-Fi接続後に取得したIPアドレスをオンボードのドットマトリクスに表示します。

「通信状態を簡易的に可視化できるか」という観点で検証を行いました。


実証の目的

  • Wi-Fi接続後のIPアドレス取得を確認する
  • オンボードドットマトリクスでの表示可否を確認する
  • 最小構成での可視化手段を確認する

対象機材

  • Arduino Uno R4 WiFi
  • Wi-Fiアクセスポイント(2.4GHz)

実証内容

① Wi-Fi接続

Arduino Uno R4 WiFi をWi-Fiに接続し、IPアドレスを取得します。

② ドットマトリクス表示

取得したIPアドレスを、オンボードのLEDマトリクスに表示します。
本検証では、loop()内でスクロールし続けます。
シリアルにも表示します。


サンプルコード

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

ArduinoLEDMatrix matrix;

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

// --- 表示設定 ---
#define CHAR_WIDTH 6
#define MAX_MSG 64
char message[MAX_MSG] = "CONNECTING...";
uint8_t frame[8][12];

// 5x7フォントデータ (0-9, '.', ' ', A-Z)
// 各文字5バイト。1バイトが1列(下位7ビットを使用)
const uint8_t font_data[][5] = {
  {0x3E, 0x41, 0x41, 0x41, 0x3E}, // 0 (Index 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}, // . (Index 10)
  {0x00, 0x00, 0x00, 0x00, 0x00}, // Space (Index 11)
  {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
};

// 文字からフォントデータのインデックスを取得
int getFontIndex(char c) {
  if (c >= '0' && c <= '9') return c - '0';
  if (c == '.') return 10;
  if (c == ' ') return 11;
  if (c >= 'A' && c <= 'G') return (c - 'A') + 12;
  return 11; // 該当なしはスペース
}

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

  // Wi-Fi接続開始
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  // IP取得してメッセージに格納
  IPAddress ip = WiFi.localIP();
  String ipStr = "  " + ip.toString() + "  "; 
  ipStr.toUpperCase();
  ipStr.toCharArray(message, MAX_MSG);
  
  Serial.println("\nConnected!");
  Serial.print("IP: ");
  Serial.println(ipStr);
}

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

  // offsetを動かしてスクロール
  for (int offset = 0; offset < totalWidth + 12; offset++) {
    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;
          }
        }
      }
    }
    // UNO R4 WiFiの生のMatrixに描画
    matrix.renderBitmap(frame, 8, 12);
    delay(70); 
  }
}

void loop() {
  scrollText();
}

結果

  • Wi-Fi接続後にIPアドレス取得可能
  • ドットマトリクスへの表示を確認
  • loop()でスクロールを続けることを確認

考察

Arduino Uno R4 WiFi のオンボードドットマトリクスは、
簡易的な表示用途として利用可能です。

特にIPアドレスのような情報を表示することで、
デバッグや動作確認時の可視化手段として有効と考えられます。

プログラムに関する補足

標準の ArduinoGraphics ライブラリを使用せず、あえて matrix.renderBitmap() のみ でテキスト表示を完結させる手法を使いました。その解説です。

1. 外部ライブラリ非依存の「ゼロ・コンパイルエラー」構成

  • 課題: ArduinoGraphics 等の描画ライブラリは、環境やバージョンによってビルドエラーが発生しやすい。
  • 解決: 依存関係を Arduino_LED_Matrix.h 1本に絞り、描画ロジックを自前で完結させることで、環境に左右されない高いポータビリティを確保。

2. 軽量な「5×7ビットマップ・フォント」の定義

  • データ構造: 1文字を uint8_t[5](5列分)の配列で定義。1バイト内の下位7ビットを垂直方向の1列(1ピクセル = 1ビット)として扱う。
  • メリット: メモリ消費が極めて少なく、1文字わずか5バイトで管理可能。特殊記号や数字の拡張も配列の追加だけで完結。

3. VRAM制御による自由なスクロール実装

  • プロセス: 12×8の作業用二次元配列(VRAM相当)に対し、描画オフセットをずらしながらフォントデータをビット単位で書き込み。
  • 出力: 最終的な frame[8][12]matrix.renderBitmap() に流し込むだけ。
  • 効果: ライブラリの仕様に縛られず、スクロール速度や文字間隔、表示タイミングをピクセル単位で100%制御可能。


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