電圧や電流を計測したいとき、どのようにしていますか?
電圧だけであればテスターで簡単に測定できますし、電圧と比べれば少々面倒ですが電流の測定もさほど難しくはありません。しかし、電圧と電流を同時に測定したい場合は、マルチメーターが2つ必要になります。
バッテリーの充放電時の容量やその変化を確認したい場合はさらに面倒です。最も単純で正確な方法として、”4端子法で電圧と電流を測定しその様子をタイムラプスで撮影する”というものがあります。ただ、この方法では最終的にデータが欲しい場合には撮影したタイムラプス映像から値を読み取り、手作業で入力しなければなりません。
これはあまりにも面倒なので、精度は劣りますが電流・電圧を一定間隔でロギングするデバイスを作ります。主要部品は1000円程度、ケースを入れても2000円以下で作れます。
概要
INA219という電圧と電流が測定でき、I2Cで通信可能なモジュールを使用します。このモジュールをWemosD1mini(ESP8266搭載)で制御し、結果をWebサービスAmbientに送信してロギングを行います。
“Ambient”はデータを送り付けると自動的に記録、グラフ化してくれる非常に便利なサービスです。以下のサイトから登録(無料)すれば使用できます。基本的にはログインしたユーザーしかデータを見ることができないようになっていますが、設定をすれば公開することもできるサービスです。
無料のプランの場合、次のような制限がありますのでリンク先の規約をよくご確認ください。大雑把に説明すると
- 1アカウントにつき8チャンネルまで
- 1チャンネルにつき1日に3000件までデータを登録可能
などの制限があります。1日3000件までというのは時間間隔としては約30秒に1回です。今回は少し余裕をみて約60秒ごとに1回データを送信するようにしています。
Arduinoの場合、ごく簡単に使えるライブラリが用意されていますので簡単に使えます。アカウント登録とチャンネル作成をしたら、チャンネルIDとライトキーを確認しておいてください。
配線図
配線図は以下のようにします。INA219で測定される電圧(VBUS)は、INA219のV-とGND間の電位差を表していますので入出力の-側をGNDと接続しています。これで出力ジャック側につながっている負荷の電圧と電流を計測できます。
使用した部品
WEMOS D1 mini
ESP8266であればD1miniでなくてもよいのですが、”ESP-12F”と記載があるものでないと技適がありませんのでご注意ください。
Aideepen WeMos D1 Mini NodeMcu WiFi開発ボードESP8266 CH340GモジュールMicro USB付き、ESP-12F 3.3V 500...
INA219モジュール
秋月電子、ストロベリーリナックス、Amazon等で入手可能です。
必須部品は上記2点のみです。1セット分で1000円以下に収まると思います。
ケース
ケースはTAKACHIのMX2-8-7を使用しました。秋月などで売られているCタイプ基板(72×47mm)が差し込める構造になっていて、ジャックを設けるスペースも取れます。実装のイメージとしては以下の図のようになります。今回使用している部品の中で一番高価かもしれません。
その他
入出力のジャック部分はφ5.5/2.5の物を使用しましたが、各自の都合に合わせればOKです。
校正
デジタルマルチメーターを使ってINA219で測定した値を確認しました。電圧は概ね一致しましたが、電流については約1.25倍のズレ(INA219の測定値が大きい)ことがわかりましたので、この部分はESP8266内の処理で帳尻を合わせています。個体によってずれがあると思いますので必ず確認が必要です。
スケッチ
ArduinoIDEの[ファイル]-[環境設定]-[設定]-[追加のボードマネージャーURL]に
を追加し、[ツール]-[ボード]-[ESP8266 Boards]-[LOLIN(WEMOS) D1 mini(clone)]を選択してください。
スケッチの例を以下に掲載します。用意されているサンプルスケッチに少々手を加えただけのものです。Wifi接続のためのSSID/パスワードと、AmbientのチャンネルIDとライトキーは各自の値を用意してください。
また、AmbientとINA219を簡単に使用するため、以下のライブラリも追加してください。
#include <time.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <Ambient.h> #include <Adafruit_INA219.h> const int INTERVAL = 60000; //Wifi WiFiClient client; //自分のルーターのSSID const char* ssid = "xxxxxxxxxxxxxxxxxx"; //自分のルーターのパスワード const char* password = "xxxxxxxxxxxxxxx"; //Ambient Ambient ambient; // AmbientのチャネルID unsigned int channelId = xxxxx; // ライトキー const char* writeKey = "xxxxxxxxxxxxxxx"; //INA219 Adafruit_INA219 ina219; //時刻 time_t t_curr; time_t t_prev; void setup() { //Wifi接続 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(200); } //Ambient初期化 ambient.begin(channelId, writeKey, &client); //INA219初期化 Wire.begin(); ina219.begin(); //測定レンジの設定 ina219.setCalibration_32V_2A(); //setCalibration_32V_1A (); //setCalibration_16V_400mA (); //時刻設定 configTzTime("JST-9", "ntp.nict.jp", "ntp.jst.mfeed.ad.jp"); t_prev = time(NULL); } void loop() { float shuntvoltage = 0; float busvoltage = 0; float current_mA = 0; float loadvoltage = 0; float power_mW = 0; int sec = 0; shuntvoltage = ina219.getShuntVoltage_mV(); busvoltage = ina219.getBusVoltage_V(); current_mA = ina219.getCurrent_mA()/1.25;//電流値を補正 power_mW = ina219.getPower_mW() / 1.25;//電力値も補正 loadvoltage = (busvoltage + (shuntvoltage / 1000)); //時刻取得 t_curr = time(NULL); sec = t_curr - t_prev; t_prev = t_curr; //Ambientに出力 ambient.set(1, busvoltage); ambient.set(2, current_mA); ambient.set(3, power_mW); ambient.set(4, sec); ambient.send(); delay(INTERVAL); }
ESP8266の起動時にntpサーバーで時刻合わせを行っています。これは測定間隔を調べるのに使っています。
Ambientへのデータの送信は以下の部分です。
//Ambientに出力 ambient.set(1, busvoltage); ambient.set(2, current_mA); ambient.set(3, power_mW); ambient.set(4, sec); ambient.send();
ambient.setの1つ目の引数が、Ambientに設定している1番目のデータ、2つ目の引数が送信する値です。全てのデータがセット出来たら、ambient.set()で実際に送信します。
1日のデータ送信回数が3000件までと先述しましたが、1回に送るデータが何個でもambient.set()を1回使うと1カウントです。
ちなみに、Ambient上の設定は次のようになっています。1チャンネルにつきデータは8系列まで使えます。
実測
今回は以前紹介したLFPバッテリーの放電特性を計測してみました。14.6Vで満充電にした後、負荷としてミニPC(NUC6i5SYK)を接続しました。その結果はこちらです。Ambientでは測定データをCSVでダウンロードできるので非常に使い勝手が良いです。
グラフには掲載していませんが、測定ごとの時間間隔も記録してあるので、積算して電力量を見積もることも可能です。今回の場合、160Whでした。バッテリーの公称が153Whでしたのでまあまあの精度かなといったところです。小さい負荷でテストを行ったので容量が多めに出ているのかもしれません。
まとめ
いかがだったでしょうか。バッテリー関連のDIYをしていると、電流・電圧を同時に測定したいということが多かったので作ってみました。最近はオールインワンのICやそれを搭載したモジュールが安価に大量に売られているので簡単にこのようなことができてしまいます。
是非みなさんもお試しを!
コメント