XIAO ESP32C3の消費電力ベンチマーク

に公開

こんにちは、ファーストループテクノロジーの彦坂です。

当社では、IoTデバイスのプロトタイピングにおいて、汎用マイコンを使う機会も多いのですが、
今回はSeeed Studio社の超小型ボード「XIAO ESP32C3」のスリープ時の消費電力が実際どれくらいなのかを計測してみました。

目的

IoTデバイスが身の回りに増える中、バッテリーをいかに長持ちさせるかは、開発者にとって永遠のテーマです。ESP32シリーズは、入手性もよくIoTデバイスのプロトタイピングなどで利用しやすいです。その一方で、消費電力のカタログスペック自体は、必ずしも業界最高というわけではありません。そこで、どの程度の実力があるのかを明らかにするためにも、低消費電力のチップを搭載したXIAO ESP32C3を使い、以下の組み合わせで消費電流を実際に測定しました。

  • スリープモード: Light Sleep と Deep Sleep
  • 給電の方法: 3.3Vピン と バッテリー(BAT)端子
  • 入力電圧: 3.0V から 4.2V まで

ESP32とXIAO ESP32C3って、どんなマイコン?

そもそも「ESP32」とは

「ESP32」は、中国のEspressif Systems社が開発している、Wi-FiとBluetoothを内蔵した、安くて高性能なマイコンのシリーズ名です。IoTの電子工作シーンでは、もはや定番中の定番と言える存在です。

  • ワイヤレス機能が標準装備: Wi-FiもBluetoothも最初から入っているので、買ってきてすぐにネットワークに繋がるデバイスを作れます。
  • 意外とパワフル: モデルによってはCPUが2つも搭載されており、IoTデバイスとしては十分すぎるほどの計算能力を持っています。
  • 種類が豊富: 初代ESP32の他にも、USBが得意な「S2」、AI処理を強化した「S3」、省電力とコストを重視したRISC-Vコアの「C3」など、用途に合わせて選べるたくさんの仲間がいます。
  • 開発しやすい環境: なかでもArduino IDEを使った開発環境は情報が豊富で、世界中の開発者がライブラリを公開しているため、初心者でも比較的簡単に始められます。

今回の主役「XIAO ESP32C3」

今回、ベンチマークの対象に選んだ「XIAO ESP32C3」は、Seeed Studio社が出している「XIAO」という、切手サイズの超小型ボードシリーズの一つです。この小さな基板(21 x 17.5mm)に、Espressif Systems社のESP32-C3チップのパワフルな機能がギュッと詰め込まれています。また、Seeed Studio社が製造していることもあり、入手性や継続的な製品供給に関して、一定の安心感があります。

  • 心臓部: ESP32-C3 (32ビット RISC-Vコア, 最大160MHz)
  • 無線機能: Wi-Fi (802.11 b/g/n), Bluetooth 5.0 (BLE)
  • 記憶容量: 4MB Flash, 400KB SRAM
  • 入出力: GPIO x11, ADC x4, UART, I2C, SPIなど、基本的なインターフェースは完備
  • 便利な付加機能:
    • バッテリー充電回路: LiPoバッテリーを繋ぐだけで充放電の管理をしてくれる、非常に便利な回路が標準で搭載されています。
    • 外部アンテナ対応: 基板上のアンテナだけでなく、U.FLコネクタを使って外部アンテナを接続し、通信距離を伸ばすことも可能です。

XIAO ESP32C3の給電方法と消費電力予想

XIAO ESP32C3は、電源供給方法として、USB-C経由、5Vピン経由、3.3Vピン経由、バッテリ端子経由の4通りがあります。本検証においては、3.3Vピン経由、バッテリ端子経由での消費電力の計測を行います。

3.3Vピンは、下図ピンリストの3V3が該当します。
ピンリスト

一方、バッテリ端子は、下図背面図のBATTERY CONNECTORが該当します。  
背面図

続いて、消費電力の予想を行います。
回路図を見る限り、3.3Vピン(VCC_3V3)は、ノイズフィルタリングを目的としたフェライトビーズは介しているものの、チップの電源回路にほぼ直結されています。
一方、バッテリ端子には、LDO(低ドロップアウト)レギュレーター(XC6210B332MR)が接続され、3.3Vにレギュレートされたのち、VCC_3V3に出力されています。

ESP32-C3チップの最小消費電力は5μAであり、レギュレーターのそれが35μAであることを踏まえると、XIAO ESP32C3のDeepSleep時の消費電流は、机上計算では下記となりそうです。

給電経路 消費電流(μA) 備考
3.3Vピン 5 チップ
バッテリー端子 40 チップ+レギュレータ

ESP32-C3の省電力モードについて

