M5StickCでできること 〜Wi-Fi接続が1回おきに失敗する時の対処法

M5StickCを使って、いろいろな調査を行っていますが、しばらく前から、M5StickCからWi-Fiルータへの接続が不安定な状況が続いていました。


問題なくWi-Fiにつながっている状態から、スケッチを少しだけ変更して書き込んだだけでつながらなくなったり、再起動すると今度はつながったりと、なんだか良くわからない状態です。

しばらくは騙し騙し使っていたのですが、一度きちんと状況を確認しようと思い、調査したところ、M5StickCからWi-Fiルータへの接続が1回おきに失敗することがわかりました。
Wi-Fiにつながっている状態で、再起動したりスケッチを書き込んだりすると、Wi-Fiにつながりません。逆に、Wi-Fiにつながっていない状態で、再起動したりスケッチを書き込んだりすると、問題なくWi-Fiにつながります。

例えば、以下の簡単なスケッチを書き込んでみます。

#include <M5StickC.h>
#include <WiFi.h>

const char* ssid     = "XXXXXXXX";
const char* password = "XXXXXXXX";

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.setCursor(0, 0, 2);

  M5.Lcd.printf("Connecting to %s\n", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
  }
  M5.Lcd.printf("\nWiFi connected\n");
}

void loop() {
}

書き込みが完了すると、以下のように、問題なくWi-Fi接続できています。

この状態で、一旦M5StickCの電源をOFFにし、再度ONにすると、今度はWi-Fiにつながりません。

もう一度OFF→ONにすると、問題なくつながります。

WiFi.disconnect() を試してみたり、NVS領域を初期化してみたりと、いろいろと試してみましたが、状況は変わりません。

いろいろと調べていたところ、こちら の記事にたどりつきました。
この問題が、Wi-Fiルータ(親機)の機種に依存する、というものです。

確かに当方も、数ヶ月前にWi-Fiルータを更新しており、その頃から接続が不安定になっているような気がします(当方のWi-Fiルータは、バッファローの「WSR-2533DHP3」という機種です)。

そんな訳で、接続先のWi-Fiルータを別のもの(モバイルWi-Fiルータ)に変更してみたところ、確かに問題なくつながるようになりました。

原因は分かりましたが、当方のWi-Fiルータを使っている限り、1回おきに接続が失敗するという状況は変わりません。
この問題を回避するため、スケッチを少しだけ修正しました。

#include <M5StickC.h>
#include <WiFi.h>

const char* ssid     = "XXXXXXXX";
const char* password = "XXXXXXXX";

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.setCursor(0, 0, 2);

  int cnt=0;
  M5.Lcd.printf("Connecting to %s\n", ssid);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    cnt++;
    delay(500);
    M5.Lcd.print(".");
    if(cnt%10==0) {
      WiFi.disconnect();
      WiFi.begin(ssid, password);
      M5.Lcd.println("");
    }
    if(cnt>=30) {
      ESP.restart();
    }
  }
  M5.Lcd.printf("\nWiFi connected\n");
}

void loop() {
}

Wi-Fi接続できない状態で再起動すると、接続できることは分かっているので、5秒間、Wi-Fiに接続できなかったら、WiFi.begin() を再実行するようにしました。また、それでも接続できない場合に備えて ESP.restart() も入れておきました。

これで動作確認したところ、接続できないままで5秒経過し、WiFi.begin() が再実行されると、その後は速やかにWi-Fi接続できました。

なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。