macsbug

Just another WordPress.com site

ESP8266 of error message

with 7 comments

ESP8266 で シリアルモニターにエラーメッセージがでる事があります。    2016.06.20

例:ets Jan 8 2013,rst cause:4, boot mode:(1,7)

まとまりが無いかも知れませんが この意味やクラッシュする件を調べてみました。


1. rst cause:4 は watchdog reset 状態であった事を示します。
_  
_ 例: reset cause 1: normally during a Power-On-Reset or by CHIP_PD transient
_    reset cause 2: normally during a reset caused by a nRESET transient
_    reset cause 4: normally during a reset by wet reset

 

2. boot mode:(1,7)について
_ 1:boot mode が Uart mode(GPIO15=0V, GPIO0=0V, GPIO=2=3.3V)であった。
_  

 

_ 7:SDIO HighSpeed V2 IO であった事を示します。
_  

(1,7) 又は (x,y)の詳細:
x:GPIO15(MTDO), GPIO0, GPIO2 low bit の状態。
y:Boot sel と SD sel の状態。使用されたブートファイルの場所。
y ( Boot selと SD sel ) の意味:
_ 7:SDIO HighSpeed V2 IO Uart1 Booting
_ 6:SDIO LowSpeed  V1 IO Uart1 Booting
_ 5:SDIO HighSpeed V1 IO Uart1 Booting
_ 4:SDIO LowSpeed V2 IO Uart1 Booting
_ 3:FLASH BOOT
_ 2:Jump Boot
_ 1:UART Boot
_ 0:Remapping


参考:esp8266 / Arduino:rst cause, boot mode :Boot Messages
参考:esp8266/esp8266-wiki:ESP Boot Modes,(x,y):Boot Messages x,y
参考:esp8266 Сообщество:ESP8266 Pins list function, register, strapping:Boot Sel
参考:Richard’s stuff:ESP8266 BOOT PROCESS
参考:Zoetrope:Tech Blog:Bootloader Modes and GPIO state on Startup
_   起動時のGPIO状態:(以下画像を参照させてい頂きます)。
_   GPIO 0は 起動時に出力になり 起動40ms後にGPIO0ラインは
_   約100ms間 約350Hzの信号が出力される。
_   
参考:themadinventor/esptool:Boot log:ブート時のUARTログ


他の例:
rst cause:2, boot mode:(1,6) <– reboot by reset pin – Mode Uart
rst cause:4, boot mode:(1,6) <– reboot by watchdog – Mode Uart
rst cause:2, boot mode:(3,7) <– reboot by reset pin – Mode Flash (boot the sketch)


ハードの確認:
_ 基本:ESP8266のPin 15(GPIO15), 0(GPIO0), 2(GPIO2)をオシロスコープで波形
_  を観測し論理的に外部的な要因か内部的な要因かを判断します。瞬間的な変化
_  は見れませんがテスターで電圧を測る方法もありますね。例外として他のピン
_  の状態で誤表示する場合もあります。
_  前提条件としてPCのUSB電源が充分(電圧、電流、リップル)である事を確認す
_  る必要もあります。

_ 回路図から学ぶ:再起動を実行させるスケッチでは 起動が正常に行われる回路に
_  なっているか回路を再検討する必要もあります。 例:3V3,RST,EN 端子に
_  正常な起動を行う事が出来る素子が接続されているかです。 これには 基板の
_  回路図を幾つか入手し 違いを比べる事で理解が深まると思います。
_  最強の基板は 回路技術とレイアウト技術を基に 技術的な検討をかなり行った
_  回路になっています。

_ ブレッドボード:試作で使用するには良いでしょうが 完成時には使用せず基板に
_  組む方が良いかと思います。   理由:ブレッドボードの中味は画像の様に
_  金属板が幅広く隣り合いアンテナの様になり電気的に不安定な要素になります。
_  

補足:原因や理由が不明な場合は「大きなコンデンサー」を追加とか 「個体差」等の
_  単語や「配線の長さを気にしない」とか がでてきそれで終わらせてしまいます。
_  解決する方法は 基本から調べる事が必要かと思います。
_  それには レイアウトや回路図の検討や 信号を必ず見るという事が必要です。


