【ルネサス技術コラム】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強度を可視化する構成にしています。

基本の流れは次の通りです。

  1. Arduino Uno R4 WiFiをアクセスポイントへ接続する

  2. 現在のRSSI値を取得する

  3. RSSIを見やすい0~100%へ変換する

  4. LED matrixにバー表示する

  5. シリアルにも数値を出力する

この構成なら、追加のLCDやセンサなしで、ボード単体でPoCを始められるのが利点です。

開発環境と実装のポイント

開発環境には Visual Studio CodePlatformIO IDE を使用しました。PlatformIOでは、board = uno_r4_wifiplatform = renesas-raframework = 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本/再接続

のように、電波状況の違いが感覚的に分かりやすくなります。

これにより、単なる「つながる / つながらない」ではなく、どの場所で余裕があるか、どこが弱点かを把握しやすくなります。

WiFiとの接続成功
WiFiルータへ近づけたとき
WiFiルータから遠ざけたとき

次に、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強度を見える化するところから始めたい時に、ちょうどよいテーマだと思います。

参考リンク