ESP32

ESP32でWiFi接続を試してみます

ESP32はbluetoothやWiFiを内蔵していて、ネットワーク接続が比較的に簡単に行えます。ということで、WiFi接続にチャレンジしていきたいと思います。

WiFi接続

WiFi接続について、いろいろと試していきたいと思います。

アクセスポイントに接続

まずは、アクセスポイントに接続して、ESP32に設定されているIPアドレス等の設定情報を表示、および、設定を行ってみたいと思います。

プログラムは以下になります。

#include <WiFi.h>

char ssid[] = "ssid";
char pass[] = "password";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, pass);
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
  }

  Serial.println("WiFi Connected");

  GetWiFiConfig();
  SetWiFiConfig();
  GetWiFiConfig();
}

void GetWiFiConfig() {
  Serial.print("IP address:");
  Serial.println(WiFi.localIP());
  Serial.print("default gateway:");
  Serial.println(WiFi.gatewayIP());
  Serial.print("subnetmask:");
  Serial.println(WiFi.subnetMask());
  Serial.print("DNS Server1:");
  Serial.println(WiFi.dnsIP(0));
  Serial.print("DNS Server2:");
  Serial.println(WiFi.dnsIP(1));

  byte mac_addr[6];
  WiFi.macAddress(mac_addr);
  Serial.print("mac address:");
  for(int i = 0; i < 6; i++){
    Serial.print(mac_addr[i], HEX);

    if(i < 5){
      Serial.print(":");
    }else{
      Serial.println("");
    }
  }
}

void SetWiFiConfig() {
  WiFi.config(IPAddress(10, 0, 0, 11),
              WiFi.gatewayIP(),
              WiFi.subnetMask(),
              WiFi.dnsIP(0),
              WiFi.dnsIP(1));
}

void loop() {
  // put your main code here, to run repeatedly:

}

プログラムについて簡単に説明いたします。

1行目で、WiFiを使用するためのクラスヘッダを読み込んでいます。

3行目で、接続するアクセスポイントのSSIDを設定しています。

4行目で、アクセスポイントに接続するパスワードを設定しています。

SSIDとパスワードは、実行環境に合わせて設定を行ってください。

8行目で、SSIDとPASSWORDを指定して、ネットワーク設定の初期化とWiFi接続を行っています。

9行目で、WiFi接続の現在のステータスを確認しています。WiFiに接続が完了するまで、ステータスの確認を行います。「WiFi.status()」を行うことで、以下の値が確認できます。

※Arduino公式参照(Arduino – WiFiStatus

戻り値説明
WL_CONNECTEDWiFiネットワークに接続完了。
WL_NO_SHIELDWiFiシールドが存在しない。
WL_IDLE_STATUSWiFi.begin()の呼び出しから、接続完了、または、接続失敗までのアイドル状態。
WL_NO_SSID_AVAIL利用できるSSIDが存在しない。
WL_SCAN_COMPLETEDネットワークスキャン完了。
WL_CONNECT_FAILEDWiFiネットワークに接続失敗。
WL_CONNECTION_LOSTWiFiネットワークの接続ロスト。
WL_DISCONNECTEDWiFiネットワークから切断。

WiFiネットワークとの接続が完了後に、現時点でESP32に設定されている接続情報を取得します。

15行目の「GetWiFiConfig()」関数で、設定情報をシリアル表示しています。表示する内容は以下になります。

関数取得値
WiFi.localIP()IPアドレス
WiFi.gatewayIP()デフォルトゲートウェイ
WiFi.subnetMask()サブネットマスク
WiFi.dnsIP(0)DSNサーバー1のアドレス
WiFi.dnsIP(1)DSNサーバー2のアドレス
WiFi.macAddress(mac_addr)MACアドレス

また、16行目の「SetWiFiConfig()」関数で、今回はIPアドレスのみ設定しています。47~51行目で、「WiFi.config()」を使用してネットワーク設定を行っています。引数は以下になります。

  • ESP32に割り当てるIPアドレス
  • デフォルトゲートウェイ
  • サブネットマスク
  • DNSサーバー1のIPアドレス
  • DNSサーバー2のIPアドレス

17行目で、設定が行われているか確認しています。

Arduino IDEからESP32に書き込みを行い、動作を確認してみます。

WiFi接続が正常に行われ、まず最初に割り当てられたIPアドレスが表示されています。その後、「10.0.0.11」にIPアドレスが書き換わっていることが確認できました。

複数のアクセスポイントを切り替えて接続

自宅のWiFiや携帯のテザリングなど、複数のアクセスポイントを使い分けることができる「WiFiMulti」クラスを試してみたいと思います。

「WiFiMulti」クラスは、事前に複数のアクセスポイントの情報を登録しておき、登録したアクセスポイントに順番に接続を試みます。そして、接続が確立したアクセスポイントを利用するといった便利機能になります。

「WiFiMulti」クラスは、Arudinoのサンプルスケッチにもあるので、確認してみてください。メニューの「ファイル」→「スケッチ例」→「WiFi」→「WiFiMulti」を参照。

確認プログラムを以下に記載いたします。

#include <WiFi.h>
#include <WiFiMulti.h>

WiFiMulti wifiMulti;

int lastWifiStatus = WL_DISCONNECTED;

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

  wifiMulti.addAP("ssid1", "pass1");
  wifiMulti.addAP("ssid2", "pass2");
}

