ESP32 ( ESP-WROOM-32 , M5Stack )自分的 トラブルシューティング まとめ

arduino_esp32_trouble00 ESP32 ( ESP-WROOM-32 )

【目次ページへ】

4.SPIFFS アップローダープラグインでファイルをアップロードできない(その1)

Arduino IDE の ESP32 SPIFFS フラッシュアップローダープラグインを使って、ESP-WROOM-32 の Flash メモリへデータをアップロードしようとする時、Arduino IDE に以下のメッセージが表示されてアップロードできない場合があります。

serial.serialutil.SerialException: could not open port 'COM5': WindowsError(5, '\x83A\....\x81B')
Failed to execute script esptool
SPIFFS Upload failed!

原因

シリアルモニターが起動していることが原因の場合が多いです。

対策

シリアルモニターを閉じてから、再度アップロードしてください。

5.SPIFFS アップローダープラグインでファイルをアップロードできない(その2)

原因

ESP-WROOM-32 のデフォルトでは、SPIFFS メモリ領域にアップロードできるファイルサイズは約 1MB 程度です。
それ以上のファイルをアップロードしようとするとエラーになる場合があります。

対策

トータル 1MB以上のファイルをアップロードしたい場合、以下の記事を参照して、SPIFFSフラッシュ領域をサイズアップしてから、アップロードしてください。
Arduino core for the ESP32 のバージョンと、SPIFFSアップローダープラグインのバージョンも注意してください。
2019/05/06時点では以下のバージョンのペアで使用してください。

Arduino core for the ESP32 stable 1.0.2
SPIFFS アップローダープラグイン ver 1.0

そして、下図の様に Arduino IDE のボードマネージャの Partition Scheme を自分の好みのサイズに変更すればアップロードできると思います。

その他、古いバージョンでパーティションテーブルファイルを変更する場合は、以下の記事を参照してください。

ESP-WROOM-32 ( ESP32 ) SPIFFS メモリサイズを大きくする方法

6.SPIFFS アップローダープラグインでファイルをアップロードできない(その3)

上記の SPIFFS アップロードできない以外にもう一つ、以下のようなエラーメッセージがでることがあります。

UnicodeDecodeError: ‘ascil’ code can’t decode byte 0xef in position 0: ordinalnot in range(128)

原因

SPIFFS メモリのサイズアップするために、パーティションテーブルをメモ帳などの簡易エディタで編集したことによる、文字コード変換エラーが原因です。

対策

UTF-8 コードで保存できる、プログラム開発用のテキストエディタを使用した方が賢明です。
私の場合は、フリーの Adobe Brackets を使っていますが、サクラエディタなどでも良いと思います。
要するに、スペースやTAB など、半角と全角スペースを間違えて入力してしまわないように、明確に判別できるテキストエディタであれば良いと思います。

7.SPIFFS アップローダープラグインで正常にファイルをアップロードできたのに、ファイルの読み込み不具合

SPIFFS アップローダープラグインでファイルをフラッシュにアップロードして、正常に終了したのに、読み込みがうまくいかない場合があります。

原因

ファイルサイズが大きすぎても、SPIFFS アップローダープラグインでアップロードしてエラーが出ない場合があります。
その場合、大きいファイルはファイルの一部だけしかアップロードされていなかったり、ファイルサイズがゼロだったりしています。

対策

デフォルト設定では、アップロードできるファイルサイズは約 1MB 程度です。
それ以上のサイズをアップロードする場合は、SPIFFSメモリサイズを大きくしてください。
Arduino core for the ESP32 stable 1.0.2
SPIFFS アップローダープラグイン ver 1.0
の場合は、下図の様に Arduino IDE のボードマネージャの Partition Scheme を自分の好みのサイズに変更すればアップロードできると思います。

その他、古いバージョンでパーティションテーブルファイルを変更する場合は、以下の記事を参照してください。

ESP-WROOM-32 ( ESP32 ) SPIFFS メモリサイズを大きくする方法

