4M ( 3M SPIFFS ) をシリアルポートでアップロードできない場合のトラブルシューティング( ESP-WROOM-02 ESP8266 )

記事公開日:2016年7月6日
最終修正日:2017年5月24日

スポンサーリンク

スイッチサイエンスさんのESPr Developerは、ボードに表示してあるマークで、Rev.2 とあるものは4M/3MシリアルUSBアップロードできますが、無表示やRev.3は4M/1Mまでしかアップロードできません。
スイッチサイエンスさんで現在販売しているものはRev.3ですので、4M/3M SPIFFSアップロードしたい場合はOTAしかありません。
こんな表示です。
Wroom_Rev2

また、今までOTAでアップロードできていたのに急にできなくなった場合はpythonのパスが通っていない場合があることが分かりました。以下をお読みいただき、Windowsのシステムの詳細設定の環境変数を確認してみてください。

その他、OTAアップロード時にパソコンのUSB給電だけでは電流が足りない場合があります。その場合ESPr Developerをモバイルバッテリーなどの電流容量が大きいものに接続するとアップロードできる場合があるそうです。

今回は、私が何度も遭遇した ESP-WROOM-02 ( ESP8266 ) SPIFFS ファイルシステムアップローダーのトラブルシューティングについてです。

Arduino IDE 1.6.8 では フラッシュ設定を 4M ( 3M SPIFFS )にするとシリアルポートではアップロードできないことは分かっていました。
それを解決する方法はArduino IDE 1.6.9 にすれば問題なくアップロードできると思ってました。実際にそうすれば出来たんです。

しかし、今回、もう一つ別のESPr Developer ( ESP-WROOM-02 開発ボード )にしたら、なぜかシリアルポートでアップロードすると、こんなエラーが出ます。
4M3MspiffsTrouble01

warning: espcomm_send_command: didn’t receive command response
warning: espcomm_send_command(FLASH_DOWNLOAD_BEGIN) failed
error: espcomm_upload_mem failed
SPIFFS Upload failed!

つまり、IDEとESP8266との通信でコマンドのやり取りが上手くいってないということですね。
前のバージョンのESP8266ボード設定が残っているせいかと思ってこちらの記事にあるようにArduino15フォルダを削除してIDEを再インストールしてみたりしてもダメでした。

GitHubのArduino core for ESP8266 WiFi chip ページの中のSPIFFS Issue ページでもその議論が沢山あったのですが、根本的な解決策が出ていないようでした。

いろいろと試した結果、一番確実な解決策は以前の記事でも取り上げたOTA機能を使ってアップロードすることが現時点で最良のトラブルシューティングという結論に至りました。

改めて、その方法を紹介しておきます。
ちなみに、ここではWindows PCの方法しか紹介できません。残念ながら私はMacを持ち合わせておりませんのでご了承ください。

※OTAアップロードではWi-Fi経由でアップロードします。
ですから、Wi-Fiルーターが必要です。予めSSIDやパスワード設定は済ませておいてください。 そして、Wi-Fiルーターを立ち上げておいてください。

1.Arduino IDE に ESP8266 ボードと SPIFFS ファイルシステムアップローダーをインストールしておく

Arduino IDE は Arduino.cc ページの 1.6.12 が推奨です(2016/10/20時点)。
ESP8266ボードは現在のバージョンは 2.3.0 です。
このインストール方法はこちらのページをご覧ください。
古いバージョンの設定が残っているとエラーになる場合がありますので、そのページにあるようにArduino15フォルダを削除してから再インストールしてください。

SPIFFSファイルシステムアップローダーの現在のバージョンは 0.2.0 です。
こちらのインストール方法はこちらのページをご覧ください。

2.Pythonをインストールする

汎用プログラミング言語の Python をインストールします。
正直、私はこのPythonは全く分かりませんので説明できません。
ただ、このOTA機能を使うにはこれが必要なのです。

まず、以下のリンクのページを開いて、Pythonをダウンロードします。
2016/7/6時点でバージョン2.7.12の方をダウンロードしてください。
https://www.python.org/downloads/

ページの様子は以下のような感じです。
4M3MspiffsTrouble02

3.5.2の方では動作しないようですので、注意してください。

