H1rono_K
@H1rono_K

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ESP32でwifiに接続できない

状況

Ubuntu 18.04からVSCodeのPlatformIOでesp32(esp32-wroom-32e)をいじっています。esp32でwifiに接続するためにあれこれしましたが、どれもうまくいきませんでした。

プログラムと実行結果

PlatformIOのプロジェクトとして、platformio.inisrc/main.cppの2つを載せておきます。

platformio.ini
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino

src/main.cpp
#include <Arduino.h>
#include <WiFi.h>

const char * SSID = "{接続先wifiのSSID}";
const char * PASSWORD = "{接続先wifiのパスワード}";

void setup() {
    Serial.begin(9600);
    // wifi接続の流れを最初から追えるようにするため、キーボード入力を待つ
    while (!Serial.available()) {
        Serial.println("put some char...");
        delay(500);
    }
    Serial.readString();
    // 接続開始
    Serial.printf("Connecting to %s\n", SSID);
    WiFi.disconnect(true, true);
    WiFi.mode(WIFI_STA);
    WiFi.begin(SSID, PASSWORD);
    wl_status_t status = WiFi.begin(SSID, PASSWORD);
    while (status != WL_CONNECTED) {
        status = WiFi.status();
        Serial.println(
            status == WL_NO_SHIELD       ? "no shield" :
            status == WL_IDLE_STATUS     ? "idle" :
            status == WL_NO_SSID_AVAIL   ? "no ssid available" :
            status == WL_SCAN_COMPLETED  ? "scan completed" :
            status == WL_CONNECT_FAILED  ? "connect failed" :
            status == WL_CONNECTION_LOST ? "connection lost" :
            status == WL_DISCONNECTED    ? "disconnected" :
        /** status == WL_CONNECTED      */ "connected"
        );
        if (status == WL_NO_SSID_AVAIL) {
            WiFi.disconnect(true, true);
            WiFi.begin(SSID, PASSWORD);
            ESP.restart();
        }
        delay(500);
    }
    Serial.println("Connected.");
    Serial.printf("IP address: %s\n", WiFi.localIPv6().toString().c_str());
}

void loop() {}

このプログラムをマイコンに書き込んだところ、シリアルモニターは次のようになりました。

--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Miniterm on /dev/ttyUSB0  9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
put some char...
put some char...
put some char...
put some char...
put some char... # ここで1文字入力
Connecting to {ssid}
disconnected
disconnected
disconnected
disconnected
disconnected
no ssid available
# ESP.restart()が呼ばれる
!�
��ܠ��J��1��1!���!�J�put some char... # 振り出しに戻る
put some char...
... # 何度やっても同じ流れ

つまり、WiFi.begin(SSID, PASSWORD)の後にWiFi.status()が数秒間WL_DISCONNECTEDとなり、その後WL_NO_SSID_AVAILに切り替わる、といった具合です。

参考

0

3Answer

M5StickCでの動作確認になりますが、上げられているソースコードにて、問題なくWiFi接続できました。
(多少、ヘッダファイルなどをM5StickC用に変更はしましたが)

image.png

ESP32内蔵のM5StickCにて動作したため、コードは問題なさそうに思えます。
そのため、すでに確認済みかもしれませんが、

  • 5GHz帯のWiFiに接続しようとしている(ESP32は2.4GHzしか対応していないので)
  • SSIDやPASSWORDが間違っている

などWiFiルーター側の設定関連を見直してみるのも一つかと思います。

1Like

Comments

  1. @H1rono_K

    Questioner

    回答ありがとうございます。
    お察しの通り、どちらも既に確認済みです。おそらく大丈夫だと思うのでルーターの型番を記しますが、PA-WG1200HP4です。2.4GHzに対応していることが確認できるかと思います。
    また、SSIDとPASSWORDですが、手元のiPhoneで確認したところ、確かに正しいものであることがわかりました。
  2. https://okiraku-camera.tokyo/blog/?page_id=7178
    に書かれているように、WiFi.begin(); の前に、WiFi.disconnect(); とdelay(); を入れてみるといかがでしょうか?
    (似たようなコードが入っているのですでに試されているかもしれませんが・・)

    上記URLの症状が以下の感じで @H1rono_K さんと似ているように思えました。
    >WiFi.status() の戻り値がしばらくの間は WL_DISCONNECTED ( == 6) を返すが、
    >その後 WL_NO_SSID_AVAIL ( == 1) となって回復せず、スケッチが接続をあきらめていることが分かった。
  3. 連投ですみませんが、
    `WiFi.status()`が`WL_NO_SSID_AVAIL`になるとのことだったので、
    https://garretlab.web.fc2.com/arduino/esp32/examples/WiFi/WiFiScan.html
    に書かれているサンプルコードを使って、
    「ESP32が接続したいSSIDをscanできるか?」を確認してみるのはいかがでしょうか。
    そもそもscanして出てこないのであれば、接続はできないと思いましたので。

    私の環境でサンプルコードを使ってscan試してみたところ、接続したいSSIDを問題なくscanできました
  4. @H1rono_K

    Questioner

    連投ありがとうございます。

    > `WiFi.begin();`の前に、`WiFi.disconnect();`と`delay();`を入れてみる
    こちらもお察しの通り、既に試しました... `delay();`を入れたら変わるかなと思いましたが、何も変わりません。

    > ESP32が接続したいSSIDをscanできるかを確認してみる
    提示されたプログラムを、includeの部分のみ少しいじって実行しました。結果、複数のSSIDと一緒に目的のものがscanされていました。

    一体何が原因なんでしょうかね?知識不足なのですが、一つ前のコメントにある確認方法では不十分だ、とかでしょうか?
  5. なるほど、変わらなかったのですね・・・
    scanできていれば、そのSSIDへの接続もできそうな気がします。

    あとは以下に書かれているようにbeginを消してみる、とかでしょうか。
    もしこれで解決したら、WiFiの接続状態が変な状態で残っていたのかもしれないです。
    https://ryuji-since2016.blog.ss-blog.jp/2016-12-03

    これで変わらない場合、ちょっと現状は他に案が思い浮かばないです。
  6. @H1rono_K

    Questioner

    `WL_NO_SHIELD`で繋がりませんでした...
    ごめんなさい、全然解決できなくて... ルーターの方をもう一度調べ直してみようと思います。

別のwifiで試したところ問題なく接続できました...
つまりこれは自分のルーターの問題であることがわかったので、ここで喚いても進展はなさそうです。この質問はもう閉じようと思います、ありがとうございました。

0Like

しばらく前からplatform-espressif32のバージョンが上がり,WPAを使用しているアクセスポイントに繋がらなくなったのが関係しているかもしれません. 私の環境ではOpenWrt で WPA/WPA から WPA2 only にすると繋がるようになりました.

Aruduino環境だと同じコードで動作するのは,platformioのplatform-espressif32とArduinoのarduino-esp32で利用しているESP-IDFのバージョンが違うからかもしれません.

Arduino環境のesp32のボードマネージャのurlがhttps://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.jsonに変更されましたが,更新済みでしょうか?

変更後に利用できる2.0.0以降のarduino-esp32を利用したときにArduinoでもWiFiに接続できなくなる場合は,ESP-IDFのバージョン違いがこれらの問題の原因だと思います

0Like

Your answer might help someone💌