概要
本記事では、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.h1本に絞り、描画ロジックを自前で完結させることで、環境に左右されない高いポータビリティを確保。
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%制御可能。