ダウンロードしたら、python-2.7.12.msiファイルをクリックします。
4M3MspiffsTrouble10

すると以下のような画面が出てきますので、Install for All users をクリックしてください。
これは自分のPCが他のすべてのユーザーにpythonが使えるようにするということです。
その後Nextを押して次へ進んでください。
4M3MspiffsTrouble11

すると、以下のような画面が出ますので、デフォルトで良ければ次へ進みます。
違うフォルダにしたい場合はパスを設定してください。
4M3MspiffsTrouble12

次の画面が大事なところです。
Add python.exe to Path の赤い×のところをクリックしてください。
4M3MspiffsTrouble13

すると、以下のような画面が出てきます。
とりあえず、
Will be installed on local hard drive
を選択すればOKです。
これはローカルドライブにインストールされますよ、ということです。
下の Entire feature … はすべての機能をインストールしますよ、という意味ですが、とりあえず、一部だけでもOKです。
これを飛ばすとOTAが動きませんので注意してください。
これはインストールした python.exe のあるフォルダにWindowsのPathを通すということですのでとても重要です。
これを飛ばすとOTAが動作しませんので注意してください。
4M3MspiffsTrouble14

インストールが終わったら以下の画面が出ますので終了してください。
4M3MspiffsTrouble15

その後にWindows を必ず再起動してください。
私は再起動せずに使っていて、OTAが動作しなくて、永遠にハマったことがありますので要注意です!!!
SPIFFS Upload failed! というエラーが出たらここが注意するポイントです。

それでもWindows10で再びOTAアップロードできなくなった場合の対処方法

パスを通してインストールしたのにも関わらず、パスが通っていないことがありました。これは何故だかわかりません。 おそらく、pythonのインストーラーがバグっている可能性があるのでしょうか? その場合は以下の手順でパス(Path)を通してください。

1.Windowマークを右クリック

4M3MspiffsTrouble16

2.システムをクリック

4M3MspiffsTrouble17

3.システムの詳細設定をクリック

4M3MspiffsTrouble18

4.環境変数をクリック

4M3MspiffsTrouble19

5.Pathを選択して編集をクリック

4M3MspiffsTrouble20

6.新規をクリック

4M3MspiffsTrouble21

7.pythonのpathを入力

下図の様にPathに先ほどインストールしたpythonのローカルフォルダパスを入力します。 デフォルトでは C:\Python27 です。 4M3MspiffsTrouble22 全て入力したら、ウィンドウのOKをクリックして全て閉じればパス通し完了です。

3.Arduino OTA の Basic OTA スケッチをコンパイルする

Arduino IDE を再起動したら、サンプルスケッチの Basic OTA を開きます。

Shinonome10

次にこのスケッチの以下のところをご自分のWi-FiルーターのSSIDとパスワードに書き換えます。

Shinonome11

次に、名前を付けて保存しておきます。

次に、その保存したスケッチのフォルダを開きます。

4M3MspiffsTrouble03

フォルダを開いたら、下図のように data という名前のフォルダを新規に作成します。
Shinonome12

そのデータフォルダの中にESP-WROOM-02 ( ESP8266 ) のSPIFFSフラッシュにアップロードしたいファイルをコピーしておきます。
例えば、こんな感じでコピーしておきます。
4M3MspiffsTrouble04

その後、BasicOTAスケッチをUSBシリアルポートでコンパイル書き込みします。

次に、大事なのは、Arduino IDE を再起動します。
これをしないとOTAが使えませんので注意してください。

4.OTA機能でSPIFFSファイルをアップロードする

Arduino IDE を再起動して、保存したBasicOTAを開いたら、下図のようにシリアルポートの中にESP8266のWi-Fiポートがあるので、それをクリックして選択します。

4M3MspiffsTrouble05

次にいよいよ予めインストールしておいたSPIFFSファイルシステムアップローダーでdataフォルダに保存したファイルをアップロードします。
4M3MspiffsTrouble06

(ここで、上手く書き込めない場合は、再度IDEを再起動してみてください。
シリアルポートにESP8266のIPポートが無ければ、再度シリアルUSB経由でBasicOTAファイルをコンパイル書き込みしてみてください。)