また、パーティションテーブルを変更して、スケッチをコンパイル書き込みしても、1回目はうまく読み込んでくれない場合があります。
その場合、恐らく、SPIFFS アップロードが完全でない場合がありますので、再度、アップロードと、スケッチのコンパイル書き込みを実行してみてください。
私の場合、2回目がダメでも、3回繰り返してようやく正常に戻ったということがありました。
これの原因は謎です。

8.SPIFFS フラッシュメモリ内のデータが、正常に読み取らなくなってしまった

今まで正常に動作していたのに、急に、SPIFFS フラッシュメモリ内のデータが正常に読み取らなくなってしまうことがあります。
または、初めて、Arduino core for the ESP32 をインストールして、SPIFFS を使用しようとしたけど、データが正常に読み取ってくれない場合があります。

原因

GitHub の Arduino core for the ESP32 で、以下の Commits バージョンは、SPIFFS が正常動作しません。

●Commits on Jan 18, 2018 バージョン
●Commits on Jan 19, 2018 バージョン
●Commits on Jan 23, 2018 バージョン

対策

2018/03/05 時点では、2018/03/05 バージョンでは、不具合が修正されました。
Commits on Mar 5, 2018 バージョンをインストールしてください

因みに、正常に動作したバージョンをバックアップとして保存しておくことをお勧めします。
過去のバージョンに戻したい場合は以下の記事を参照してください。

旧バージョン Arduino – ESP32 のインストール方法

因みに、旧バージョンをインストールしたら、再度、SPIFFS アップローダーでファイルをアップロードし直し、スケッチをコンパイルし直してください。
SPIFFS フラッシュメモリのサイズアップをしている方は、それも忘れないでください。

9.今まで問題無かったのに、急に Wi-Fi ( WiFi )に繋がらなくなった

ESP32 ( ESP-WROOM-32 ) や M5Stack を Arduino core ESP32 で開発したり、ESP-IDF で開発していて、ある日、急に WiFiルーター(アクセスポイント)に接続できなくなることがあります。

原因その1

Wi-Fi ルーターやアクセスポイントの、DHCP ユーザー最大数をいつの間にか超えてしまっている可能性があります。

対策その1

ご自分の Wi-Fi ルーターの管理者設定画面で、DHCP ユーザー最大数を増やすか、接続されている不要な Wi-Fi機器の電源をOFFにしてください。
そして、Wi-Fiルーターの電源を消して再起動してみてください。


原因その2

Arduino – ESP32 でスケッチを何度も繰り返し書き込んでいたり、SPIFFS パーティションテーブルを変更したりしていると、Flash メモリの NVS 領域を壊してしまっている可能性があります。
また、ESP32 の STA モードがリセットできなくなっている可能性があります。

対策その2

GitHub の Issue で同じような悩みの解決方法が載っていました。
https://github.com/espressif/arduino-esp32/issues/653

このページの最後の方にある Arduino – ESP32 用スケッチをご自分のルーターの SSID とパスワードに書き換えて、コンパイル実行してみてください。

私の場合、以下の手順で進めました。

M5Stack で何度も Arduino – ESP32 でコンパイル書き込みしていて、ルーターをリセットしたら、ある日突然ルーター(アクセスポイント)に接続できなくなり、シリアルモニターに「…..」表示が延々と出ている状態になりました。

Arduino – ESP32 を最新版に入れ替えたり、ESP-IDF でコンパイルし直してもダメで、Arduino – ESP32 の「ツール」メニュー設定をいろいろ変えてもだめでした。
そこで、以下のスケッチのように、WiFiのSTAモード設定が書き込まれている Flash メモリの NVS 領域を初期化してみました。
(※これは自己責任で行ってください。これによるトラブルは一切責任を負いません)
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

#include <nvs.h>
#include <nvs_flash.h>

void setup() {
  Serial.begin(115200);
  int err;
  err=nvs_flash_init();
  Serial.printf("nvs_flash_init: %d\n" ,err);
  err=nvs_flash_erase();
  Serial.printf("nvs_flash_erase: %d\n" ,err);
}
void loop() {
}

これで、再度、WiFiスケッチを書きこんでみてください。


原因その3

上記のNVS領域を初期化しても直らない場合、以前のWiFi環境設定がまだフラッシュに残っていて、それが悪さをしている可能性があります。

対策その3

