ESP32 の ULP コプロセッサを使って超低消費電力 I2C 通信

組み込み
スポンサーリンク

低消費電力の WiFi モジュール ESP32 をさらに少ない電力で使う方法を紹介します.

スポンサーリンク

はじめに

ESP32 は消費電力が少ない IC ですが,CPU 周波数を 80MHz ほどに落としても少なくとも 20mA 程度は流れます.単三アルカリ乾電池だと約 2000mAh なので,2個使いだとざっくり 2000 * (1.5*2 / 3.3) / 20 / 24 = 3.8日で空になってしまいます.

一方,ESP32 には,低消費電力で動作する ULP (Ultra Low Power) コプロセッサが内蔵されています(下図赤丸).

ULP は 8MHz で動作するシンプルなプロセッサで,4 つの 16bit レジスタと 30 程度の命令を備えています.CPU を deep sleep にした状態で動かすことができます.

そのため,消費電力に対する要求が非常に厳しい条件でも ESP32 を活用できるようになります.

今回は,ULP を使って,高性能な温湿度センサである SHT-3x を I2C 通信で制御する例を紹介します.

動作概要

今回作成するプログラムは下図のような動きをします.

CPU プログラムは ULP プログラムを走らせたらすぐに deep sleep に遷移します.ULP プログラムは定期的に起きて計測を行い,一定数計測データが溜まったら CPU プログラムを起こします.測定データは,deep sleep モード中にも値を保持できる,RTC SLOW memory に保存します.

準備

ソフトをビルドするために,ESP-IDFbinutils-esp32ulp をセットアップします.binutils-esp32ulp のダウンロードはこちらから.

ただし,現時点の binutils-esp32ulp の最新リリース(esp32ulp-elf-binutils-*-7b4f341)はアセンブラにバグがあるので,リポジトリからソースを採ってきて次のようにビルドする必要があります.
[18年6月24日追記: この作業はもはや不要です]

ULP 側コード

ULP プログラム全体は,こちらのリポジトリにあります.

ULP は I2C 通信専用の命令も持っているのですが,SHT-3x で必要な通信シーケンスを発行できないので,今回は I2C 通信も含めてソフト(Bit Bang)で実現しています.

ULP の各ソースファイルについて,簡単に説明していきます.

main/ulp/i2c_sht3x.S

SHT-3x 固有の処理を記載しています.sense_sht3x が計測処理本体で,実行すると計測結果が sht3x_sense_value から始まる 4 word に保存されます.

main/ulp/i2c.S

I2C 関連の処理を記載しています.SDA は GPIO 26,SCL として GPIO25 を使用します.クロックは 200kHz となります.

GPIO 端子については,同じ端子に対する CPU 側と ULP 側の番号の割り振りが異なるので注意.詳細はリファレンスマニュアルの「RTC_MUX Pin Summary」参照.

main/ulp/main.S

ULP のプログラム本体です.sense_count で指定された回数だけ SHT-3x による計測を行った後,CPU を起こします.
ULP 側のプログラムで定義した変数は,CPU 側からは接頭辞「ulp_」をつけてアクセスできますので,CPU 側からは ulp_sense_count という変数に対して書き込みを行う形になります.

main/ulp/util_macro.S

スタック操作のマクロです.レジスタ r3 はスタックポインタとして占有する前提になっています.

CPU 側コード

最初の起動時に ULP のプロフラムのロードと GPIO の初期化を行い,それ以降は起きる度に計測結果に対する処理を行う形になります.

消費電流

20秒ごとに SHT-3x で計測する設定で動かした場合,消費電流は下図のようになりました.

SHT-3x のデータシートによると測定中の消費電流は typ 0.8mA なので,定期的に増えている消費電流はほぼ SHT-3x によるものと推測されます.

測定時以外の電流値は 5uA 程度でした.


平均消費電流は 0.024 mA となり,乾電池 2個使いでも 2000 * (1.5*2 / 3.3) / 0.024 / 24 = 3156日持つ計算になります.実際の使用条件での電池寿命は WiFi 通信(150mA程度) の頻度が規定する形になりそうです.

まとめ

ESP32 の ULP を使うことで,CPU を使う場合に比べて 100分の1以下の電力で I2C による温湿度計測ができることが確認できました.

コメント

  1. […] . 参考: bitluni:ULPSoundESP32:今回のスケッチがあります。 espressif:espressif/esp-iot-solution:ULPコプロセッサおよびアセンブリ環境設定の概要 espressif:esp32 ulp programming:esp32 ulpプログラミング docs.espressif:ULP coprocessor instruction set:ULPコプロセッサ命令セット Rabbit Note:ESP32 の ULP コプロセッサを使って超低消費電力 I2C 通信: […]