2025年5月10日土曜日

Timer Camera X(ジャンク)、WiFiに繋がるか...

 先の記事で記載したWiFiに接続できないM5STACK ESP32 PSRAM Timer Camera XでWiFi関連をチェックしてみました。結論を先に言ってしまうと、繋がりませんでした。

最初にM5Burnerを使用してTimerCamForUIFlowを書き込んで、CameraToolsに接続しました。残念ながら、USB経由では問題なく接続できましたが、WiFiにすると接続がエラーになります。やはり、問題があることは確かです。

ESP32 Wifi接続できない"をキーワードに検索をしてみた結果、いろいろと出てきました。そこで、それらを踏まえたチェック用のスケッチを作成しました。内容としてはMACアドレス表示、セキュリティ設定の変更、電波強度変更、WiFiスキャン(ファクトリテストで行っていました)を行うようにしています

Unitに映像を表示させることにしました。なお、JEPEGモード、320x240で撮影し、それをLCD Unitに表示する簡単な記述になります。

#include <M5TimerCAM.h>
#include <M5GFX.h>
#include <M5UnitLCD.h>
#include <WiFi.h>
#include "wifi_chk.h"

// M5UnitLCD display
M5UnitLCD display(4, 13, 400000);  // SDA, SCL, FREQ

int tx_power;     // 送信出力値格納用
char msgbuf[64];  // メッセージ表示用

// WiFi Power CHeck
void wifi_power_chk() {
  Serial.println("WiFi Power CHeck");
  display.println("WiFi Power CHeck");

  wifi_power_t wifiPWR[11];
  wifiPWR[0] = WIFI_POWER_19_5dBm;  // 78
  wifiPWR[1] = WIFI_POWER_19dBm;    // 76
  wifiPWR[2] = WIFI_POWER_18_5dBm;  // 74
  wifiPWR[3] = WIFI_POWER_17dBm;    // 68
  wifiPWR[4] = WIFI_POWER_15dBm;    // 60
  wifiPWR[5] = WIFI_POWER_13dBm;    // 52
  wifiPWR[6] = WIFI_POWER_11dBm;    // 44
  wifiPWR[7] = WIFI_POWER_8_5dBm;   // 34
  wifiPWR[8] = WIFI_POWER_7dBm;     // 28
  wifiPWR[9] = WIFI_POWER_5dBm;     // 20
  wifiPWR[10] = WIFI_POWER_2dBm;    // 8

  WiFi.disconnect(true, true);
  WiFi.mode(WIFI_STA);
  WiFi.setMinSecurity(WIFI_AUTH_WPA2_PSK);  // Lower min security to WPA.
  for (int i = 0; i < 11; ++i) {
    WiFi.begin(ssid, password);
    wl_status_t status = WiFi.begin(ssid, password);
    WiFi.setTxPower(wifiPWR[i]);
    sprintf(msgbuf, "Try WiFi connection by %d...", WiFi.getTxPower());
    Serial.printf(msgbuf);
    display.println(msgbuf);

    delay(10000);
    if (status != WL_CONNECTED) {
      status = WiFi.status();
      sprintf(msgbuf,
              status == WL_NO_SHIELD ? "no shield\n" : status == WL_IDLE_STATUS     ? "idle\n"
                                                     : status == WL_NO_SSID_AVAIL   ? "no ssid available\n"
                                                     : status == WL_SCAN_COMPLETED  ? "scan completed\n"
                                                     : status == WL_CONNECT_FAILED  ? "connect failed\n"
                                                     : status == WL_CONNECTION_LOST ? "connection lost\n"
                                                     : status == WL_DISCONNECTED    ? "disconnected\n"
                                                                                    : "connected\n");
    } else sprintf(msgbuf, "conncted\n");
    Serial.printf(msgbuf);
    display.println(msgbuf);
    WiFi.disconnect(true, true);
    WiFi.reconnect();
  }
}