SPFFSアップロード中は書き込み中はこういう画面になりますが、進行具合は全然わかりません・・・。

4M3MspiffsTrouble07

書込み終了したらこんなメッセージが出ます。

4M3MspiffsTrouble08

5.普通にシリアルUSBでスケッチをコンパイルする。

以上が終わったら、その後は普通にコンパイルしたい対象のスケッチをシリアルCOMポート( USB ) で選択してコンパイル書き込みしてください。

今回は以上です。
やはり、ESP-WROOM-02 でも個体差があるのでしょうか・・・。
OTAを使わなくてもシリアルで3Mでアップロードできるものとできないものがあるようです。
結局、OTAでアップロードした方が確実かもしれません。
その他の対処方法があったら是非教えていただきたいものです。

ではまた・・・。

mgo-tec電子工作 関連コンテンツ ( 広告含む )

スポンサーリンク

Amazon.co.jp 当ブログのおすすめ



投稿者:

mgo-tec

Arduino, ESP8266, ESP-WROOM-02 等を使って、主にスマホと連携した電子工作やプログラミング記事を書いてます。ライブラリも作ったりしてます。趣味、独学でやってますので、動作保証はしません。 電子回路やプログラミングの専門家ではありません。 畑違いの仕事をしてます。 でも、少しだけ電気の知識が必要な仕事なので、電気工事士や工事担任者等の資格は持ってます。

