以前、別のブログに書いた消費電流モニターをAmbientでグラフ化するようにしました。

センサー端末のようなIoT機器を長期間バッテリーで動かすために、センサー端末の消費電流の振る舞いが知りたくなります。そこで、Arduino ESP8266と電流計モジュールINA226PRCを使い、ミリアンペア単位の電流値を数ミリ秒間隔で測定して、数十秒記録し、Ambientに送ってグラフ化する消費電流モニターを作りました。

電流計モジュール INA226PRC

電流値の測定にはストロベリー・リナックス社のINA226PRCというモジュールを使いました。

curlog1

これは電源ラインの中に小さな値の抵抗(シャント抵抗)を入れ、その両端の電圧を測ることでそこを流れる電流を測定するものです。INA226PRCのシャント抵抗は25mΩで、電流測定の分解能は0.1mAです。電圧の分解能は1.25mVです。

このモジュールに使われている電流センサーはテキサス・インスツルメント社のINA226というチップです。マニュアルによると、チップ自体に複数回測定してその平均をとる機能があり、回数は1回から1,024回まで設定できます。また1回の測定時間も140μ秒から8.244m秒まで設定できます。測定時間を長め目にしたほうがノイズの影響が低く抑えられるようです。ノイズ影響を極力抑えるためには、測ろうとする間隔の範囲内で測定時間×平均回数がなるべく長くなるようにするとよいとありました。例えば20m秒間隔で測定するなら、シャント抵抗両端の電圧値測定と電源電圧測定の時間を共に588μ秒にして16回測定して平均をとるようにすると、トータルの測定時間が(588μ秒 + 588μ秒) * 16 = 18.8m秒と20m秒に収まります。

ESP8266とINA226とはI2Cで通信します。回路図はとても単純です。

curlog2

 

できあがった消費電流モニターの写真です。写真の上の方がINA226PRCで、さらにその上に測定対象を接続します。

curlog3

プログラム

プログラムはGithubに公開しました。

Ambient_CurrentLogger

Ambientライブラリーのインストールは「Arduino ESP8266で温度・湿度を測定し、Ambientに送ってグラフ化する」をご覧ください。Ambientライブラリーをインストールすると、Arduino IDEの「スケッチの例」の一つとして「Ambient_CurrentLogger」もインストールされます。

消費電流モニターのプログラムは次のような流れです。

  • サンプリング間隔のタイマー割り込みを設定
  • タイマー割込み処理の中で電流値と電圧値を読み、電流値が±0.3mA以上になったら測定対象が動き出したと判断してバッファーに記録開始
  • バッファーが満杯になったら記録を終了し、タイマー割込みを解除
  • バッファー中のデーターをJSON形式に変換し、bulk_send()でAmbientに送信

プログラムには電流値、電圧値を記録するバッファーエリアと、それをJSON形式に変換するデーターエリアが必要になります。INA226の電流値と電圧値を保持するレジスターは16ビットなので、バッファーは電流、電圧、それぞれshortの配列にします。配列サイズ×サンプリング間隔が測定期間になります。

ESP8266のRAMはプログラムで使える領域が50kB程度です。バッファーサイズを調整した結果、バッファーは2,500件の配列にしました。5m秒間隔でサンプリングすると、12.5秒測定できます。

JSONデーターを保存するエリアは15,000バイト割り当てました。送信するJSONデーターは次のような形です。

    {
        "writeKey": "34928b3cd6b2517c",
        "data": [
            {"created": 0,"d1":413.6,"d2":4321.2},
            {"created":5,"d1":35.0,"d2":4512.5},
            {"created":10,"d1":24.2,"d2":4517.5},
            ...
        ]
    }

15,000バイトは約360件分のデーターに相当するので、測定データーを360件ずつJSON形式に変換してAmbientに送信します。Ambientの送信間隔はサーバー負荷を抑えるために最短5秒に制限されているので、5秒間隔で送信します。2,500件のデーターは7回に分けて送信するので、送信するのに30秒かかります。