ESP32-C3には、消費電力を抑えるための「スリープモード」がいくつか用意されています。今回は、その中でも特に利用頻度の高い、以下の2つのモードを取り上げます。

  • Light Sleep: 「うたた寝」のようなモード。CPUの動きは止めますが、メモリ(RAM)や周辺機能の電源は生かしたままなので、外部からの信号で高速に目覚めることができます。
  • Deep Sleep: 「熟睡」モード。CPUやメモリなど、ほとんどの機能の電源をオフにして、消費電力を極限まで抑えます。目覚める際は、リセット(再起動)がかかるのが特徴です。

今回の計測方法

計測に使った機材

  • 測定対象: Seeed Studio XIAO ESP32C3
  • 電流計 兼 高精度電源: Nordic Semiconductor Power Profiler Kit II (PPK2)
    • 今回の測定では、PPK2を電流計としてだけでなく、1mV単位で電圧を設定できる高精度な直流電源としても使用しました。3.3Vピンおよびバッテリー端子への給電は、すべてPPK2から行っています。
    • 印加電圧範囲:
      • 3.3Vピン: 3.0Vから3.6Vまで。
      • バッテリー端子: 3.0Vから4.2Vまで。

計測に使ったコード

Arduino IDEで、以下のようなテストコードを書き込んで、消費電力を測定しました。起動時には、いずれも円周率を計算させています。

XIAO ESP32C3をArduino IDEで使うための基本的な設定方法は、Seeed Studioの公式Wikiに詳しく載っています。

コードを書き込む際は、ボード上のBOOTボタンを押しながらRESETボタンを押して、ダウンロードモードにする必要があります。

Light Sleepモード用コード

light_sleep.cpp
#define uS_TO_S_FACTOR 1000000ULL  //マイクロ秒から秒への変換係数
#define TIME_TO_SLEEP  10           // スリープ時間(秒)

// 負荷処理(円周率計算)
double calculate_pi(int iterations) {
  double pi = 0.0;
  for (int i = 0; i < iterations; i++) {
    double term = 4.0 / (2.0 * i + 1.0);
    if (i % 2 == 0) {
      pi += term;
    } else {
      pi -= term;
    }
  }
  return pi;
}

void setup() {
  Serial.begin(115200);
  delay(1000); // シリアルポートの初期化待ち
}

void loop() {
  Serial.println("--- Active ---");
  // 負荷処理の実行
  Serial.println("Calculating Pi...");
  double pi = calculate_pi(100000);
  Serial.print("Pi: ");
  Serial.println(pi, 8);

  // Light Sleepへ移行
  Serial.println("Entering light sleep...");
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  esp_light_sleep_start();
  Serial.println("Woke up from light sleep");
}

Deep Sleepモード用コード

deep_sleep.cpp
#define uS_TO_S_FACTOR 1000000ULL  // マイクロ秒から秒への変換係数
#define TIME_TO_SLEEP  10           // スリープ時間(秒)

// 負荷処理(円周率計算)
double calculate_pi(int iterations) {
  double pi = 0.0;
  for (int i = 0; i < iterations; i++) {
    double term = 4.0 / (2.0 * i + 1.0);
    if (i % 2 == 0) {
      pi += term;
    } else {
      pi -= term;
    }
  }
  return pi;
}

void setup() {
  Serial.begin(115200);
  delay(1000); // シリアルポートの初期化待ち

  Serial.println("--- Active (from Reset) ---");
  // 負荷処理の実行
  Serial.println("Calculating Pi...");
  double pi = calculate_pi(100000);
  Serial.print("Pi: ");
  Serial.println(pi, 8);

  // Deep Sleepへ移行
  Serial.println("Going to deep sleep now");
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  esp_deep_sleep_start();
}

void loop() {
  // Deep Sleepからは復帰しないため、本関数は実行されない
}

計測結果

それでは、お待たせしました。今回のベンチマークで得られた結果を発表します。

1. Light Sleepモード

まずは、CPUが少しだけお休みする「Light Sleep」モードの結果です。単位は µA となっています。

給電経路 3.0V 3.3V 3.6V 3.9V 4.2V
3.3Vピン 262.0 267.9 223.6 - -
バッテリー端子 258.5 263.0 218.8 218.7 217.9

なにやら、3.3Vと3.6Vの間で大きく数字が変動しています。

2. Deep Sleepモード

続いて、本命の「Deep Sleep」モード。バッテリー駆動時間を左右する、最も重要な指標です。単位は µA です。

給電経路 3.0V 3.3V 3.6V 3.9V 4.2V
3.3Vピン 81.8 90.4 41.8 - -
バッテリー端子 81.5 67.3 41.5 41.5 41.8

こちらも、3.3V近辺で大きく数字が変動しています。

3. Deep Sleepモード(3.3V周辺の詳細調査)

上記の通り、3.3V近辺で消費電流が大きく変動する、という興味深い現象が観測されました。この特異点をより詳細に調査するため、3.30Vから3.36Vの範囲で、電圧を0.01V刻みで印加し、追加測定を実施しました。単位は µA です。

