« 16倍24Bit スーパーサンプリングSDメモリプレイヤー(AK4490REQ対応、基板頒布あり) | トップページ | シングルコアESP32-SOLO-1とクロックダウンと低消費電力化について 11/6追記 »

2021年8月10日 (火)

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時の電流はほぼ変わらないので、間欠動作で動作デューティが小さくなれば消費電流の削減効果は低下します。

詳細は次回!

 

| |

« 16倍24Bit スーパーサンプリングSDメモリプレイヤー(AK4490REQ対応、基板頒布あり) | トップページ | シングルコアESP32-SOLO-1とクロックダウンと低消費電力化について 11/6追記 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« 16倍24Bit スーパーサンプリングSDメモリプレイヤー(AK4490REQ対応、基板頒布あり) | トップページ | シングルコアESP32-SOLO-1とクロックダウンと低消費電力化について 11/6追記 »