【ルネサス技術コラム】Arduino Uno R4 WiFiでWi-Fi強度を可視化してみた
自宅やオフィスでWi-Fiを使っていると、
机の位置を少し変えるだけで通信が不安定になる
会議室や窓際で、なぜか通信品質が落ちる
IoT機器をどこに置けば安定してつながるのか分からない
「つながる/つながらない」は分かっても、どの場所がどれくらい弱いのか比較しにくい
といった困りごとがあります。
こうした場面では、単に「接続できるかどうか」だけでなく、その場所でのWi-Fi電波の強さを見える化すると、設置場所の比較や改善がしやすくなります。
そこで今回も、「エレクトロニクスを簡単に」をテーマに、Renesas RA4M1搭載のArduino Uno R4 WiFiを使って、現在接続しているWi-Fiの強度 (RSSI) を取得し、オンボードの12×8 LED matrix でバー表示する簡易可視化システムを作ってみました。
Arduino Uno R4 WiFiは、メインMCUにRenesas RA4M1、無線機能にESP32-S3を搭載しており、Arduino Cloudとも互換性があります。
シリアルモニタにはSSID / RSSI / 強度%も出力し、数値でも確認できるようにしています。
なお、今回の可視化は厳密な通信スループット測定ではなく、Wi-Fi受信強度 (RSSI) を相対的に見やすくするPoCです。まずは「どこで弱くなるか」「どの程度差があるか」を簡単に把握することを主眼にしています。
注意
本記事はWi-Fi受信強度(RSSI) の簡易可視化PoCです。
RSSIは通信品質そのものを保証する指標ではありません。実際の通信速度や遅延、パケットロスなどは利用環境によって異なります。
目次
はじめに: どんな困りごとに対するソリューションなのか
Wi-Fiの困りごとは、単純に「つながる / つながらない」だけではありません。実際には次のような、配置や比較に関する悩みがよくあります。
ルーターの置き場所を変えた時に、本当に改善したのか分からない
部屋ごとの通信の強さを比較したい
IoTデバイスを置く候補位置のうち、どこが安定しそうか知りたい
現場で「ここは弱い気がする」を感覚ではなく数値で示したい
移動しながら電波の強さをざっくり確認したい
たとえば、ノートPCやスマホのアンテナ表示だけでは、細かな差が見えないことがあります。また、同じ「2本」や「3本」に見えても、実際のRSSI値には差があることもあります。
そこで今回は、Arduino Uno R4 WiFi自身を簡易Wi-Fi強度メーターとして使うことで、
「どこでWi-Fiが弱いのか」
「改善前後でどれくらい変わったのか」
を、その場で把握しやすくすることを狙いました。
今回のソリューション概要
今回の仕組みでは、Arduino Uno R4 WiFi を指定したWi-Fiへ接続し、現在のRSSI (受信信号強度)を定期的に取得します。
そして、その値を次の2つの形で可視化します。
オンボード12×8 LED matrix: バー表示
シリアルモニタ: SSID / RSSI(dBm) / 強度%
たとえば、シリアルには次のようなイメージで表示します。
SSID: OfficeWiFi | RSSI: -49 dBm | Level: 92%
SSID: OfficeWiFi | RSSI: -72 dBm | Level: 45%
LED matrix側では、Wi-Fi強度に応じて1本~5本のバーを表示します。
これにより、場所を移動しながら「今は強い / 少し弱い / かなり弱い」を直感的に確認できます。
Arduino Uno R4 WiFiを使う理由
今回使用する Arduino Uno R4 WiFiは、公式ドキュメントによると Renesas RA4M1 (Arm Cortex-M4, 48MHz, 32kB SRAM, 256kB Flash) を搭載し、さらにESP32-S3 により Wi-Fi / Bluetooth に対応しています。また12×8 LED matrix をボード上に備えているため、外部ディスプレイなしでも簡易表示ができるのが大きな利点です。
Arduino Docs
今回のテーマでは、
Wi-Fi機能が最初からある
ボード単体でローカル表示できる
5V系の扱いやすいUnoフォームファクタで試しやすい
という点が非常に相性のよい構成です。
また、Arduino公式のUNO R4 WiFiネットワーク例では、WiFiS3 ライブラリを使ってネットワーク操作を行う例が案内されており、検索結果上でも scanNetworks(); に触れられています。今回のようなWi-Fi強度可視化PoCとも自然につながる題材です。
Arduino Docs
ローカル可視化の基本構成
今回は、Arduino Uno R4 WiFi本体だけでWi-Fi強度を可視化する構成にしています。
基本の流れは次の通りです。
Arduino Uno R4 WiFiをアクセスポイントへ接続する
現在のRSSI値を取得する
RSSIを見やすい0~100%へ変換する
LED matrixにバー表示する
シリアルにも数値を出力する
この構成なら、追加のLCDやセンサなしで、ボード単体でPoCを始められるのが利点です。
開発環境と実装のポイント
開発環境には Visual Studio Code と PlatformIO IDE を使用しました。PlatformIOでは、board = uno_r4_wifi、platform = renesas-ra、framework = arduino の構成で利用できます。
PlatformIO Board Docs
RSSIの考え方
Wi-Fi強度としてよく使われるのがRSSI (Received Signal Strength Indicator) です。一般的にはdBm で表され、たとえば
-45 dBm 付近 → かなり強い
-60 dBm 付近 → 実用上かなり良い
-70 dBm 前後 → 普通
-80 dBm 以下 → やや弱い
-90 dBm 近辺 → かなり弱い
といった見方をします。
今回はこのRSSIを、そのままdBm表示するだけでなく、見やすい強度%に変換してバー表示にも使います。
今回の%表示について
今回の%は、たとえば
-90 dBm を 0%
-30 dBm を 100%
とするような相対的なスケーリングで扱います。
そのため、これは通信品質そのものの保証値ではなく、あくまで比較しやすくするための簡易指標です。まずは「場所Aより場所Bのほうが強い」といった比較用途に向いています。
オンボードLED matrixを使う利点
UNO R4 WiFiには12×8 LED matrix があるため、追加ディスプレイなしでその場で可視化できます。Arduino公式ドキュメントでも、LED matrixを使ってグラフィックスやアニメーションを表示できることが案内されています。
Arduino Docs
今回はこれを使って、Wi-Fiのアンテナバーのような見え方で表示します。
使用した主な部品
Arduino Uno R4 WiFi
USB Type-C ケーブル
必要に応じて、次のようなものがあると便利です。
モバイルバッテリー
ノートPC (シリアルモニタ確認用)
実際のプログラム
今回のローカル可視化版で使用したプログラムは以下の通りです。
指定したWi-Fiへ接続し、現在のWi-Fi強度をLED matrixとシリアルモニタに表示します。
※Wi-FiのSSIDとパスワードは、ご自身の環境に合わせて書き換えてください。
※本プログラムは、生成AIを用いて作成しております。
#include <Arduino.h>
#include <WiFiS3.h>
#include <Arduino_LED_Matrix.h>
ArduinoLEDMatrix matrix;
const char ssid[] = "YOUR_WIFI_SSID";
const char pass[] = "YOUR_WIFI_PASSWORD";
unsigned long lastUpdate = 0;
const unsigned long updateIntervalMs = 2000;
int status = WL_IDLE_STATUS;
// 12x8 matrix 用の表示バッファ
uint8_t frame[8][12];
// RSSI (dBm) を 0-100% に変換
int rssiToPercent(long rssi) {
if (rssi <= -90) return 0;
if (rssi >= -30) return 100;
return map((int)rssi, -90, -30, 0, 100);
}
// 強度% を 0-5本バーに変換
int percentToBars(int percent) {
if (percent <= 5) return 0;
if (percent <= 20) return 1;
if (percent <= 40) return 2;
if (percent <= 60) return 3;
if (percent <= 80) return 4;
return 5;
}
void clearFrame() {
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 12; x++) {
frame[y][x] = 0;
}
}
}
void drawDisconnectedIcon() {
clearFrame();
// 簡易 × マーク
for (int i = 0; i < 8; i++) {
int x1 = 2 + i;
int x2 = 9 - i;
if (x1 >= 0 && x1 < 12) frame[i][x1] = 1;
if (x2 >= 0 && x2 < 12) frame[i][x2] = 1;
}
matrix.renderBitmap(frame, 8, 12);
}
void drawBars(int bars) {
clearFrame();
// 左から5本のバーを描画
// 各バーの高さ: 2, 3, 4, 5, 6
const int baseY = 7;
const int barWidth = 1;
const int gap = 1;
const int startX = 1;
int heights[5] = {2, 3, 4, 5, 6};
for (int b = 0; b < 5; b++) {
int x = startX + b * (barWidth + gap);
int h = heights[b];
if (b < bars) {
for (int y = 0; y < h; y++) {
frame[baseY - y][x] = 1;
}
}
}
matrix.renderBitmap(frame, 8, 12);
}
void connectWiFi() {
Serial.print("Connecting to SSID: ");
Serial.println(ssid);
while (status != WL_CONNECTED) {
status = WiFi.begin(ssid, pass);
Serial.println("Trying to connect...");
delay(3000);
}
Serial.println("WiFi connected.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
delay(1500);
matrix.begin();
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("WiFi module not detected.");
drawDisconnectedIcon();
while (true) {
delay(1000);
}
}
connectWiFi();
}
void loop() {
unsigned long now = millis();
if (now - lastUpdate >= updateIntervalMs) {
lastUpdate = now;
status = WiFi.status();
if (status != WL_CONNECTED) {
Serial.println("WiFi disconnected. Reconnecting...");
drawDisconnectedIcon();
connectWiFi();
return;
}
long rssi = WiFi.RSSI();
int percent = rssiToPercent(rssi);
int bars = percentToBars(percent);
drawBars(bars);
Serial.print("SSID: ");
Serial.print(WiFi.SSID());
Serial.print(" | RSSI: ");
Serial.print(rssi);
Serial.print(" dBm");
Serial.print(" | Level: ");
Serial.print(percent);
Serial.println("%");
}
}PlatformIO設定例
[env:uno_r4_wifi]
platform = renesas-ra
board = uno_r4_wifi
framework = arduino
monitor_speed = 115200プログラムのポイント
WiFi.begin()で指定したアクセスポイントへ接続します。WiFi.RSSI()で、現在接続中のWi-Fi強度を取得します。RSSI値をそのまま使うのではなく、0~100%に変換して見やすくしています。
さらにその値を0~5本のバーに変換して、LED matrixへ表示しています。
接続が切れた場合は、×マークを表示して再接続を試みます。
シリアルには SSID / RSSI (dBm) / 強度%を出力するため、目視だけでなく数値でも比較できます。
動作確認
プログラムを書き込んだら、ボードを持って場所を移動しながら変化を見ます。
たとえば、
ルーターの近く
隣の部屋
壁を挟んだ場所
廊下
窓際
棚の奥や機器の裏側
などで確認すると、LED matrixのバー数やシリアルのRSSI値が変化します。
たとえば、
ルーター近くでは4~5本
壁を挟むと2~3本
離れた場所では1本
切断気味なら0本/再接続
のように、電波状況の違いが感覚的に分かりやすくなります。
これにより、単なる「つながる / つながらない」ではなく、どの場所で余裕があるか、どこが弱点かを把握しやすくなります。
次に、PCと接続しシリアル出力を確認します
シリアル上ではより詳しい信号強度を出力
発展編:ログ保存やヒートマップ化への拡張
ボード上の可視化だけでもPoCとしては十分ですが、実際に使うなら 「その場で見る」から「記録して比較する」に広げたくなります。
たとえば次のような発展が考えられます。
部屋ごとのRSSI値をCSVで保存する
測定地点ごとの値を地図や間取り図に書き込む
時間帯ごとの変動を記録する
特定の閾値以下になった時だけ警告する
複数アクセスポイントをスキャンして比較する
公式検索結果では、UNO R4 WiFiのネットワーク例で scanNetworks(); に触れられており、周辺ネットワークのスキャンという方向にも発展しやすい構成です。
Arduino Docs
今後の展望改善案
今回の試作は「現在つながっているWi-Fiの強度可視化」が主目的ですが、さらに改善するなら次のような方向があります。
複数アクセスポイント比較
今は接続中のSSIDだけを見ていますが、周辺アクセスポイントをスキャンしてRSSI比較できるようにすると、どのAPを使うべきかの判断にも役立ちます。
色やアニメーションによる強調
外部LEDやディスプレイを追加すれば、強い時は緑、弱い時は赤のように、より直感的な可視化も可能です。
ログ保存の追加
測定ポイントとRSSIを記録しておけば、ルーター移設前後の比較や、部屋ごとの通信環境評価に使いやすくなります。
スループットや遅延との比較
RSSIだけでは実利用の快適さを完全には表せないため、将来的には通信速度や応答時間とあわせて見ると、より実用的になります。
ルネサス製品への展開
今回のPoCではArduino Uno R4 WiFiを利用しましたが、実運用向けにはルネサス製品への展開も可能です。
RA4M1
ローカル表示型Wi-Fi評価端末
設備周辺の電波環境測定
RA6シリーズ + Wi-Fi/BLEモジュール
工場内の無線環境モニタリング
IoT機器設置前の電波調査
ネットワーク健全性監視
クラウド連携
RSSIデータの蓄積
ヒートマップ生成
無線品質ダッシュボード
まとめ
今回は、Arduino Uno R4 WiFiを使って、Wi-Fi強度(RSSI) をオンボード12×8 LED matrix とシリアルモニタで可視化する仕組みを作ってみました。
今回のテーマは、単にWi-Fiへ接続することではなく、
どこで電波が弱いのか把握したい
設置場所の違いを比較したい
ルーター移設や機器配置の改善前後を見たい
「なんとなく弱い」を数値と表示で見える化したい
という困りごとに対して、小さく始められる可視化PoCを作ることにあります。
構成自体はシンプルですが、
Arduino Uno R4 WiFiの無線機能を使う
RSSIを取得する
LED matrixでバー表示する
シリアルに数値出力する
という流れを通して、Wi-Fiの強さをその場で比較しやすくする題材になりました。
いきなり本格的な無線測定器を使う前に、まずは Arduino Uno R4 WiFiでWi-Fi強度を見える化するところから始めたい時に、ちょうどよいテーマだと思います。