// WiFi Security CHeck
void wifi_sec_chk() {
  Serial.println("WiFi Security CHeck");
  display.println("WiFi Security CHeck");

  wifi_auth_mode_t wifiSEC[6];
  wifiSEC[0] = WIFI_AUTH_OPEN;            /**< authenticate mode : open */
  wifiSEC[1] = WIFI_AUTH_WEP;             /**< authenticate mode : WEP */
  wifiSEC[2] = WIFI_AUTH_WPA_PSK;         /**< authenticate mode : WPA_PSK */
  wifiSEC[3] = WIFI_AUTH_WPA2_PSK;        /**< authenticate mode : WPA2_PSK */
  wifiSEC[4] = WIFI_AUTH_WPA_WPA2_PSK;    /**< authenticate mode : WPA_WPA2_PSK */
  wifiSEC[5] = WIFI_AUTH_WPA2_ENTERPRISE; /**< authenticate mode : WPA2_ENTERPRISE */

  WiFi.disconnect(true, true);
  WiFi.mode(WIFI_STA);
  for (int i = 0; i < 6; ++i) {
    WiFi.begin(ssid, password);
    wl_status_t status = WiFi.begin(ssid, password);
    WiFi.setMinSecurity(wifiSEC[i]);
    switch (wifiSEC[i]) {
      case WIFI_AUTH_OPEN:
        sprintf(msgbuf, "Try WiFi connection by open ...\n");
        break;
      case WIFI_AUTH_WEP:
        sprintf(msgbuf, "Try WiFi connection by WEP ...\n");
        break;
      case WIFI_AUTH_WPA_PSK:
        sprintf(msgbuf, "Try WiFi connection by WPA ...\n");
        break;
      case WIFI_AUTH_WPA2_PSK:
        sprintf(msgbuf, "Try WiFi connection by WPA2 ...\n");
        break;
      case WIFI_AUTH_WPA_WPA2_PSK:
        sprintf(msgbuf, "Try WiFi connection by WPA+WPA2 ...\n");
        break;
      case WIFI_AUTH_WPA2_ENTERPRISE:
        sprintf(msgbuf, "Try WiFi connection by WPA2-EAP ...\n");
        break;
      default:
        sprintf(msgbuf, "Setting error!\n");
    }
    Serial.printf(msgbuf);
    display.println(msgbuf);

    delay(10000);
    if (status != WL_CONNECTED) {
      status = WiFi.status();
      sprintf(msgbuf,
              status == WL_NO_SHIELD ? "no shield\n" : status == WL_IDLE_STATUS     ? "idle\n"
                                                     : status == WL_NO_SSID_AVAIL   ? "no ssid available\n"
                                                     : status == WL_SCAN_COMPLETED  ? "scan completed\n"
                                                     : status == WL_CONNECT_FAILED  ? "connect failed\n"
                                                     : status == WL_CONNECTION_LOST ? "connection lost\n"
                                                     : status == WL_DISCONNECTED    ? "disconnected\n"
                                                                                    : "connected\n");
    } else sprintf(msgbuf, "conncted\n");
    Serial.printf(msgbuf);
    display.println(msgbuf);
    WiFi.disconnect(true, true);
    WiFi.reconnect();
  }
}

void setup() {
  TimerCAM.begin();
  display.begin();
  WiFi.begin();

  Serial.begin(115200);
  display.setTextSize(2);
  display.setRotation(3);
  display.setTextScroll(true);
  display.clear(TFT_BLACK);

  // Show MacAddress
  byte mac[6];
  WiFi.macAddress(mac);
  sprintf(msgbuf, "MAC Address : \n %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  Serial.printf(msgbuf);
  display.println(msgbuf);

  // Show WiFi Power (Default)
  WiFi.disconnect(true, true);
  tx_power = WiFi.getTxPower();  // デフォルトの送信出力取得 19.5dBmだと78
  sprintf(msgbuf, "Default TxPower: %d\n", tx_power);
  Serial.printf(msgbuf);
  display.println(msgbuf);
  delay(5000);

  display.clear(TFT_BLACK);
  wifi_sec_chk();
  display.clear(TFT_BLACK);
  wifi_power_chk();
}

void loop() {
  //WiFi スキャン
  Serial.println("WiFi Scan start");
  display.println("WiFi Scan start");

  // WiFi.scanNetworks will return the number of networks found.
  int n = WiFi.scanNetworks();
  Serial.println("WiFi Scan done");
  display.println("WiFi Scan done");
  if (n == 0) {
    Serial.println("no networks found\n");
    display.println("no networks found\n");
  } else {
    sprintf(msgbuf, "%2d networks found\n", n);
    Serial.printf(msgbuf);
    display.println(msgbuf);
    Serial.println("Nr | SSID                             | RSSI | CH | Encryption");
    display.println("Nr | SSID                             | RSSI | CH | Encryption");
    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      sprintf(msgbuf, "%2d | %-32.32s | %4d | %2d | ", i + 1, WiFi.SSID(i).c_str(), WiFi.RSSI(i), WiFi.channel(i));
      Serial.printf(msgbuf);
      display.println(msgbuf);
      switch (WiFi.encryptionType(i)) {
        case WIFI_AUTH_OPEN:
          sprintf(msgbuf, "open\n");
          break;
        case WIFI_AUTH_WEP:
          sprintf(msgbuf, "WEP\n");
          break;
        case WIFI_AUTH_WPA_PSK:
          sprintf(msgbuf, "WPA\n");
          break;
        case WIFI_AUTH_WPA2_PSK:
          sprintf(msgbuf, "WPA2\n");
          break;
        case WIFI_AUTH_WPA_WPA2_PSK:
          sprintf(msgbuf, "WPA+WPA2\n");
          break;
        case WIFI_AUTH_WPA2_ENTERPRISE:
          sprintf(msgbuf, "WPA2-EAP\n");
          break;
        case WIFI_AUTH_WPA3_PSK:
          sprintf(msgbuf, "WPA3\n");
          break;
        case WIFI_AUTH_WPA2_WPA3_PSK:
          sprintf(msgbuf, "WPA2+WPA3\n");
          break;
        case WIFI_AUTH_WAPI_PSK:
          sprintf(msgbuf, "WAPI\n");
          break;
        default:
          sprintf(msgbuf, "unknown\n");
      }
      Serial.printf(msgbuf);
      display.println(msgbuf);
      delay(10);
    }
  }
  Serial.printf("");
  display.println("");

  // Delete the scan result to free memory for code below.
  WiFi.scanDelete();

  // Wait a bit before scanning again.
  delay(5000);
  TimerCAM.Power.powerOff();
}