WiFi.disconnect(true);
または、
WiFi.disconnect(true, true);
という関数を
WiFi.begin(ssid, password);
の前に、置いてみてください。

WiFi.disconnect(true);
WiFi.begin(ssid, password);

これで、ESP32 のWiFi環境設定がリセットされるものと予想されます。
これで、スケッチをコンパイル書き込み実行してみてください。
それでも、繋がらない場合は、もう一度NVS領域を初期化してみてください。
(※これは2019/10/12時点の方法です)


原因その4

Arduino core for the ESP32 の Serial.begin 関数を2重使用していると、WiFi接続できなくなるようです。

対策その4

私の自作ライブラリで、AP_Connect関数を使うと、中には Serial.begin を使用しているものがあります。
ESP8266 を使用していた昔は問題無かったので、それを ESP32 で流用していました。
ライブラリ内の関数の Serial.begin関数をコメントアウトするか、スケッチ上の Serial.begin関数を消去するなどの対策をしてみてください。
今後、私の自作ライブラリでは、関数内に Serial.begin を置かない様に修正していきます。
(2018/06/07時点)


原因その5

スケッチ(プログラムソースコード)内でSRAMを使い過ぎていると、WiFi接続する時のメモリが足りなくなって、WiFiアクセスポイントに接続できなくなる場合があります。
例えば、softAPモード(ESP32自身がアクセスポイントになるモード)のプログラミングで、画像処理用の配列定義して、膨大な要素数を確保してしまった場合、SRAMを大幅に消費しています。
それで更にCameraデバイスを使って、DMA (Direct Memory Access)やI2S, SPI, I2C などの通信を使うと、一時的にSRAMを多く消費するようです。
自分の意図したこととは別に裏で多くのSRAMを消費しているわけです。
そんな状態ではWiFiコネクション確立できない場合があります。

対策その5

スケッチ内の配列要素数や、ヒープメモリを減らす。
そして、setup関数内で、出来るだけ早い段階で、WiFi.begin関数を使ってWiFi初期化を済ませ、その後にCameraデバイス等の重いプログラムを実行させるようにすることです。

また、カメラデバイスを使ってWiFiストリーミング転送する様なSRAMを多く消費する場合は、PSRAM付きのESP32やM5Stackを使って、画像メモリをPSRAMへ移すようなプログラミングをするなどの方法があります。

10.エラーや警告が全く出ないのに、プログラムが動かない

Arduino IDE で、エラーや警告が一切出ないのに、プログラムが全く動作しないことがありました。

原因

過去、私の経験では、Arduino – ESP32 で、SPIFFS ファイルシステム使用時に、Serial.begin関数を重複使用すると、そこから先のプログラムは一切動きませんでした。
特に気を付けなければならないのは、ライブラリを自作しているとき、Serial.begin を複数の関数に入れ込んでしまうと、重複使用していることに気が付かないことがあります。
Arduino – ESP8266 では特に問題無く、Arduino – ESP32 では SDカードを使う時には問題ありませんでした。
SPIFFS を使う時に、この症状が出ました。

対策

Serial.begin 関数は、プログラムに1度だけ実行するように、ライブラリやスケッチを修正する。

【目次ページへ】