void loop() {
  int wifiStatus = wifiMulti.run();
  
  if(wifiStatus != lastWifiStatus) {
    switch(wifiStatus){
      case WL_NO_SHIELD:
      Serial.println("no shiled");
      break;
      case WL_IDLE_STATUS:
      Serial.println("idle");
      break;
      case WL_NO_SSID_AVAIL:
      Serial.println("no ssid available");
      break;
      case WL_SCAN_COMPLETED:
      Serial.println("scan completed");
      break;
      case WL_CONNECTED:
      Serial.println("connected");
      Serial.print("ssid:");
      Serial.println(WiFi.SSID());
      break;
      case WL_CONNECT_FAILED:
      Serial.println("connect failed");
      break;
      case  WL_CONNECTION_LOST:
      Serial.println("connection lost");
      break;
      case  WL_DISCONNECTED:
      Serial.println("disconnected");
      break;
    }

    lastWifiStatus = wifiStatus;
  }
  delay(1000);
}

プログラムについて簡単に説明いたします。

1~2行目に、WiFiとWiFiMultiクラスを使用するために、ヘッダファイルの読み込みをします。

4行目で、WiFiMultiクラスを使用するための変数を設定します。

11、12行目で、「WiFi.addAP()」を使用して、アクセスポイントを複数追加します。引数には、SSIDと接続パスワードを指定して下さい。今回は、自宅のルータと携帯のテザリングを使用してみました。

15~51行目の「loop()」関数で、1秒ごと繰り替えしWiFiの接続状況を監視しています。

16行目の「run()」関数で、「WiFi.addAP()」で追加したアクセスポイントに接続を試みて、接続状態を戻り値で取得できます。

18行目で、今回の接続状態と前回の接続状態を比較して、不一致の場合は状態を出力しています。接続が確立した場合(WL_CONNECTED)は、接続先のSSIDも出力しています。

実際に動作させた結果が以下になります。

SSID:NETGEAR■・・・自宅ルータ
SSID:SH-■_AP・・・携帯テザリング

確認した手順とESP32のWiFi接続状態は、以下のようになりました。

  1. 自宅ルータと携帯テザリングを両方ともONにする。
  2. ESP32を起動すると、自宅ルータに接続される。
  3. 自宅ルータの電源OFFにする。
  4. ESP32が接続先を見失う。
  5. 使用できるSSIDがなくなる(実際は携帯のテザリングがONなのであるのでは?)。
  6. 携帯のテザリングに接続される。
  7. 携帯のテザリングをOFFにする。
  8. ESP32のWiFiが切断される。
  9. 使用できるSSIDがなくなる。
  10. 自宅ルータの電源をONにする。
  11. 自宅ルータに接続される。

概ね予想通りの動作をしてくれました。ただ、接続可能なSSIDが残っている状態で「no ssid available」は、ちょっと微妙でした。

まとめ

ESP32でWiFi接続を試してみました。

比較的簡単にネットワーク接続を行うことができてしまい、ちょっと拍子抜けしてしまいました。便利なライブラリがいろいろたありそうなので、引き続きWiFiを試していきたいと思います。

【参考図書】