Parts:DevBoard:ESP32
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の訳の問題も見えて理解が深まります。
ここまで完了すれば 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 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 例外は、アプリケーションが無効なメモリ位置から読み書きしようとすると発生します。 レジスタ ダンプの 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