基板と回路図から分析できる資料。
MegaTech ELECTRONICS : ESP-WROOM-02 starter board
_ 出力電流ナンバーワンの電源でFuse 1個とポリスイッチ1個、USB回路には
_ 静電対策の保護回路(ポリスイッチ2個)がありボードとPC側の安全性も考慮。
_ ボルテージディテクタ(BD48K31G-TL)がありRESET信号を作る。
_ RST端子に C5 1000pFあり。 2016.06.23 誤記訂正(7of9さん ありがとうございます)。
_ 電源端子に C6 10uF あり。
_ 電源容量(AP3417CK)は1000mAです。価格は2200円。
SwitchSienceESPr Developer
_ RST端子に起動用コンデンサー なし。
_ 電源容量(XC6222)は 700mAです。  価格は2310円。
WeMos.ccd1 mini
_ RST端子に C9 100nF あり。
_ 電源容量(RT9013)は 500mAです。  価格は 423円。


補足:追記 2016.06.25
起動時のGPIO_0とGPIO_2の波形:色がついて面になった所は1/0の波形。
_ GPIO_0 の波形は起動時に 2V の電位が生じその上に信号が出力されています。
_ GPIO_2 も起動時に信号が出力されます。


スケッチの確認: 問題点と対策を以下に要約。追記 2016.06.25
sparkfun:ESP8266 Thing Hookup Guide の記事に注目する。
_ ESP8266とArduinoの大きな相違点は、バックグラウンドでのユーティリティ
_ 機能の多くを実行する。たとえば、WiFi接続の維持でTCP/IPのスタックを
_ 管理しながら他の動作を実行する。動作開始からこれらの機能をブロックする
_ ESP8266がクラッシュする、という事らしい。
_ これを回避するにはスケッチ内のループを遮断する必要がある。
_ 具体的には delay() yield() の追加でバックグラウンドの機能を実行できる。
_ 以下 具体的なスケッチの記述。

pinMode(12, INPUT_PULLUP);
while (digitalRead(12) == HIGH)
  yield(); 
Serial.println("Button is pressed!"); 

: ——————————————————————————————–
Internet of HIme Thing:4 ways to eliminate ESP8266 resets7of9さんの情報
要約:Wdt resetの発生は 不十分な電源インタフェース、フラッシュチップの故障。
_ フラッシュチップ(信頼性が低い)のクリヤーか交換。
_ スケッチは定期的にプロセッサに制御を戻すことが重要。
_ yield() 又は delay() の命令を記述する必要がある。
: ——————————————————————————————–
対策: 追記 2016.06.26。 以下の件は調査中で動作確認はしていません。
_ 起動すると通常はWiFiが裏で動作している。この為に裏の操作のタイミング
_ と影響によりクラッシュする原因となるようだ。これを起こさせない為には、
_ yield(); を使用する。又、WiFiを使用しない場合は、WiFiを停止すれば良い。
_ それには WiFi に関するAPIを理解して使用する
_ 例:停止:WiFi.disconnect(false); 開始:WiFi.begin();
_ 参照:esp8266 / Arduino:keyword:WiFiに関する命令。
_ 参照:ESPRESSIF:ESP8266 Non-OS SDK API Guide:APIの命令。
_    注:上記マニュアルにある命令は動作しない物もあります。
_ 参照:がた老AVR研究所:ESP8266の冒険(3):ESPの不可思議な現象判明。
_ 参照:chaeplin氏のサンプルを勉強する。この記述方法が正しいと思います。


感想:
設計の問題:例:SSのESPr Developer基板は RESET端子に100nF のコンデンサー無し。
_ これで不具合を発生させている事例があり、オシロでRESET信号を観測すると、
_ STARTボタンを押した時にパルスが発生し書き込みモードが解除されます。
_ では 3.3V や EN 端子には 起動用のコンデンサーは装備されているのでしょうか?
_ 特にCPUのRESET端子に起動用のコンデンサーを入れるのは基本です。
_  理由:電源が入りCPU内部のLogicが確立してから遅れたRESET信号で起動させる。
_ こういう視点で他のボードの回路図を分析する必要があります。
スケッチの問題:スケッチの記述の仕方によりエラーメッセージがでます。
USBとPC:たとえばマックのUSBの回路にはポリスイッチ素子が装備されています。
_ これにより過電流、静電気やパルスに対する保護回路が出来ています。
_ では、接続する外部の回路はそのような保護回路が入っているでしょうか。
_ 無い場合は対策として過電流防止のUSB Isolatorの装置を装備すると安全です。
技術力:MegaTech ELECTRONICSの説明と回路図を見るとハイレベルの技術力を持った
_ 方がいると感じました。とても勉強になる回路図です。
_ 同様に MTE の USB to 3.3v ボードの回路図も勉強になります。
スケッチの問題:Wdt や クラッシュを発生させない記述、命令の理解が必要らしい。
_ こうなると ESP8266 ってとても面倒なのですね。


Written by macsbug

6月 20, 2016 @ 6:42 am

カテゴリー: ESP8266

コメント / トラックバック7件