コメント

  1. H.W より:

    mgo-tecさん、H.Wです。
    本件記事中の’ESP32トラブルシューティング’の件で、以下ご教示下さい。

    M5stackで当初からスケッチの書込み時に’connecting…—…—…’が永遠に継続し、取りあえずその対処方法として、BOTTOM基板コネクタのRSTとGND間に1.5〜3.3μFのコンデンサを挿入し、この対処法で1ヶ月程継続対応して特に問題なかったのですが、ー昨日、スケッチ書込み時に突然画面が消え、その後リセットを何度繰り返しても全く再起動しなくなってしまいました。。。

    考えられる原因として、BOTTOM基盤の勘合が当初から多少緩く、接触不良or外れていた可能性があります。また、例のマグネット式USBケーブルの接触不良で書込み時の電圧が低下していた可能性もあります。

    目下、購入元のスイッチサイエンスにもこれ迄の経緯も含め、その旨対処方法を問い合わせ中ですが、目下のところ回答が貰えていません…

    この様な状態になってしまったら、ファームウェアを書き直す以外に方法はないのでしょうか?
    またファームウェアを書き直す場合、具体的な手順はどうしたらいいのでしょうか?

    ご多忙中、誠に申し訳ありませんが、ご教示頂けると幸いです。

    • mgo-tec mgo-tec より:

      H.Wさん

      それはそれは面倒なことになりましたね。
      私にも正直分かりませんが、H.Wさんがおそらくおっしゃる通り、スケッチ書き込み中に電源が落ちたということは、ファームが壊れた可能性大ですね。
      粗悪 USB ケーブルは思いのほかインピーダンスが高く、瞬時大電流で思いのほか電圧降下するので、それが原因の可能性もありますね。
      ファームの書き換え方法については私はよく知りませんが、ネットでは情報が沢山あると思います。
      早く治って欲しいですね。

      因みに、私の M5stack で Windows10 環境の場合、最近はUSB書込みに苦労することはありませんでした。
      もしかしたら、H.W さんの今までの書き込み不良はUSBケーブルだったということも考えらそうな気がします。

      ということで、あまりお役に立てる回答ができず申し訳ございません。

  2. H.W より:

    mgo-tecさん、
    早速のご連絡有難うございます。

    実は諸般の事情から、IDE用の基幹PCはWindows7を使用しており、一応USBシリアルドライバはCP2104の最新版とはなっていますが、スケッチ書込が上手く行かない主原因はこの環境のせいではないかと思っています。

    尚、ESP32のファームウェア書込みツール(flash_download_tooles_v3.6.4_0)を以前DLしていたことを思い出し、試しにGithubでM5cloud用のfirmwareは直ぐに見つかったので、これを上記ツールで書き込んで起動&リンクさせることはできましたので、少なくともCPUは死んでいないことは確認できました。

    しかし、どういう訳かm5stackの’工場出荷時firmware’が、思い付くリンクの何処をどう探しても見つかりません。
    (最初に出荷時状態をバックアップしておけばよかったのですが、それを怠ったことが悔やまれます。。。)

    尚、スイッチサイエンス側からは未だ回答がなく、どうも技術的なサポートはされない様なのでちょっと期待薄です。

    もし、工場出荷時firmwareの所在情報等でご存知な事がありましたら、宜しくお願い致します。

    • mgo-tec mgo-tec より:

      申し訳ございませんが、ファームのある場所は知りません。

      私の場合は、ESP32が起動しなくなった時、ファームを書き替えた経験はありませんので、やり方を知りません。
      私は、以下の記事
      ESP32 ( ESP-WROOM-32 , M5stack )自分的 トラブルシューティング まとめ
      の、9番項目の「原因その2」に書いてあるように、Flash の NVS領域を初期化して、最新版 Arduino – ESP32 を入れ直したら、いつの間にか起動できるようになっていた経験があります。
      あまり参考にならないかも知れません。

  3. H.W より:

    mgo-tecさん、
    ご多忙中、煩わしい問い合わせをしてしまい誠に申し訳ありません。

    取りあえずCPUが無事だったことは分かり、M5Cloudのfirmware導入でWeb上のIDEを経由してMicroPythonでプロジェクトが組めたり、既にご存知かもしれませんが、microSDに保存された複数のアプリを自由に切り替えて実行できる、’M5stack_MultiApp_Advance_Firmware’なる素晴しいファームがUPされている事も発見できましたので、結果オーライといったところです。
    (これで必ずしも元のfirmwareが必要ということは無くなりました。。。)

    尚、その後ハード面ではPROTO基板を手に入れ、
    1)RSTとGND間に電解コン(3.3μF)を追加。
    (多少容量が大きいですが、手元に実装できる小型コンデンサがこれしか無かったのと、経時変化で容量が最悪半減するだろう事を想定して良しとしました。)
    2)手持ちのLipo電池(860mAh)を裏側に追加。
    (並列接続するのはあまり良くないとされてますが、BOTTOM基板に実装されてる150mAhと合せて1100mAhまで増量。これで、5時間以上の連続動作が可能となりました。。。)
    3)バッテリーモニタ回路を追加。
    小型LED、チップTr(2SC2712)、チップ抵抗(470, 10k)、半固定ボリューム(5k)で回路を組み、本体側の既存穴からモニターできるようにしました。
    (Lipo電池が3.3Vまで低下したらLEDが消えるように、BE間のボリュームで輝度を微調整。尚、使用しない時は完全消灯できる様に小型SWも一応実装。)

    しかしながら、PROTO基板は高さ制約が厳しく、実質チップ部品でないと、自由な配置の回路実装はかなり難しいですね…

    • mgo-tec mgo-tec より:

      H.Wさん

      いえいえ、あまりお役に立てずスミマセン。
      私も思っていたのですが、必ずしも工場出荷時のファームは必要ないと思っています。
      ですから公開しているサイトが無いんでしょうね。
      CPUやその他の回路が生きてさえいれば、Arduinoスケッチが流し込めるのではないかと、個人的に勝手に思っています。

      バッテリーモニタはイイですね。
      私もいつかバッテリー監視ICで回路を組んで、マウントしたいと思っていました。
      というか、M5StackにはそのICが積まれているので、データシートを見れば、どこかにバッテリーモニター出力がありそうな気がします。

      ということで、いつもコメントありがとうございます。
      なにか面白いものができるといいですね。

  4. amisuke1701 より:

    初めまして、amisuke1701と言います。

    「9.今まで問題無かったのに、急に Wi-Fi ( WiFi )に繋がらなくなった」、大変参考になりました。私も突然wifi接続ができなくなり焦っておりました。残念ながらこちらの手順を試しても復旧せずあきらめていたところ、以下手順で復旧しましたので参考に掲載します。

    無線ルーター(Aterm WG2600HP)
    暗号モードをWPA/WPA2-PSK(AES) => WPA2-PSK(AES)に切り替える
    これで復旧しました。暗号モードを戻しても問題なくなりました。
    原因は不明で、復旧理由も不明ですw。

    以上、参考までに。

    • mgo-tec mgo-tec より:

      amisuke1701さん

      記事をご覧いただき、ありがとうございます。

      それは新しい手法ですね。
      これはルーターとのコネクションに何らかのバグがあるんでしょうか?
      いずれにしても、貴重な情報ありがとうございます。

      Twitter でもこの情報を流しておきますね。
      もしかしたら、悩んでいる方々の解決につながるかもしれません。

      有難うございました。
      m(_ _)m

  5. Masaki より:

    はじめまして!

    とても参考にさせていただいています。

    下記、私も同じ現象でした・・・
    このブログを見なかったら、意味がわからず途方にくれるところでした。


    M5Stack 側の USB-TypeC では、挿し込み方向によって、パソコン側がCOMポートとして認識しないことがあります。
    M5Stack 付属の USB-TypeC ケーブル、または M5Stack 側のUSB-TypeCポートの結線に問題がありそうです。
    (詳しく調べていませんが、私の場合、上下逆に挿し込むと認識しないことが確認されています。)

    • mgo-tec mgo-tec より:

      Masaki さん

      記事をご覧いただきありがとうございます。
      無事に動いて良かったですね!
      そう言っていただけると作った甲斐があり、嬉しいです。
      (^^)

  6. リュウ より:

    ——————————————————————-
    14.「○○.h」に対して複数のライブラリが見つかりました。というメッセージが出て、コンパイルできない
    例えば、Arduino IDE のコンパイルを実行して、

    「WiFi.h」に対して複数のライブラリが見つかりました
    というメッセージが出て、コンパイルできないことがあります。
    ——————————————————————-

    ⇒14番について、私も同じ現象でした。そちらのパタンに該当するかかどうかは分からないですが、一応情報共有させていただきます。
      「WiFi.h」に対して複数のライブラリが見つかりました

    僕はWINDOWS 10を使っています。
    最初僕はWindows Installer版しか使っていないです。何も問題ありません。その後、Windows app版をインストールすると、上記ライブラリ重複エラーが発生してしまいました。
    解決方法はWindows Installer版をアンインストールしかできないようです。(※Windows app版のアンインストールは解決出来ていなかったです)

    • mgo-tec mgo-tec より:

      リュウさん

      ブログにお越しいただき、ありがとうございます。

      Windows Installer版やapp版とは、Arduino IDEのことですか?

    • 通りすがりものです。 より:

      リュウさん
      私も全く同じ状態にハマり、ライブラリのincludeの重複が無いことも確認したのですがエラーが消えず、PCを再起動したらエラーはでなくなりました。
      原因不明で気持ち悪いですが、参考までに。

  7. とんかつ より:

    問題30.
    (Guru Meditation Error: Core 0 panic’ed (LoadProhibited). Exception was unhandled.)
    に関連して。
    こんにちは
    ESP-IDFで書込み、ESP32Webラジオを聴いています。
    プログラムの中に
    ホスト局のURLを記述してる「playlist」ファイルが有るのですが、
    この記述様式が、「デフォルト」状態の様式から逸脱していると
    このエラーが出る様です。
    ホストのURL追加したり削除したりするとき
    うっかりこの「様式」を外して仕舞う場合が有ります。
    この、「誤記」に気づけないと・・・
    make flash
    しても、中で再起動を繰り返してパニクり「訳が解らん・・」となりますが
    現象の直前の自分の行いとコマンドプロンプトのモニタ出力を
    観て、この「誤記」に気づき、修正で正常動作に戻りました。
    「グルの瞑想エラー」は、お遊びの「命名」らしいです。
    モニタでこの記述を観ると、『一瞬、何が起きたのか!』と
    思いますが・・私のケースでは
    その原因は、「playlist」ファイルの中の単なる「誤記」でした。

    • mgo-tec mgo-tec より:

      とんかつさん

      トラブル対処のコメントありがとうございます。
      悩んでいる読者の方々に助けになると思いますので、トラブルシューティングにコメントリンクという形で反映させて頂きますね。
      感謝、感謝です。
      m(_ _)m

  8. 通りすがり より:

    はじめまして。

    >以下の記事を参照して、Wire.begin関数を含めた全ての Wire関連関数を同じタスクに置いて下さい。

    これは過去の情報でしょうか。

    • mgo-tec mgo-tec より:

      通りすがりさん

      記事をご覧いただき、ありがとうございす。
      そのとおり、もう随分前の過去の情報です。
      この記事の1年くらい更新しておりません。
      スミマセン。
      m(_ _)m

  9. 通りすがりの開発初心者 より:

    こんにちは
    Compilation error: WiFi.h: No such file or directoryというえエラーが発生し、先に進むことができません。

    • mgo-tec mgo-tec より:

      通りすがりの開発初心者さん

      ブログをご覧いただきありがとうございます。

      ただ、頂いた情報だけでは私は何も判断できません。
      以下の情報を教えてください。

      1.使っているマイコンは何か?
      2.Arduino IDEのバージョン
      3.Arduino core for the ESP32 のバージョン
      4.何を実行した時にそのエラーが出現したか?

      あと、現在、このブログでのESP32やM5Stackの記事更新はしばらく停止中です。
      私自身もしばらく触っておりませんので、最近の情報は分らないことがあることをご了承ください。

  10. Polinky310 より:

    こんにちは
    急にESP32がWiFiに繋がらなくなり、予備機に交換したら動きます。
    当ESP32は故障で、販売元に文句を言って廃棄かな…と思っておりましたが、
    当記事を見つけてRTSのリセットをしてみました所、うまく動くようになりました。
    これで廃棄せずに済んだのと、今後も発生したであろう現象を回避することが
    できました。
    大変お世話になりました。ありがとうございました。

    • mgo-tec mgo-tec より:

      Polinky310さん

      記事をご覧いただき、ありがとうございます。

      現在はESP32やM5Stackは使っていなくて、この記事も更新しておらず、だいぶ古くなってしまいました。
      私はいろいろすっかり忘れてしまい、RTSって何だっけ? という状態でしたが、何はともあれ、廃棄せずに動いて良かったですね。
      この記事もそろそろオワコンで、削除しようかなと思っていたところです。
      おかげ様で、まだ利用がありそうなので、しばらくこのままにしておこうと思います。
      こちらこそコメント頂き、ありがとうございま~す!
      m(_ _)m

タイトルとURLをコピーしました