編集履歴一覧に戻る
sako_DIYのアイコン画像

sako_DIY が 2021年05月23日19時07分16秒 に編集

ulpでのLチカについて追記しました。

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

セットアップや使用方法

本文の変更

# 概要 ![キャプションを入力できます](https://camo.elchika.com/3d3d5d6921cfa3d04d4ecdde397b77f7e1243fcf/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f39656134336434382d666238612d346334352d616230372d666536393436323538313166/) ここ数年、電子工作界隈にはIoTの流れがきていて、電子回路+ネットワークが簡単に扱える物が沢山増えてきています。 IoT機器において重要な要素の1つとして、省電力であることが挙げられます。 特に、電池で動作するIoT工作だと動作する時間を計算するのに、消費電力がどのぐらいなのか測定して計算する必要があります。 しかし、そういった省電力機器の消費電流測定は、一筋縄で行かないことが多いのです。 # なぜIoT機器の消費電流測定が難しいのか 電池駆動のIoT機器の多くは、間欠動作をすることにより、消費電力を抑えている機器が多いです。 1日に1回起動し、あとはスリープして消費電流を抑える。 1時間に1回、1分に1回、10秒に1回......。 機器によって様々ですが、常に一定の消費電流であることのほうが少ないです。 ![ESP32で5秒毎にwifiスキャンをするプログラム実行時の電流](https://camo.elchika.com/9b9f1948168014e416a93527df8ee9d6efbb7c44/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f66383065643036622d633636372d343936362d393863332d656433356439346133396435/) また、 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](https://www.nordicsemi.com/Software-and-tools/Development-Tools/Power-Profiler-Kit-2) @[youtube](https://www.youtube.com/watch?v=B42lPvkUSoc) ++Nordic Semiconductor社は、超低電力(ULP) ワイヤレスチップを製造販売している会社で、有名なものとしてBLEマイコンのnRFシリーズがあります。 最近発売されたApple AirTagやMAMORIO等にそのnRFシリーズが使われているそうです。++ PPK2の特徴は以下のとおりです。引用元([https://www.mouser.jp/new/nordic-semiconductor/nordic-power-profiler-kit-2/](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](https://www.digikey.jp/product-detail/ja/nordic-semiconductor-asa/NRF-PPK2/1490-NRF-PPK2-ND/13557476) [mouser](https://www.mouser.jp/ProductDetail/Nordic-Semiconductor/nRF-PPK2?qs=hd1VzrDQEGilgnS3iQ3EVw%3D%3D)** たまたま在庫切れのタイミングで注文してしまい、約1ヶ月待たされました。 # ハード ハードは以下の写真のとおりです。 ![キャプションを入力できます](https://camo.elchika.com/5bc8f6598e4a7b586fecee8df3e3e0de5e98aada/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f66643762633430322d633066372d346238382d396137352d366233663766356566343561/) **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](https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Connect-for-desktop#infotabs) ![キャプションを入力できます](https://camo.elchika.com/2d3fc43b7e59f4f0a848bf583c45af7101e04c7d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f30346630306664362d363962312d343062642d623663632d643464633635363062336462/) インストール後起動し、**Power Profiler**をinstallしましょう。 インストールするとOpenが押せるようになります。 ![キャプションを入力できます](https://camo.elchika.com/56b19e13257f381bad9e73980aea01a5943f0456/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f38376634303065652d306365312d346534372d393231632d396234383637663064303666/) ここでPPK2をPCに接続すると左上SELECT DEVICEから選べるようになります。 ![キャプションを入力できます](https://camo.elchika.com/6b9df03ce09bd40e588981601c22808f7727b01f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f33393330613436362d643534342d343832362d613864632d646631633461653862346637/) データロガーモードのみ軽く解説します。 **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ピンに接続します。 ![キャプションを入力できます](https://camo.elchika.com/fabab24d1a23a0081fdf293a38107a1cca96a202/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f61653634326431362d306662652d346135372d613136312d343638663730363138386536/) ```arduino: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で測定した結果は以下の通りです。 ![キャプションを入力できます](https://camo.elchika.com/490a5cbe5afb9b0ae0e011fb8b8f167f62f61113/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f31663031373762622d346431302d343164382d396633332d306633306630656235356334/) 起動後1秒毎に電流が変化する様子が確認できると思います。 また下部のデジタル入力表示もそれに合わせて変化しています。 次にLチカ部を拡大2周期分選択してみます。 ![キャプションを入力できます](https://camo.elchika.com/c1b4843fc49e67ccfa12f336af4c22bbd685a91c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f63353331653135632d363432632d343937652d623466302d363562383739313164643162/) 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は未接続です。 ![キャプションを入力できます](https://camo.elchika.com/0d7cf95cb3a2407265d961a0083cba87663f6302/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f35393235386339392d356336372d343130372d383031302d303834363233376331653431/) ```arduino: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 非表示 に設定しました。 PPK2で測定した結果は以下の通りです。 ![キャプションを入力できます](https://camo.elchika.com/6ad1aac144186f3aed0fcf7200aabae931e70085/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f64643036663033662d366335372d343632642d623061622d613138346232393461313261/) 拡大すると、 ![キャプションを入力できます](https://camo.elchika.com/bd3fef894dce03fe709a02614caa73988dd61585/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f36613933356237372d613964612d343539322d613562622d356539333339393432303438/) LED ON時の消費電流が約21.5mA LED OFF時の消費電流が約20.5mA 平均して**20.89mA**であることが確認できます。 # ESP32の消費電流を測定してみる ESP32([ESPr® Developer 32](https://www.switch-science.com/catalog/3210/))では3パターン測定してみようと思います。 ・ただのLチカ ・待ち時間にdeepsleepしてLチカ ・deepsleepしたままulp(コプロセッサ)でLチカ 回路は3パターンとも同じで以下のとおりです。VOUTは3V3端子に、内蔵LEDがないため、D13にLEDを接続しています。 fritzingライブラリをお借りしました。[DEKOのアヤシいお部屋。](https://ht-deko.com/) ![キャプションを入力できます](https://camo.elchika.com/8597ecbdad9644117ec0f2284f2ad62e96e28983/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f37643237633765622d613434302d346138322d623234322d383038363562313565373263/) Power Profilerの設定は、 ・ソースメーターモード(**3.3V**) ・100 samples per second ・Digitalcannels D0のみ表示 に設定しました。 **1. まずただのLチカ** ```arduino: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); } ``` 測定結果は以下の通り、 ![キャプションを入力できます](https://camo.elchika.com/d32fc3a2421e83031cce32ae75f1cb10da7127e9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f35313338316165662d373634622d343865632d383935342d613538623763303163313837/) 平均電流は**38.83mA**となりました。

