Parts:DevBoard:ESP32

提供: robot-jp wiki
ナビゲーションに移動検索に移動

CPU

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

DevBoard

ESP32 には色々な種類があります。

開発ボード USB CPU Freq Flash EEPROM RAM I/O電圧 GPIO A/D Wifi BLE 価格(目安)
ESP32-CAM-MB+USB I/F microTypeB ESP-WROOM-02 (LX106) 160MHz 4MB - 36kB 3.3V 10 7 802.11 b/g/n/e/i - Amazon \980
ESP32-DevKitC-32D microTypeB ESP-WROOM-32 (Xtensa) 240MHz 64MB - 520kB 3.3V 21 16 802.11 b/g/n/e/i 4.2 Amazon ¥1280
NodeMCU-32S microTypeB ESP-WROOM-32 (Xtensa) 240MHz 64MB - 520kB 3.3V 21 16 802.11 b/g/n/e/i 4.2 Amazon \1168

ESP-IDFのインストール

debug をするため ESP-IDF を入れます。

英文ですが、chromeの自動翻訳で何とかなります。英文と訳文を交互に見るようにすればchromeの訳の問題も見えて理解が深まります。

Espressif

ここまで完了すれば python3 と ESP-IDF がコマンドラインから動くようになっています。

ためしにコマンドラインで "esptool.py" または "idf.py" と入力してHELPが表示されれば正常です。

ESP32 Web Server

https://randomnerdtutorials.com/esp32-web-server-arduino-ide/

LoRA

Youtube https://www.youtube.com/watch?v=w6ygDCTSQug&list=RDLVw6ygDCTSQug

Debug情報

情報源

Espressif API Conventions
Error Handling
Fatal Errors
Guru Meditation Errors
LoadProhibited, StoreProhibited
RANDOM NEED TUTORIALS ESP32 Troubleshooting Guide

電圧精度

経験則では、全てのエラーが3.3V電源電圧dropにより発生する可能性があるため、きっちり計算してみます。

入力側の5V電源電圧はvbus規格では4.75V~5.25Vです。
ここでは3.3V系の消費電流を仮にmax0.5A, 40℃と仮定します。
USBからのVBUSからショットキーダイオードBAT760-7(Δ-0.4V/0.5A 40℃)経由で供給されるため、
3.3V REG AMS1117-3.3の入力電圧は min4.75V-0.4V=4.35V/0.5A 40℃ となります。
3.3V REG の出力電圧は max3.365V/500mA 40℃ です。
3.3V REG の入出力電圧dropは 1.0V/0.5A 40℃ →必要な入力電圧は min4.4V です。
マージンが全くないため、電流がゆらいだ場合等のノイズ的要因があれば、それが3.3Vに乗る可能性が高い条件になっています。

MHZ19Cの電源電流は2sec毎に400msの間約120mA流れます。max150mAです。
このセンサは内部にLEDではなくランプが入っているため、電流の立ち上がりが急であり、外部5Vに470uFを付けても-0.6V/40ms程度dropします。
このdropは 3.3Vに影響する事があり、Rebootに至る事もあります。
MHZ19Cの電圧を安定させるために昇圧電源を入れた場合、消費電流はさらに増加して5Vのdropは悪化します。
電流の消費が大きいのは MHZ19C / WiFi / LCDバックライト であり、電圧に特にシビアなのは SPI-Flash なので、これらを上手に制御する必要があります。

SPI-FlashとMHZ19Cを同時に使わない等の手段が必要です。

Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.

CPUメーカーによる解説 https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/fatal-errors.html#loadprohibited-storeprohibited

これらの CPU 例外は、アプリケーションが無効なメモリ位置から読み書きしようとすると発生します。

レジスタ ダンプの EXCVADDR レジスタに、書き込み/読み出しされたアドレスが見つかります。

このアドレスがゼロの場合は、通常、アプリケーションが NULL ポインターを逆参照しようとしたことを意味します。

このアドレスがゼロに近い場合は、通常、アプリケーションが構造体のメンバーにアクセスしようとしたが、構造体へのポインターが NULL であることを意味します。

このアドレスが別のもの (ガベージ値、0x3fxxxxxx から 0x6xxxxxxx の範囲ではない) である場合、データへのアクセスに使用されるポインターが初期化されていないか、破損している可能性があります。

経験則
・xTaskCreate/vTaskDelete(NULL)の関係が合ってない。
・Serial.printf("%d",string) とか、型を間違えた。
・前のAnimation処理が終わる前に次のAnimation指定をした。

エラーメッセージ全文

Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.

Core 1 register dump:
PC      : 0x400dc217  PS      : 0x00060530  A0      : 0x800ee9ec  A1      : 0x3ffb1bc0  
A2      : 0x000000ff  A3      : 0x3ffb1d74  A4      : 0x3ffb1d7c  A5      : 0x00000000  
A6      : 0x00000000  A7      : 0x00000001  A8      : 0x800e1ce5  A9      : 0x3ffb1d00  
A10     : 0x00000001  A11     : 0x3ffb1d24  A12     : 0x00000020  A13     : 0x00000020  
A14     : 0x0000002b  A15     : 0x00000002  SAR     : 0x00000020  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000000  LBEG    : 0x400de4ed  LEND    : 0x400de4fa  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000

Backtrace: 0x400dc217:0x3ffb1bc0 0x400ee9e9:0x3ffb1d50 0x400d9186:0x3ffb1e10 0x400d91f3:0x3ffb1e60 0x400d9230:0x3ffb1eb0 0x400d92b0:0x3ffb1ed0 0x400d96e2:0x3ffb1f00 0x400e4073:0x3ffb1f50 0x400e4159:0x3ffb1f70 0x400d154b:0x3ffb1f90 0x400f8efd:0x3ffb1fb0 0x4008a22a:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

st:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6360
entry 0x400806b4

発生タイミング:WiFi接続完了〜接続確認の間

Guru Meditation Error: Core  1 panic'ed (InstrFetchProhibited). Exception was unhandled.

CPUメーカーによる解説 https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/fatal-errors.html#instrfetchprohibited

この CPU 例外は、命令のアドレスが命令 RAM または ROM の有効な領域に属していないため、CPU が命令を読み取ることができなかったことを示します。

通常、これは、有効なコードを指していない関数ポインタを呼び出そうとしたことを意味します。
PC (プログラム カウンター) レジスターはインジケーターとして使用できます。
ゼロになるか、ガベージ値 (0x4xxxxxxx ではない) が含まれます。


エラーメッセージ全文

Guru Meditation Error: Core  1 panic'ed (InstrFetchProhibited). Exception was unhandled.

Core 1 register dump:
PC      : 0x33ff7700  PS      : 0x00060030  A0      : 0x800e406e  A1      : 0x3ffb1ef0  
A2      : 0x3ffc9b24  A3      : 0x00000000  A4      : 0x3ffc9a44  A5      : 0x0000fffd  
A6      : 0x0000001f  A7      : 0x3ffcbb88  A8      : 0x800e2768  A9      : 0x33ff7700  
A10     : 0x3ffcbb98  A11     : 0x3ffcbb88  A12     : 0x00009ac5  A13     : 0x00004a00  
A14     : 0x00000001  A15     : 0x00000002  SAR     : 0x0000000a  EXCCAUSE: 0x00000014  
EXCVADDR: 0x33ff7700  LBEG    : 0x400f7afc  LEND    : 0x400f7b5e  LCOUNT  : 0x00000002  

ELF file SHA256: 0000000000000000

Backtrace: 0x33ff7700:0x3ffb1ef0 0x400e406b:0x3ffb1f50 0x400e4151:0x3ffb1f70 0x400d1567:0x3ffb1f90 0x400f8ef5:0x3ffb1fb0 0x4008a22a:0x3ffb1fd0

発生タイミング:WiFi接続完了〜接続確認の間

経験則
・xTaskCreate/vTaskDelete(NULL)の関係が合ってない。
・前のAnimation処理が終わる前に次のAnimation指定をした。

rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)

CPUメーカーによる解説 

エラーメッセージ全文

rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)onfigsip: 0, SPIWP:0xee

clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6360
entry 0x400806b4

発生タイミング

起動〜2分15秒後
XCL103がENを変化させても5Vを出力せず 、"error: can't get MH-Z19 response." の表示。
電源再投入で回復。5V系の立ち上がりがおそすぎた?


経験則
・電源電圧が一瞬ドロップしてCPUがリセットされている。
・電源ラインの電解コンデンサが

小さすぎる ←1ms,0.5V程度のドロップの場合、逆流防止ダイオード起因の可能性
大きすぎる ←XCL103を使っている場合、起動していない可能性

[E][esp32-hal-cpu.c:93] addApbChangeCallback(): duplicate func=400... arg=...

ArduinoIDEの設定を Core Debug Level = debug/Verbose にして、

MHZ19Cとの通信ライブラリ mhz19_uart を使うと、通信する度に表示されます。


内容的には何かの宣言が重複して行われた、という事のようです。

特に問題が起きるわけではありませんが、気になるエラーメッセージです。

ArduinoIDEを起動するとESP32が再起動する

そういう回路とPCの作りになっています。ソフトでは対処できません。

DevKit上から自動書き込み回路を削除すれば対策可能です。

パーティションを変更できない

Flashを消す必要があります。

初めて書き込むCPUでも、Defaultと違うパーティションにするにはおそらく書き換える必要がありそうです。

やり方は espressif hpに書かれてます。 最新のesptoolを使うのがポイントです。

予めesptoolsをインストールしておきます。

ArduinoIDE等のシリアルポートを使うアプリを全て終了しておきます。

環境依存ですが、個人的にはubuntuでは以下のコマンドでOKです。terminalからコマンドでesptoolsを実行します。
ubuntu:~$ cd ~/git/arduino-esp32/tools/
ubuntu:~/git/arduino-esp32/tools$ ./esptool.py --chip esp32 --p /dev/ttyUSB0 --baud 921600 erase_flash


Flashを完全消去しても動かない。Flashを読み出せない。

Flashが書けないステータスにはまった可能性があります。

書き込み中に電圧が不安定になった時にそうなるんだとか。

ubuntuではこのコマンドで確認できます。

./esptool.py read_flash_status --bytes 3

以下のような出力になった場合、NGです。Flashが再起不能になってます。

*@ubuntu:~/git/arduino-esp32/tools$ ./esptool.py read_flash_status --bytes 3

esptool.py v3.3.2-dev

Found 1 serial ports

Serial port /dev/ttyUSB0

Connecting.....

Detecting chip type... Unsupported detection protocol, switching and trying again...

Connecting.......

Detecting chip type... ESP32

Chip is ESP32-D0WD (revision 1)

Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None

Crystal is 40MHz

MAC: e8:9f:6d:54:bd:b0

Uploading stub...

Running stub...

Stub running...

WARNING: Failed to communicate with the flash chip, read/write operations will fail. Try checking the chip connections or removing any other hardware connected to IOs.

Status value: 0x0000

Hard resetting via RTS pin...

参考:https://github.com/espressif/esp-idf/issues/7994

ただし、次のコマンドで復活する事もあるようです。 ./esptool.py --port /dev/ttyUSB0 write_flash_status --non-volatile 0


戻る