Subscribe to comments with RSS.

  1. 勉強になります。
    現在、watchdogが発生するEPS-WROOM-02が1枚あり、その原因特定の参考にさせていただきます。

    ところで
    MegaTech ELECTRONICS : ESP-WROOM-02 starter board
    の4行下に「RESET端子に1000nFあり。」と記載されていますが、回路図左上のC5 1000pFのことでしょうか? リンクの回路図を見たのですが、1000nFの記載は分かりませんでした。

    7of9

    6月 23, 2016 at 3:27 am

    • こんにちわ。
      Watchdog発生はハードとソフトの両面で起こり意味が解っても仕分けや特定するのが大変ですね。
      こういう場合は同じ物が2個あると判定し易いかとも思います。
      ご指摘の MegaTech ELECTRONICS 「RESET端子に1000nFあり。」は誤記でした。
      >回路図左上のC5 1000pFのことでしょうか?
      はい、まさにその通りです。C5 1000pF です。
      修正しておきました。
      指摘をありがとうございます、助かりました。

      macsbug

      6月 23, 2016 at 6:06 am

  2. こんにちは。

    > Watchdog発生はハードとソフトの両面で起こり意味が解っても仕分けや特定するのが大変ですね。
    > こういう場合は同じ物が2個あると判定し易いかとも思います。

    そうですね。
    故障時の切り分けのため3個ずつ購入してきましたが、今回はそれが有効となりそうです。

    GPIO15, GPIO2, GPIO0を測定してみて、おかげさまで症状が捉えられるようになってきました。
    http://qiita.com/7of9/items/527b87a63aeb2ce51828

    ただ、この症状の原因というのはこれから要調査です。

    7of9

    6月 24, 2016 at 3:22 am

    • こんにちわ
      少し調べていましたら 7of9 さんの方でも 次を調べているとの事。
      波形での解り易さは素晴らしいです。

      7of9 さんの調べた波形と同じと思いますが、ESP8266のGPIO_0と
      GPIO_2の起動時(Reset)の波形を観測し今回の記事に波形を追加しました。
      1. GPIO_0 は起動時に 2Vの電位が生じその上に信号が出力される。
      _ この2Vは妙だと思うし意味は解らないが現実。
      2. GPIO_2 も起動時に信号が出力されます。
      _ これも意味は解らないが現実。
      結論:このような波形が出ていれば正常。
         GPIO_0と2に負荷を接続する場合は、起動時のこの信号を考慮する。
      「妙」と言う表現は私が波形の意味を理解出来ていないからです。
      現実にはこのような波形が出ていればハードは正常と判断します。

      ブログの画像にありますが、試しに基本回路を追加して確認も必要かなと思います。
      抵抗値も通常の記事は 10KΩですが1KΩが正解かなとも思う場所があります。
      基本:Reset端子に100nFを付ける。EN端子に100nFを付ける。
      これは順を追った確認ですので変化が無い場合もあり、正常かを確かめる為。
      ある例で 信号を調べてESP8266内部の不具合しかないと判断し ESPを交換しましたが不具合は解消されなかったという例もあります。
      ESP8266がソケット式であれば直ぐ判定できるでしょうね。
      逆挿しによりある端子が怪しい場合は Lチカのスケッチで大丈夫だと思われる端子を試すとかいかがでしょうか。
      よって、基本の確認と信号を調べる事により、ハードが正常と解れば次に進めますね。

      スケッチの問題。ブログにこの件を追加しました。
      クラッシュの原因と対策として delay() や yield() があるとの事。

      数多くスケッチを作ると Wdt Reset が発生する場面に出合います。
      Arduinoでは起こらないような記述がESP8266では起きる。
      例として、OLEDの表示を高速に行うと出る。
      対策は ESP.wdtDisable() を追加とか、その場その場で対処する感じで大変です。
      一方、高速処理が必要なArduCam(カメラ)のライブラリーはエラーは発生しない。
      こういう点で自分の理解度が無い中で、ESPのCoreやLibraryはまだ未完成で信号のタイミングや双方向信号のタイミングをきちんとやっていないのでは無いかと疑念を抱いてしまいます。これは自分のスケッチの記述にも言えますね。
      意味は解らず使用しているのですが、ESP.wdtDisable() を使用し Wdt Reset を発生しない様にしています。
      これは 理由は不明なのですが delay(1) と同じと聞いています。
      yield() を使用している例(ESP_radio:mp3信号の高速処理)もあります。

      macsbug

      6月 25, 2016 at 3:37 am

      • こんばんわ
        こちらに掲載いただいた情報と比較検討していくことで、ハードの問題ではなさそうだと感じました。
        問題のあるプログラムをロードした時にしていることを見なおした結果、WiFi.begin()関連で問題が発生しているようでした。その対策方法も見つかりました。
        http://qiita.com/7of9/items/527b87a63aeb2ce51828

        色々な波形および関連情報を整理して掲載していただいたことでで問題が解決がしやすくなりました。
        どうもありがとうございました。
        感謝です。

        7of9

        6月 25, 2016 at 10:36 am

      • 7of9さん、ハードでない事が解りよかったですね。頑張りに驚嘆しています。
        2つのもので比較する最短コースは素晴らしいと思います。
        次はスケッチの問題が判明してきましたが、
        WiFi Connect の記述で理想的なものは どういう記述なのかと思います。
        7of9さんは既に対策をされていますが参考になるサイト(Github)を探しました。
        以下のchaeplin氏のサンプルは参考になりました。
        このサイトは既存の家電と会話するという事ができています。
        https://github.com/chaeplin/esp8266_and_arduino

        以下の例が書かれています。確かに受信しない場合の処理がされています。
        :一番上の door-alarm-esp-12.ino
        WiFi.mode(WIFI_STA);
        WiFi.begin(ssid, password);
        int Attempt = 0;
        while (WiFi.status() != WL_CONNECTED){
        delay(100);
        Attempt++;
        if (Attempt == 100){
        ESP.restart(); // restarts the CPU. ESP-specific APIs
        }
        }


        7of9さんと同じ方法かも知れませんが 例えば
        私の埃センサーのスケッチは 家のWiFiで外部にデーターを送りOLEDに表示し動く。
        でも、外出時は電波が無いか合わないので外部にデーターを遅れない。
        この場合 WiFiが繋がらない時は、外部接続をやめて表示だけにする。
        その為に WiFi connect が25回以上受信が無ければ次に進めOLEDの表示のみにする。

        >WiFiを使わないソフト
        電波を出さない様にしたい電子工作が沢山有ります。
        この案件が解らずじまいでしたが WiFiの電波を停止する方法が解りました。
        これも上記のサイトに書いてありました。
        WiFi.mode(WIFI_OFF);  電波を監視するソフトで確認済み。
        力量の有る方はご存知なのでしょうが、以外と使用していない命令が他にもあるかも知れません。
        これは API とかいう範疇を勉強しなといけないのでしょうかね。
        以下は、調査 及び 確認 したい気になる命令です。、、、答えでなく申し訳ない。
        wifi_station_disconnect();
        WiFi.disconnect();  これは電波は停止しませんでした。
        WiFi.forceSleepWake();
        WiFi.mode(WIFI_AP); 、、WIFI_STA, WIFI_AP_STA or WIFI_OFF
        wifi_station_connect();
        WiFi.forceSleepBegin();
        wifi_set_opmode(NULL_MODE);
        webSocket.disconnect();
        ETS_UART_INTR_DISABLE ();
        ETS_UART_INTR_ENABLE ();
        wifi_set_opmode (m);
        wifi_set_opmode_current (m);
        少し話が それたかも知れませんが、お許しください。

        macsbug

        6月 27, 2016 at 9:09 am

  3. こんにちは。

    chaeplinさんのサンプルありがとうございます。参考になります。
    100msecでdelayして最大10秒までのリトライなのですね。
    なるほどです。

    > 私の埃センサーのスケッチは 家のWiFiで外部にデーターを送りOLEDに表示し動く。
    > でも、外出時は電波が無いか合わないので外部にデーターを遅れない。
    > この場合 WiFiが繋がらない時は、外部接続をやめて表示だけにする。
    > その為に WiFi connect が25回以上受信が無ければ次に進めOLEDの表示のみにする。
    こちらも参考になります。
    WiFi機能が無効の時はそれ以外の機能を使えるようにする、というのはなるほどです。

    > 電波を出さない様にしたい電子工作が沢山有ります。

    > WiFi.mode(WIFI_OFF);  電波を監視するソフトで確認済み。
    WIFI_OFFというパラメータは知りませんでした。
    ありがとうございます。WIFI_OFFで検索してみました。
    https://github.com/esp8266/Arduino/blob/de166c9dd73bd1da0baa35b2a62695035196018a/libraries/ESP8266WiFi/src/
    の ESP8266WiFiType.h にて以下の定義を見つけました。
    typedef enum WiFiMode
    {
    WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3
    } WiFiMode_t;
    上記4つが用意されているのですね。

    wifi_station_disconnect()など色々なキーワードは確かに気になります。
    自分がこれからソフトを作る過程でこのキーワードに戻ってきて調べるかもしれません。
    その時にまた参考にさせていただきます。

    7of9

    6月 28, 2016 at 3:26 am


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。