調べては継ぎ足しして作成したので、冗長な記述が多いです(汗

なおwifi_chk.hは、ssidとpasswordのみを宣言しています。 wifi_sec_chk()がセキュリティ設定を変更して接続チェックを行っています。wifi_power_chk()は電波強度を変更して接続チェックを行っています。なお、loop()ないでWiFiスキャンを行っています。

実行した結果は下記になります:

MAC Address : 
 **:**:**:**:**:**
Default TxPower: 78
WiFi Security CHeck
Try WiFi connection by open ...
disconnected
Try WiFi connection by WEP ...
disconnected
Try WiFi connection by WPA ...
disconnected
Try WiFi connection by WPA2 ...
disconnected
Try WiFi connection by WPA+WPA2 ...
disconnected
Try WiFi connection by WPA2-EAP ...
no ssid available
WiFi Power CHeck
Try WiFi connection by 72...disconnected
Try WiFi connection by 72...disconnected
Try WiFi connection by 72...disconnected
Try WiFi connection by 66...disconnected
Try WiFi connection by 60...disconnected
Try WiFi connection by 50...disconnected
Try WiFi connection by 38...disconnected
Try WiFi connection by 28...disconnected
Try WiFi connection by 28...disconnected
Try WiFi connection by 14...disconnected
Try WiFi connection by 2...disconnected
WiFi Scan start
WiFi Scan done
 3 networks found
Nr | SSID                             | RSSI | CH | Encryption
 1 | ***********                      |  -85 | 11 | WPA+WPA2
 2 | ***********                      |  -89 |  4 | WPA2
 3 | ***********                      |  -93 |  4 | WPA2

MACアドレスは正常に表示され、WiFiスキャンも実行されました。しかし、セキュリティや電波強度の変更を行ってもまったく繋がる様子がありません。スキャンは正常なのに何で?!って感じです。また、電波強度は設定した値と読み取った値が異なることも良くわかりません。今度、M5STAMP Picoで試してみたいと思います

最終手段でフラッシュメモリをクリアして、工場出荷状態に戻して上記テストを再度行ってみました(フラッシュメモリのクリアは自己責任でお願いします)。クリアにはesptool.pyを使用します。入手先はEspressifのGithubになります

https://github.com/espressif/esptool

下記コマンドにて、フラッシュをクリアできます

”esptool.py -p シリアルポート名 erase_flash"

残念ながら フラッシュメモリをクリアでも問題は改善しませんした。と言うわけで最初に記載した通り、結果はWiFiには何をやっても繋がりませんでした。

念のため、蓋を開けて確認しましたが老いた目では問題があるようには見えません


当初の予定通りカメラボードとして、余生を過ごしてもらう結果になりました

参考にさせて頂きましたサイト:

0 件のコメント:

コメントを投稿