「4M ( 3M SPIFFS ) をシリアルポートでアップロードできない場合のトラブルシューティング( ESP-WROOM-02 ESP8266 )」への13件のフィードバック

  1. 初めましてOTAでの書き込みについてこのサイト様を参考にさせて頂いております。
    一つの点で悩んでいるのですが、このサイト様に記述してある通りの注意事項をいくつか確認したのですが、ツール→シリアルポート選択のところにNetworkPortsが現れません。 この問題が起こりうる原因として、どのような問題がありますでしょうか?

    1. iectecさん

      お返事遅くなり、すみません。
      次のことを確認してみてください。

      1.サンプルスケッチのBasic OTAをコンパイル書き込みしたら、一旦Arduino IDEを閉じて、再度起動してみてますでしょうか?

      2.Python のPathが通っていますでしょうか?
      Windowsでこれを確認するには、コマンドプロンプト(管理者)を開いて、pythonと入力してみてください。
      Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:19:22) [MSC v.1500 32 bit (Intel)] on win32
      Type “help”, “copyright”, “credits” or “license” for more information.
      >>>
      みたいに表示されればOKです。

      3.Basic OTAスケッチのSSID、パスワードをご自分のルーターのものに書き換えてますでしょうか?

      4.ご自分のルーターでESP-WROOM-02がアクセスできるように設定できていますでしょうか? 例えば、最大アクセス数を超えてしまっているとか、MACアドレスフィルタリングがかかっているとか・・・。

  2. 私も SPIFFS Upload failed! が出て書き込めず悩んだ事がありました。
    私の場合は、SPIFFSをUSBハブ経由で書き込んでいたものを、USB直結にしたら正常に書き込めました。
    スケッチはUSBハブ経由でも正常に書き込めていたので、なかなか
    気が付かなかったのですが、ふと試しにUSBハブを使わずに書き込んでみたところ、すんなり書き込めてしまいました。
    USBハブを使っている方は一度試されると良いかもです。

    1. obiwanさん

      コメントありがとうございます。

      そうそう、OTAアップロードに関しては電流量が問題になりますので、パソコン直挿しか、1A以上のUSB-ACアダプターか、モバイルバッテリー電源にしないとアップロードできないようです。
      USBハブは電流量が足りませんので気を付けた方が良いですね。
      私もハマリました。

      シリアルUSB場合は、ESPr Developer に関しては、Rev印なし、Rev.3 両方とも、パソコンにUSB直挿しでやっていますが、アップロードできませんでした。
      Rev.2では書き込みできるようです。。
      今は、有線シリアルの4M/3Mアップロードは諦めています。
      もっぱら、OTAアップロードができているので、いいかな・・・、と思ってます。

  3. 大変参考になり、SPFFSのOTAでのアップロードがうまく行きました。
    「SPFFSアップロード中は書き込み中はこういう画面になりますが、進行具合は全然わかりません・・・」と、ありますが、Serialを繋いでおくと、Serialの方に、進行状況が出力されますよ。
    SoftwareSeriarlの設定がされていると、そちらにも出力されるみたいです。

    1. 大室さん

      コメントありがとうございます。
      なるほど、そういえば、BasicOTA のサンプルコードにはSerial.print がありますね。
      シリアルモニターには出力できませんが、他のシリアル機器に出力できますね。
      シリアルUSB変換を介してパソコンへ出力できそうですね。

  4. 家にWi-Fiルーターがないときは、BasicOTAを書き換えてsoftAPIPで動作させてノートpcとESP8266を直接接続しても書き込めました。

    const char* ssid = "..........";//←SSIDの設定
    const char* password = "..........";//←パスワードの設定
    
    void setup() {
      Serial.begin(115200);
      Serial.println("Booting");
    //  WiFi.mode(WIFI_STA);←コメントアウト
      WiFi.mode(WIFI_AP);//←追加
    //  WiFi.begin(ssid, password);←コメントアウト
      WiFi.softAP(ssid, password);//←追加
    /*  while (WiFi.waitForConnectResult() != WL_CONNECTED) {←コメントアウト
        Serial.println("Connection Failed! Rebooting...");
        delay(5000);
        ESP.restart();
      }*/
    //↓省略
    
    1. カンパニーさん

      とても有益な情報ありがとうございます。
      なるほど! softAP モードでOTAという方法がありましたか・・・。
      これは思いつかなったです。
      もう、これから将来はUSBケーブルを使わず、OTAの時代になってくると思います。
      この機能を存分に生かしたいですね。
      情報ありがとうございました。
      m(_ _)m

  5. USBシリアルで書き込めました!(自分の環境でしか検証していません)
    https://github.com/esp8266/arduino-esp8266fs-plugin/issues/12(英語ページ)を参考にして。
    下記のように2つのファイルの内容を書き換えました。
    ただし、SPIFFSに書き込める最大容量がほんのわずかに減るみたいです。

    “C:\Users\\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\boards.txt”ファイルの
    169行目”generic.menu.FlashSize.4M3M.build.spiffs_start=0x100000″を”generic.menu.FlashSize.4M3M.build.spiffs_start=0x108000″に書き換え
    171行目”generic.menu.FlashSize.4M3M.build.spiffs_blocksize=8192″を”generic.menu.FlashSize.4M3M.build.spiffs_blocksize=4096″に書き換え

    “C:\Users\\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\ld\eagle.flash.4m.ld”ファイルの
    14行目”PROVIDE ( _SPIFFS_start = 0x40300000 );”を”PROVIDE ( _SPIFFS_start = 0x40308000 );”に書き換え
    17行目”PROVIDE ( _SPIFFS_block = 0x2000 );”を”PROVIDE ( _SPIFFS_block = 0x1000 );”に書き換え

    1. なぜかわからないけど書き込みに失敗することもありました。
      失敗した→一度OTAでSPIFFS書き込み→シリアルでSPIFFS書き込み→成功
      ってこともありました。
      なんか不安定です。

      1. カンパニーさん

        コメント有り難うございます。

        昨日やっと発売されたばかりのESP-WOOM-32の記事を書き上げたばかりですので、今度試してみたいと思います。

  6. OTA機能でSPIFFSファイルをアップロードする時、ESP-WROOM-02開発ボードを使用せず、IO0(Upload_SW)と RST(RESET_SW)でのUSBで書き込みを行う場合のボードでは、OTAモードでのアップロード時は IO0_SW RST_SW 共何もしない状態でそのまま書き込むのが分からず、苦労しました。python-2.7.13.msi を使用してます。
    他の方に参考になればとコメントしました。

    1. 太田さん

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

      なるほど・・・。
      ボードによっていろいろ違いがあるんですね。
      私は、ESPr Developer ( ESP-WROOM-02開発ボード )以外のボードで OTA はやったことが無いので何とも言えないのですが、この情報が他の方々の役にたってくれるといいですね。
      情報ありがとうございます。
      m(_ _)m

コメントを残す

メールアドレスが公開されることはありません。

*画像の文字を入力してください。(スパム防止の為)