-

**2. 1秒間待つ間deepsleep。**

+

**2. 1秒間待つ間deepsleepするLチカ。**

```arduino:Lチカ(deepsleep wait) #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() { } ``` 測定結果は以下の通り、 ![キャプションを入力できます](https://camo.elchika.com/06520ee6c3b55a6d0392cb8c63c48c9f80fe5670/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f35613366306434332d323830322d346633332d626630342d363364303636343635383637/) プログラムの仕様上約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) プログラムの内容は一切、理解ができてせん。ご了承ください ```arduino: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() { } ``` 測定した結果が以下のとおりです。 ![キャプションを入力できます](https://camo.elchika.com/94e61a69fc46f25363519735c3fbf7915f414f45/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39326264396664302d363263312d343039332d383234382d6532633630396638623839392f39363564666261332d393732642d343732312d613137662d653439306435316237323031/) 平均0.5mA(514μA)まで抑えることができました。

# 最後に

-

実際に購入して使ってみて、計測可能な電流が1Aまでというのが多少ネックなると思っていましたが、省電力デバイスに限っての使用では十分な機能でした。

+

実際に購入して使ってみて、計測可能な電流が1Aまでというのが多少ネックなると思っていましたが、省電力デバイスに限っての使用では十分な機能でした。

特に、ソースメーターモードで0.8V~5Vを自由に可変できる機能が、3.3V系マイコン、5V系マイコン両方で使用できる為とても便利に感じました。 自分の作ったデバイスの詳細な消費電流を知りたい方は、ぜひ使ってみてはいかがでしょうか。 ++本投稿の情報の利用、内容によって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。++