Arduinoの基礎 - Wi-Fi
概要
Arduino UNO R4 Wifiは、統合されたWi-Fiモジュールを搭載しており、WiFiS3.hライブラリを使用してWi-Fi接続を実現する。
2.4GHz帯のWi-Fi通信をサポートしており、IEEE 802.11 b/g/nの規格に対応している。
Wi-Fi接続の基本的な流れを以下に示す。
- まず、SSIDとパスワードを設定する。
- 次に、WiFi.beginメソッドを使用して接続を開始する。
- 接続状態はWiFi.statusメソッドで確認可能であり、WL_CONNECTEDという状態コードで接続成功を判断することができる。
エラーハンドリングにおいて、接続処理ではWi-Fiモジュールの存在確認から始まり、接続タイムアウト、再試行の制御、接続後の状態監視まで、様々なエラー状態に対応する必要がある。
特に、不安定なネットワーク環境では、接続が突然切れる可能性があるため、定期的な接続状態の確認と再接続処理の実装が推奨される。
セキュリティにおいては、WEP、WPA、WPA2、WPA3等の暗号化方式をサポートしているが、最新のセキュリティ規格であるWPA3の使用が推奨される。
また、Wi-FiのSSIDとパスワードはソースコード内でハードコーディングせずに、外部設定ファイルや環境変数として管理することが望ましい。
Wi-Fi接続後は、IPアドレスの取得や信号強度 (RSSI) の確認が可能である。
これらの情報は、WiFi.localIPメソッドおよびWiFi.RSSIメソッドで取得することが可能である。
特に、ネットワークの品質モニタリングには、RSSIの値を定期的に確認することが有効である。
デバッグ時においては、シリアルモニタを活用することにより、接続プロセスの各段階での状態確認が可能である。
接続の試行回数、タイムアウト時間、再接続のインターバル等のパラメータは、環境に応じて適切に調整する。
実務では、HTTPクライアント、WebSocketクライアント、MQTTクライアント等で使用されることが多い。
また、省電力設計も考慮する必要がある。
Wi-Fi通信は比較的電力を消費するため、必要に応じてスリープモードの活用、接続頻度の最適化を検討することが推奨される。
Wi-Fiモジュールの存在の確認
シリアル通信を9600[bps]〜115200[bps]で初期化する。
Wi-Fiモジュールの存在を確認して、見つからない場合はエラーとする。
また、必要であれば、Wi-Fiファームウェアバージョンを確認する。
#include <WiFiS3.h>
Serial.begin(115200);
// シリアル通信の初期化が完了するまで待機
delay(2000);
// Wi-Fiモジュールの状態の確認
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("エラー : Wi-Fiモジュールが見つかりません");
while (true);
}
// Wi-Fiファームウェアのバージョンの確認
String fv = WiFi.firmwareVersion();
Wi-Fiの接続
Wi-Fiの接続を行う場合は、試行回数の管理を行うことを推奨する。
そのため、最大試行回数までの接続をリトライおよび各試行間に待機時間を設定する。
Wi-Fiの接続において、タイムアウト処理を行うことが重要である。
そのため、各接続試行に対して最大待機時間を設定する。
必要であれば、接続状態の確認と情報を表示する。
- 接続成功時
- IPアドレスとRSSI (信号強度) の表示する。
- 接続失敗時
- エラーメッセージを表示して再試行する。
また、エラーハンドリングを実装することも重要である。
- Wi-Fiモジュールの状態確認
- 接続タイムアウトの処理
- 最大試行回数超過時の処理
Wi-Fiの接続に使用するWiFiS3.hのメソッドを以下に示す。
- WiFi.beginメソッド
- Wi-Fiの接続を開始する。
- WiFi.statusメソッド
- 現在の接続状態を取得する。
- WiFi.localIPメソッド
- 割り当てられたIPアドレスを取得する。
- WiFi.RSSIメソッド
- 信号強度を取得する。
また、WiFi.statusメソッドで取得可能なWi-Fiの状態コードを以下に示す。
- WL_NO_MODULE
- Wi-Fiモジュールが見つからない
- WL_CONNECTED
- Wi-Fiの接続に成功
- その他の状態
- 接続試行中、接続失敗等
#include <WiFiS3.h>
// Wi-Fi接続情報
const char *SSID = "<Wi-FiのSSID>"; // 使用するWi-FiのSSID
const char *PASS = "<Wi-Fiのパスワード>"; // 使用するWi-Fiのパスワード
// 接続試行の最大回数とタイムアウト時間
const int MAX_ATTEMPTS = 5; // Wi-Fi接続の最大試行回数
const unsigned long TIMEOUT = 10000; // タイムアウト時間 (ミリ秒)
void connectToWiFi()
{
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < MAX_ATTEMPTS) {
Serial.print("Wi-Fi接続を試行中...");
WiFi.begin(SSID, PASS);
unsigned long startTime = millis();
while (WiFi.status() != WL_CONNECTED && (millis() - startTime) < TIMEOUT) {
delay(500);
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED) {
// 接続成功時の処理
Serial.println("Wi-Fi接続に成功しました!");
Serial.print("IPアドレス: ");
Serial.println(WiFi.localIP());
return;
}
else {
// 接続失敗時の処理
attempts++;
}
}
}
Wi-Fiの接続後の処理
Arduinoのメインループ処理において、任意の指定時間ごとにWi-Fiの接続状態を確認する。
Wi-Fiの接続が切断されている場合は自動的に再接続を試みることにより、継続的な接続監視を実現することができる。
#include <WiFiS3.h>
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Wi-Fi接続が切断されました");
Serial.println("再接続を試みます");
// Wi-Fiの再接続
connectToWiFi();
// 任意の待機時間
delay(2000);
}
使用例 (Wi-Fiの接続)
#include <WiFiS3.h>
// Wi-Fi接続情報
const char *SSID = "<Wi-FiのSSID>"; // 使用するWi-FiのSSID
const char *PASS = "<Wi-Fiのパスワード>"; // 使用するWi-Fiのパスワード
// 接続試行の最大回数とタイムアウト時間
const int MAX_ATTEMPTS = 5; // Wi-Fi接続の最大試行回数
const unsigned long TIMEOUT = 10000; // タイムアウト時間(ミリ秒)
void setup()
{
// シリアル通信の初期化
Serial.begin(115200);
// 起動時の待機時間
delay(2000);
Serial.println("Arduino UNO R4 WiFi 接続プログラムを開始します");
// Wi-Fiモジュールの状態確認
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("エラー : Wi-Fiモジュールが見つかりません");
// エラーが発生した場合は無限ループで停止
while (true);
}
// Wi-Fiファームウェアのバージョン確認
String fv = WiFi.firmwareVersion();
Serial.print("Wi-Fiファームウェアバージョン : ");
Serial.println(fv);
// Wi-Fi接続の実行
connectToWiFi();
}
void loop()
{
// Wi-Fi接続状態の監視
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Wi-Fi接続が切断されました");
Serial.println("再接続を試みます");
connectToWiFi();
}
// その他のメインループ処理をここに記述
delay(10000); // 10秒ごとにWi-Fiの接続状態の確認
}
// Wi-Fi接続を行う関数
void connectToWiFi()
{
int attempts = 0;
// Wi-Fiの接続が確立されるまで、または、最大試行回数に達するまで繰り返す
while (WiFi.status() != WL_CONNECTED && attempts < MAX_ATTEMPTS) {
Serial.print("Wi-Fi接続を試行中... (");
Serial.print(attempts + 1);
Serial.print("/");
Serial.print(MAX_ATTEMPTS);
Serial.println(")");
// Wi-Fi接続の開始
WiFi.begin(SSID, PASS);
// 接続完了またはタイムアウトまで待機
unsigned long startTime = millis();
while (WiFi.status() != WL_CONNECTED && (millis() - startTime) < TIMEOUT) {
delay(500);
Serial.print(".");
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
// 接続成功時の処理
Serial.println("Wi-Fiの接続に成功");
Serial.print("IPアドレス : ");
Serial.println(WiFi.localIP());
Serial.print("信号強度 (RSSI) : ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
return;
}
else {
// 接続失敗時の処理
Serial.println("Wi-Fiの接続に失敗");
attempts++;
if (attempts < MAX_ATTEMPTS) {
Serial.println("5秒後に再試行します...");
delay(5000);
}
}
}
// 最大試行回数を超えた場合のエラー処理
if (attempts >= MAX_ATTEMPTS) {
Serial.println("エラー : Wi-Fi接続の最大試行回数を超えました");
Serial.println("設定を確認して、リセットボタンを押して再試行してください");
while (true); // 無限ループで停止
}
}