知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

XIAO ESP32S3がWiFiに繋がらなかったので調べてみたら、ハードの問題である可能性が高いことがわかった

2023年の6月に極小マイコンボードのXIAOシリーズに、カメラモジュール搭載のアドオンボードが付属している「Seeed Studio XIAO ESP32S3 Sense」が加わっていたので、遅ればせながら買って使おうとしたら、なんとどうしたことかWiFiに全然繋がらなかったんです。

 

で、ネットで色々と検索していたら、次の記事を見つけることができました。

 

この記事ではWiFi接続時に次のコードを実行したら繋がったと書いてありました。

WiFi.setTxPower(WIFI_POWER_8_5dBm);

このsetTxPowerはWiFiの送信出力を設定するコードで、デフォルトは19.5dBm。8.5dBmだとデフォルトの半分以下なのですが、それにしても「出力を下げることで繋がるようになる」というのは普通ではありません。

 

そこで、どの出力値でWiFi接続ができるかを確認するプログラムを書いて確認してみました。

#include "WiFi.h"

// WIFI情報(自分の環境に応じて変更してください)
#define SSID  "**********"
#define PASS  "**********"

int tx_power;                   // 送信出力値格納用

void setup() {
  Serial.begin(115200);
  tx_power = WiFi.getTxPower(); // デフォルトの送信出力取得 19.5dBmだと78
  Serial.printf("\nDefault TxPower: %d\n", tx_power);
}

void loop() {
  if (tx_power >= 20) {         // ループする送信出力値 20だと5dBm
    WiFi.begin(SSID, PASS);
    WiFi.setTxPower((wifi_power_t)tx_power--); // 送信出力値を設定してデクリメント
    Serial.printf("Try WiFi connection at %d...", WiFi.getTxPower());
    int i = 0;
    while (WiFi.status() != WL_CONNECTED) {
      delay(1000);
      if (++i > 20) break;      // 約20秒接続試行して繋がらなかったら
    }
    if (i > 20) Serial.println("Fail!");
    else  Serial.println("Success!");
    WiFi.disconnect();
  }
  delay(3000);
}

実行した結果は、次のようになりました。

Default TxPower: 78
Try WiFi connection at 78...Fail!
Try WiFi connection at 77...Fail!
Try WiFi connection at 76...Fail!
Try WiFi connection at 75...Fail!
Try WiFi connection at 74...Fail!
Try WiFi connection at 73...Fail!
Try WiFi connection at 72...Fail!
Try WiFi connection at 71...Fail!
Try WiFi connection at 70...Fail!
Try WiFi connection at 69...Success!
Try WiFi connection at 68...Success!
Try WiFi connection at 67...Success!
Try WiFi connection at 66...Success!
Try WiFi connection at 65...Success!
Try WiFi connection at 64...Success!
Try WiFi connection at 63...Success!
Try WiFi connection at 62...Success!
Try WiFi connection at 61...Success!
Try WiFi connection at 60...Success!
Try WiFi connection at 59...Success!
Try WiFi connection at 58...Success!
Try WiFi connection at 57...Success!
Try WiFi connection at 56...Success!
Try WiFi connection at 55...Success!
Try WiFi connection at 54...Success!
Try WiFi connection at 53...Success!
Try WiFi connection at 52...Success!
Try WiFi connection at 51...Success!
Try WiFi connection at 50...Success!
Try WiFi connection at 49...Success!
Try WiFi connection at 48...Success!
Try WiFi connection at 47...Success!
Try WiFi connection at 46...Success!
Try WiFi connection at 45...Success!
Try WiFi connection at 44...Success!
Try WiFi connection at 43...Success!
Try WiFi connection at 42...Success!
Try WiFi connection at 41...Success!
Try WiFi connection at 40...Success!
Try WiFi connection at 39...Success!
Try WiFi connection at 38...Success!
Try WiFi connection at 37...Success!
Try WiFi connection at 36...Success!
Try WiFi connection at 35...Success!
Try WiFi connection at 34...Success!
Try WiFi connection at 33...Success!
Try WiFi connection at 32...Fail!
Try WiFi connection at 31...Success!
Try WiFi connection at 30...Success!
Try WiFi connection at 29...Success!
Try WiFi connection at 28...Success!
Try WiFi connection at 27...Success!
Try WiFi connection at 26...Success!
Try WiFi connection at 25...Fail!
Try WiFi connection at 24...Success!
Try WiFi connection at 23...Success!
Try WiFi connection at 22...Success!
Try WiFi connection at 21...Success!
Try WiFi connection at 20...Fail!

70台が失敗していますね。

この送信出力の内部の値はESP32のWiFiライブラリの中にある「WiFiGeneric.h」というヘッダーファイルで定義されています。

定義の部分を抜き出すと、このようになっています。

typedef enum {
    WIFI_POWER_19_5dBm = 78,// 19.5dBm
    WIFI_POWER_19dBm = 76,// 19dBm
    WIFI_POWER_18_5dBm = 74,// 18.5dBm
    WIFI_POWER_17dBm = 68,// 17dBm
    WIFI_POWER_15dBm = 60,// 15dBm
    WIFI_POWER_13dBm = 52,// 13dBm
    WIFI_POWER_11dBm = 44,// 11dBm
    WIFI_POWER_8_5dBm = 34,// 8.5dBm
    WIFI_POWER_7dBm = 28,// 7dBm
    WIFI_POWER_5dBm = 20,// 5dBm
    WIFI_POWER_2dBm = 8,// 2dBm
    WIFI_POWER_MINUS_1dBm = -4// -1dBm
} wifi_power_t;

この定義を見ると、概ね17dBm以上だと失敗している感じです。

また、70台で失敗する傾向は、XIAO ESP32S3に付属している外部アンテナの有無に影響を受けませんでした。

 

ESP32S3だとこの問題が発生するのかを確かめるため、ESP32S3を使っているM5Stamp S3で同様のプログラムを実行してみましたが、70台で失敗するなんていう変なことは起きませんでした。

(M5Stamp S3はプログラムのSerialUSBSerialに変更する必要があります。)

 

スイッチサイエンスのサイトにXAIO ESP32S3とM5Stamp S3のプロセッサの型番が載っていたので書いておきます。

  • XIAO ESP32S3 : ESP32-S3R8
  • M5Stamp S3 : ESP32-S3FN8

ESP32S3の特定のモデルで発生する問題なのかもしれません。

 

2024/2/9追記

ESP32-S3-WROOM-1-N16R8を搭載したM5Stack Unit CamS3でもこのプログラムを動かしてみましたが、全て"Success!"でした。