給電経路 3.30V 3.31V 3.32V 3.33V 3.34V 3.35V 3.36V
3.3Vピン 90.4 59.4 55.1 31.1 31.8 17.0 40.8
バッテリー端子 67.3 68.4 68.4 52.5 40.6 40.6 40.5

考察

今回の測定結果から、いくつかの興味深い傾向と、設計上、非常に重要な注意点が見えてきました。

1. 入力電圧と消費電流の基本的な関係

まず、全体的な傾向として、入力電圧を高くすると、Deep Sleep時の消費電流が減少するという、一見すると直感に反する結果が得られました。例えば、バッテリー端子では、3.0Vで81.5µAだった消費電流が、3.6V以上では約半分の41.5µAまで低下しています。

2. 3.3Vの魔境:給電経路で全く異なる挙動

今回、最も重要な発見は、3.3Vピン給電とバッテリー端子給電では、3.3V周辺の挙動が全く異なるという点です。

  • 3.3Vピン: 消費電流は、3.3V付近の非常に狭い範囲で、非線形かつ劇的に変動しました。3.30Vでは90.4µAだったものが、わずか0.05V高い3.35Vでは17.0µAという、他のどの条件下よりも低い突出した値まで低下しています。

  • バッテリー端子: 一方、バッテリー端子からの給電では、このような劇的な変動は見られず、電圧の上昇に伴って、比較的、滑らかに消費電流が減少していきました。これは、ボードに搭載されているLDOレギュレータが、入力電圧の変動を吸収し、常に安定した電圧をチップに供給しているためです。

この違いは、「どこから給電するか」が、消費電力の安定性に、極めて大きな影響を与えることを示しています。

3. Light SleepとDeep Sleepの越えられない壁

言わずもがなですが、Light SleepとDeep Sleepの消費電力には、3倍以上の圧倒的な差があります。RAMの状態を保持したまま高速に復帰できるLight Sleepは魅力的ですが、バッテリーの寿命を最優先するアプリケーションにおいては、Deep Sleepの活用が必須であることが、改めて浮き彫りになりました。

4. 幻の10µA

実は今回の検証中、3.3Vピンに3.310-3.320V付近の電圧を供給した際、ごく稀にですが、Deep Sleep時の消費電流が10µA以下まで劇的に低下する、という不思議な現象に遭遇しました。ただ、この現象は「ごく稀」と記載した通り、再現条件の特定はできませんでした。

5. LDOレギュレータへの逆流の疑い

バッテリー端子での消費電力は、事前の机上計算である40μAとほぼ整合していました。一方、3.3Vピンでの消費電力は、大きな開きが発生しました。これは仮説ですが、3.3Vピンでの入力の場合、LDOレギュレータへの逆流が発生し、無駄な電力消費が発生していたのではないかと考えています。そう考えると、3.3V周辺での不安定さや消費電流の劇的な低下も説明がつきそうです。

まとめ

今回の詳細なベンチマークを通じて、XIAO ESP32C3の消費電力、特にDeep Sleep時の挙動は、案外に繊細で、多くの示唆に富んでいることが明らかになりました。最後に、今回の検証で得られた重要な知見をまとめます。

1. 最も省エネなのは「3.4V以上の電圧」での給電

今回の測定結果から、3.3Vピンおよびバッテリー端子のいずれからの入力においても、Deep Sleep時の消費電流を最も低く、かつ安定させられるのは、3.4V以上(厳密には3.36V以上)の電圧で給電した場合であり、その値は約41µAでした。一方、それ以上電圧を上げても、消費電流の低下は見られませんでした。
バッテリーとして、CR123Aなどのリチウム1次電池を利用する場合、その電圧は3V前後となります。3VであればESP32自体は動作するため変圧せずに接続することが最もシンプルで効率的と考えられますが、3.4V以上に昇圧して利用したほうが、場合によってはトータルの消費電力は下げられる可能性があります。

2. 「3.3V」は、必ずしも最適解ではない

一般的に「3.3Vで動かす」とされがちなマイコンですが、今回の検証では、3.3V周辺は、むしろ消費電流が不安定になる「魔の領域」であることが判明しました。特に、3.3Vピンに給電する場合、設計者はこの不安定な遷移領域の存在を認識し、意図せず消費電流の高い状態でデバイスが動作してしまうリスクを避けるべきです。今回、言及はしていませんが、3.3V周辺でのDeepSleep中の消費電流は、非常に短い時間でスパイク的に高い値が高頻度で発生する傾向も有り、そのような面でも不安定な印象を受けました。

3. 「奇跡の低消費電力」を追わない

特定の入力電圧で得られた「17µA」や「幻の10µA」といった突出した低消費電力値は、非常に魅力的です。しかし、レンジも狭く、現段階では再現性の面で実用性は乏しいと考えています。

ファーストループテクノロジー株式会社

Discussion