概要
ここ数年、電子工作界隈にはIoTの流れがきていて、電子回路+ネットワークが簡単に扱える物が沢山増えてきています。
IoT機器において重要な要素の1つとして、省電力であることが挙げられます。
特に、電池で動作するIoT工作だと動作する時間を計算するのに、消費電力がどのぐらいなのか測定して計算する必要があります。
しかし、そういった省電力機器の消費電流測定は、一筋縄で行かないことが多いのです。
なぜIoT機器の消費電流測定が難しいのか
電池駆動のIoT機器の多くは、間欠動作をすることにより、消費電力を抑えている機器が多いです。
1日に1回起動し、あとはスリープして消費電流を抑える。
1時間に1回、1分に1回、10秒に1回......。
機器によって様々ですが、常に一定の消費電流であることのほうが少ないです。
また、
IoTデバイスの起動時とスリープの消費電流は、大幅に違います。
ESP32を例に取ると、上の写真を見れば分かる通り、
起動時に突入電流が、約1A近く流れ、その後、100mA~400mAで位置していますが、
deepsleep機能を用いてスリープさせると、なんと約10μA程度まで抑えることができます。
もっと省電力向きなマイコンだと数百nAレベルまで抑えられるそうです。
駆動時とスリープ時の電流の差が、1000倍以上なんてことはザラです。
短時間で、1000倍以上レンジの変化する電流の測定は、一般的な電流計(テスター等)だと不可能に近いです。
ほか選択肢として、オシロスコープが挙げられますが、高いですよねオシロスコープ。ほしいです(小声)
そんなときにはPPK2(パワープロファイラキットII)を使おう
PPK2とはNordic Semiconductor社の販売している、動的消費電力の計測を目的としたハードウェアです。
https://www.nordicsemi.com/Software-and-tools/Development-Tools/Power-Profiler-Kit-2
Nordic Semiconductor社は、超低電力(ULP) ワイヤレスチップを製造販売している会社で、有名なものとしてBLEマイコンのnRFシリーズがあります。
最近発売されたApple AirTagやMAMORIO等にそのnRFシリーズが使われているそうです。
PPK2の特徴は以下のとおりです。引用元(https://www.mouser.jp/new/nordic-semiconductor/nordic-power-profiler-kit-2/)
・カスタムボードに加えてすべてのNordic DKで瞬時および平均電流を計測
・0.8V~5.0V (ソフトウェア構成式)の可変電源電圧範囲
・最大1A電流計測
・最小200nAまでの正確な測定
・最小0.2µAの分解能
・100kS/sサンプリング速度
・最適な分解能を確実にする5通りの電流計測範囲の間での自動スイッチング
・±20%より優れた測定精度(平均電流計測)
・他のアプリケーションへのシンプルな移植が可能になるUSB通信
・計測解析のためのデスクトップ・アプリケーション
・リアルタイム電流計測ディスプレイ
・ローエンド・ロジック・アナライザ・サポート用の8つのデジタル入力
・デスクトップのパワープロファイラ・アプリ用のnRF Connectを介したサポート
・後処理を目的とした計測データのエクスポート
まとめると、IoT機器のダイナミックに変化する電流の測定に対応、リアルタイムで確認でき、電源供給もでき、計測データのログを取りエクスポート
さらに、8つのデジタル入力簡易ロジアナ付き。
至れり尽せりっていう感じですね。
値段及び入手先
これだけの機能がついていて、値段は約10,000円です。
安いと思うか高いと思うかは、人それぞれだと思いますが、少なくとも私はお買い得だと感じました。
私はdigikeyで購入しました、ほかにもMouserでも扱っているようです。
digikey
mouser
たまたま在庫切れのタイミングで注文してしまい、約1ヶ月待たされました。
ハード
1 .USB電源専用入力
電源入力用のUSB端子です。
接続しなくても動きますが、後述するソースメーターモード(PPK2から電源供給)で400mA以上使用する場合は、接続することが望ましいです。
2. 電源SW
PPK2の電源SWです。
3.USBデーター/電源入力
PPK2とPCとの通信用ポート
4.電流測定用端子類
GND:グランド
VIN:外部電源入力(電流計モードのみで使用)
VOUT:電源出力端子
5.デジタル入力ピン
8入力のデジタル入力ピン、簡易ロジアナとして使える。
ソフトウェア
PPK2はPCに接続して使用します。
その際に使用するソフトは、Nordic Semiconductor社の開発ツールソフトnRFConnectに含まれている、Power Profilerというアプリケーションを使用します。
ダウンロード先
nRF Connect for Desktop
https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Connect-for-desktop#infotabs
インストール後起動し、Power Profilerをinstallしましょう。
インストールするとOpenが押せるようになります。
ここでPPK2をPCに接続すると左上SELECT DEVICEから選べるようになります。
データロガーモードのみ軽く解説します。
1.MODE選択
Souce meter/Ampere meter: ソースメーターモードと電流計モードの選択
ソースメーターモードは、PPK2のVOUTから電源を供給します。供給した電流を測定できます。
電流計モードは、測定したい回路にPPK2のVIN-VOUTを直列につなぐことで電流計として使用できます。
Set supply voltage : ソースメーターモードにて供給する電圧を指定します。(0.8V~5V)
Enable power output : ソースメーターモードにて、電源出力のON/OFFができます。
2.サンプリングパラメーター設定
データーロガーモードのパラメータ設定です。
XXXXXX samlpes per second: 1秒間に測定する回数を指定できます。1回/秒~最大10万回/秒 まで指定できます。
samlpes for XXX seconds: ログを取る最大時間を指定します。
上記2つの設定によりログのデータ容量が計算され表示されています。
3.スタート
押すと測定がスタートします。
4.Display Options
右のグラフへの表示オプション設定です。
Timestamp: 右の測定グラフにタイムスタンプが表示されます。
Digital channels: PPK2のデジタル入力端子の情報を表示するかの設定です。
5.Save Export/Screenshot
Save Export: ロギングしたデータをCSV等で保存できます。
Screenshot: グラフ部分のスクリーンショットが撮れます。
6.DATALOGGER/REAL-TIME/ABOUT
DATALOGGER: データロガーモード、測定した電流をロギングできます。
REAL-TIME: リアルタイムモードにすると、測定データーがリアルタイムで表示されます。オシロスコープのように使用できます。
ABOUT: ソフトウェアバージョンや、PPK2の情報が見れます。
7.グラフ
LOCK Y-AXIS: 縦軸を固定できます。大きく電流変化する場合は、固定したほうが見やすいです。
10ms/100ms/1s/3s/10s/1min: 横軸の時間を変更できます。
LIVE VIEW: OFFにするとグラフの描画更新を止める事ができます。
電流グラフ: マウスドラッグで移動、マウスホイールで拡大縮小できます。
WINDOW: グラフに表示されている領域の平均電流、最大電流、時間、充電量(電流✕時間)が表示されます。
SELECTION: SHIFTを押しながらマウスドラッグで選択した領域の平均電流、最大電流、時間、充電量(電流✕時間)が表示されます。
8.デジタル入力
PPK2のデジタルに入力されたデジタル信号が表示できます。
表示するポートは、DIsplay Optionsで変更できます。
8.ログ出力
ログが表示されます。
Arduino (Nano)の消費電流を測定してみる
ATMEGA-328Pの搭載された5V仕様のArduino NanoにサンプルスケッチのBlinkを書き込んで測定してみます。
接続は以下の通り、ソースメーターモードで測定するため、VOUTとArduinoのVIN、LOGICPORTのD0をArduinoD13ピンに接続します。
Lチカ
#define LED_PIN 13
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay(1000);
}
Power Profilerの設定は、
・ソースメーターモード(5V)
・100000 samples per second
・Digitalcannels を0のみ表示
に設定しました。
PPK2で測定した結果は以下の通りです。
起動後1秒毎に電流が変化する様子が確認できると思います。
また下部のデジタル入力表示もそれに合わせて変化しています。
次にLチカ部を拡大2周期分選択してみます。
LED ON時の消費電流が約17mA
LED OFF時の消費電流が約14.5mA
平均して15.53mAであることが確認できます。
もし5V 2000mAhのバッテリーが存在して、このシステムを動作させた場合
2000[mAh]/15.53[mA]=128.78[h]=5.37[day]
ということで、約5日弱動作すると概算できました。
実際は、使用するバッテリーの時間率、電圧変化を考慮する必要があるため、この計算通りにはなりません
RaspberryPi picoの消費電流を測定してみる
Raspberripi pi picoを使用しCircuitPythonで内蔵LEDのLチカさせての電流を測定してみます。
接続は以下の通りです。VOUTからPICOのVSYSへ、GP25はピンアウトされていないようなので、LOGICPORTは未接続です。
Lチカ(CircuitPython)
from machine import Pin
import time
while True:
led = Pin(25, Pin.OUT)
led.value(1)
time.sleep(1)
led.value(0)
time.sleep(1)
Power Profilerの設定は、
・ソースメーターモード(5V)
・100 samples per second
・Digitalcannels 非表示
に設定しました。
LED ON時の消費電流が約21.5mA
LED OFF時の消費電流が約20.5mA
平均して20.89mAであることが確認できます。
ESP32の消費電流を測定してみる
ESP32(ESPr® Developer 32)では3パターン測定してみようと思います。
・ただのLチカ
・待ち時間にdeepsleepしてLチカ
・deepsleepしたままulp(コプロセッサ)でLチカ
回路は3パターンとも同じで以下のとおりです。VOUTは3V3端子に、内蔵LEDがないため、D13にLEDを接続しています。
fritzingライブラリをお借りしました。DEKOのアヤシいお部屋。
Power Profilerの設定は、
・ソースメーターモード(3.3V)
・100 samples per second
・Digitalcannels D0のみ表示
に設定しました。
1. まずただのLチカ
Lチカ
#define LED_PIN 13
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay(1000);
}
測定結果は以下の通り、
平均電流は38.83mAとなりました。
2. 1秒間待つ間deepsleepするLチカ。
Lチカ(deepsleep
#include "driver/rtc_io.h"
#include "esp_deep_sleep.h"
RTC_DATA_ATTR int bootCount = 0;
void setup() {
bootCount++;
rtc_gpio_init(GPIO_NUM_13);
rtc_gpio_set_direction(pin_led,RTC_GPIO_MODE_OUTPUT_ONLY);
if( bootCount% 2){
rtc_gpio_set_level(pin_led,0);
}else{
rtc_gpio_set_level(pin_led,1);
}
esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
esp_sleep_enable_timer_wakeup(1000000);
esp_deep_sleep_start();
}
void loop() {
}
測定結果は以下の通り、
プログラムの仕様上約1.1秒ごとのLチカになってしまいましたが、
平均電流は6.07mAとなりました。
3. deepsleepしたままulp(コプロセッサ)でLチカ
以下のプログラムを参考にさせていただきました。
Lang-ship ESP32でULPを使ったBlink その2と逆アセンブラ (https://lang-ship.com/blog/work/esp32-ulp-blink-2/)
github ESP32 ULP Debugger(https://github.com/tanakamasayuki/UlpDebug)
プログラムの内容は一切、理解ができておりません。ご了承ください。
Lチカの例
#include "esp32/ulp.h"
#include "driver/rtc_io.h"
// Slow memory variable assignment
enum {
SLOW_BLINK_STATE, // Blink status
SLOW_PROG_ADDR // Program start address
};
void ULP_BLINK(uint32_t us) {
// Set ULP activation interval
ulp_set_wakeup_period(0, us);
// Slow memory initialization
memset(RTC_SLOW_MEM, 0, 8192);
// Blink status initialization
RTC_SLOW_MEM[SLOW_BLINK_STATE] = 0;
// PIN to blink (specify by +14)
const int pin_blink_bit = RTCIO_GPIO13_CHANNEL + 14;
const gpio_num_t pin_blink = GPIO_NUM_13;
// GPIO26 initialization (set to output and initial value is 0)
rtc_gpio_init(pin_blink);
rtc_gpio_set_direction(pin_blink, RTC_GPIO_MODE_OUTPUT_ONLY);
rtc_gpio_set_level(pin_blink, 0);
// ULP Program
const ulp_insn_t ulp_prog[] = {
I_MOVI(R3, SLOW_BLINK_STATE), // R3 = SLOW_BLINK_STATE
I_LD(R0, R3, 0), // R0 = RTC_SLOW_MEM[R3(SLOW_BLINK_STATE)]
M_BL(1, 1), // IF R0 < 1 THAN GOTO M_LABEL(1)
// R0 => 1 : run
I_WR_REG(RTC_GPIO_OUT_REG, pin_blink_bit, pin_blink_bit, 1), // pin_blink_bit = 1
I_MOVI(R0, 0), // R0 = 0
I_ST(R0, R3, 0), // RTC_SLOW_MEM[R3(SLOW_BLINK_STATE)] = R0
M_BX(2), // GOTO M_LABEL(2)
// R0 < 1 : run
M_LABEL(1), // M_LABEL(1)
I_WR_REG(RTC_GPIO_OUT_REG, pin_blink_bit, pin_blink_bit, 0),// pin_blink_bit = 0
I_MOVI(R0, 1), // R0 = 1
I_ST(R0, R3, 0), // RTC_SLOW_MEM[R3(SLOW_BLINK_STATE)] = R0
M_LABEL(2), // M_LABEL(2)
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_DELAY(60000),
I_HALT() // Stop the program
};
// Run the program shifted backward by the number of variables
size_t size = sizeof(ulp_prog) / sizeof(ulp_insn_t);
ulp_process_macros_and_load(SLOW_PROG_ADDR, ulp_prog, &size);
ulp_run(SLOW_PROG_ADDR);
}
void setup() {
ULP_BLINK(1000000);
esp_sleep_enable_timer_wakeup(60 * 1000 * 1000); // wakeup(restart) after 10secs
esp_deep_sleep_start();
}
void loop() {
}
測定した結果が以下のとおりです。
平均0.5mA(514μA)まで抑えることができました。
最後に
実際に購入して使ってみて、計測可能な電流が1Aまでというのが多少ネックになると思っていましたが、省電力デバイスに限っての使用では十分な機能でした。
特に、ソースメーターモードで0.8V~5Vを自由に可変できる機能が、3.3V系マイコン、5V系マイコン両方で使用できる為とても便利に感じました。
自分の作ったデバイスの詳細な消費電流を知りたい方は、ぜひ使ってみてはいかがでしょうか。
本投稿の情報の利用、内容によって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。
投稿者の人気記事
-
sako_DIY
さんが
2021/05/23
に
編集
をしました。
(メッセージ: 初版)
-
sako_DIY
さんが
2021/05/23
に
編集
をしました。
-
sako_DIY
さんが
2021/05/23
に
編集
をしました。
(メッセージ: ulpでのLチカについて追記しました。)
ログインしてコメントを投稿する