kuroの覚え書き

96の個人的覚え書き

XIAO ESP32S3 senseがネットワークに繋がりにくい件



ESP32でwifi接続できてOV2640のカメラを搭載した小さい基板であるXIAO ESP32S3 senseをたくさん購入してタイムラプスを撮りまくるはずだったのだが、この基板、どういうわけか無線LANへの接続がうまくいかないことが多い。多いというのは合計8台買ってみたのだが、スッキリとつながるのは2台だけで、残りは全然繋がらなかったり、つながったり繋がらなかったり、ととても不安定だった。
ペラっとしたアンテナが付属しており、このアンテナをコネクタに接続しないと基板自体にはアンテナパターンがついていないため、まず電波をキャッチできそうにない。なので、このコネクタの接触が悪いのか、そもそも基板の品質がいまいちなのか判断できずお蔵入りしかけていたのだけれど、最近有力な情報を知った。
XIAO ESP32S3がWiFiに繋がらなかったので調べてみたら、ハードの問題である可能性が高いことがわかった - 知的好奇心 for IoT
こちらのブログエントリーによるとどうやら無線LANの出力をあえて下げてやる必要があるらしい。
そんなことよく気がついたな、と言う感じだ。普通繋がらなかったら電波が弱いからできるだけ上げようと思うだろうに。
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;

このように定義されているらしいのだが、先のエントリーによると
tx power > 70以上にすると繋がらなくかるらしい。
で、デフォルトはmax powerになっているからtx power = 78 (19.5 dBm)

というわけで

void connectToWiFi() {
  // Wi-Fiに接続する
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  WiFi.setTxPower(WIFI_POWER_13dBm);
  // Wi-Fiに接続待ち
  Serial.println("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
  Serial.print("STAIP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("");
}

という感じに明示的にWIFI出力を13 dBmくらいに抑えてやるとなんということでしょう、8台全部普通につながるようになったとさ。

秋月電子で売っている小さいケース(タカチ PB3-2-3)にピッタリ。発泡ウレタンボードでレンズボードを作成してはめ込むととても安定する。

他にもこの方のブログは有益で、ESP32のカメラでよく起こる変な色かぶり(緑っぽかったり赤っぽかったり、起動して最初に撮影したフレームがだいたいおかしい)の原因と対策だとかOV3660がOV2640 よりハイスペックなはずなのにESP32につなぐとなんだかボンヤリした画像になる件の対策だったりが紹介されていた。とても役に立ったので拡散しておく。