ESP32-SOLO-1を使う
ESP32のシングルコア版で、ESP32-SOLO-1というデバイスがあり、省消費電力用途向けという位置付けのようだ。
いまのところあまり話題にも上らず検証記事も乏しいので、今回はArduinoでESP32-SOLO-1を使う方法を紹介し、次回の記事で従来のESP32との比較をしたいと思う。
0.Arduinoで従来のESP32と同じ扱いでESP32-SOLO-1に書き込むとどうなるか
①コンパイルと書き込みは正常に終了する。
②リセットしてプログラムを開始すると、「これはシングルコアじゃねえか!勘弁してくれ!!」みたいなエラーが出てリセットを繰り返す。
1.ArduinoをESP32-SOLO-1に対応させる
①https://github.com/lbernstone/arduino-esp32-soloからESP32-SOLO用のライブラリをダウンロードする。
②これを解凍し、arduino-esp32-solo-master\tools\sdk\libにある9つのライブラリファイル(*.a)を、PCのAruino15\packages\esp32\hardware\esp32\1.0.6\tools\sdk\lib
のホルダに上書きコピーする。(ただし元の同名の9つのファイルは念のためバックアップしておく)
③同じくarduino-esp32-solo-master\tools\sdk\include\configにあるsdkconfig.hを、PCの Arduino15\packages\esp32\hardware\esp32\1.0.6\tools\sdk\include\config
に上書きコピーする。(ただし元のsdkconfig.hは念のためバックアップしておく)
※1 Arduino15ホルダは、
C:\Users\username\AppData\Local\Arduino15 あるいは C:\Users\username\AppData\Roaming\Arduino15 あたりにあると思いますが、見つからない場合はusernameあたりから下を検索してください。
※2 上記変更後に通常のESP32が正常にコンパイルできるかどうかわからないので、通常のESP32を使う場合は元に戻すことにしています。
2.Arduinoでプログラムして実行する
まずはArduinoで新規ファイルを作り、setupもloopも空のままコンパイルして書き込んでリセットする。すると、
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x13 (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:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4
E (10095) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (10095) task_wdt: - IDLE0 (CPU 0)
E (10095) task_wdt: Tasks currently running:
E (10095) task_wdt: CPU 0: loopTask
E (10095) task_wdt: Aborting.
abort() was called at PC 0x400d8fdb on core 0
ELF file SHA256: 0000000000000000
Backtrace: 0x400840e7:0x3ffbe3a0 0x40084345:0x3ffbe3c0 0x400d8fdb:0x3ffbe3e0 0x4008291e:0x3ffbe400 0x400dd289:0x3ffb1fb0 0x400852cd:0x3ffb1fd0
Rebooting...
のようなメッセージが3秒ごとに延々と繰り返される。
これは3秒に一度、WDT(ウォッチドッグタイマー)により再起動してしまっているからだ。
WDTはArduinoを使ってるとあまりなじみがないが、不慮の無限ループやノイズによるフリーズなどの場合に、一定時間反応がないとハードウェアリセットをかけてくれるありがたい機能だ。
従来のESP32はデュアルコアであり、core0とcore1のうちArduinoのloop()で使用しているcore1にはWDTが付いていない。core0には WDTが付いていて、これはArduinoで内部処理されている。
シングルコアのESP32-SOLO-1はcore0のみで、WDTが付いているため、プログラム内で明示的にWDTをリセットする必要がある。
WDTのリセットは簡単で、loop()内にdelay(1)を挿入するだけでよい。()内は1以上ならOK。注意すべきことはdelay(0)はNGということと、WDTが3秒だからdelay(3000)以内でなければダメかというとそんなことはなく、delay(10000)でもOKだ。
もうひとつ注意すべきことは、必ずloop()でdelay(1)を行うこと。たとえばTickerを仕掛けておいて、その割り込み先でdelay(1)してもWDT をリセットすることはできない。また、loop()内であってもdelayMicroseconds()ではWDTをリセットすることはできない。
WDTによる再起動を回避するもうひとつの方法は、WDTを無効化することだ。これはsetup()で
disableCore0WDT();
と記述しておけばよい。こうすることでWDTは無効化される。
次回は、従来のデュアルコアのESP32と、シングルコアのESP32-SOLO-1との、消費電流の違いについて検証します。
先に結論を予告しておきますが、シングルコアだからといって半分にはなりません。連続稼働状態でいいとこ2割減(20211106修正。4割近く改善)、sleep時の電流はほぼ変わらないので、間欠動作で動作デューティが小さくなれば消費電流の削減効果は低下します。
詳細は次回!
| 固定リンク | 0
« 16倍24Bit スーパーサンプリングSDメモリプレイヤー(AK4490REQ対応、基板頒布あり) | トップページ | シングルコアESP32-SOLO-1とクロックダウンと低消費電力化について 11/6追記 »
コメント