Arduinoなどのマイコンボードを使って何かしら回路を組む際に電圧や電流、また電力を計測出来れば便利な場合は多々あります。
例えばArduinoでモーターを制御する際に接続しているモータードライバにどれだけの電圧・電流が流れているのかを調べることにより、駆動に必要なバッテリースペックの選定や電源周りの回路構成を考える場合などで利用できます。
このような作業では、デジタルマルチメーター(テスター)を直接対象となる回路に接続すればもちろん計測は可能です。
また安定化電源を外部電源として使用して回路全体のおおまかな電圧・電流・電力を視覚的に確認することも出来ます。
計測方法はいろいろとありますが、Arduinoに接続して簡単に電圧や電流等を計測する手段として『INA219 電流センサーモジュール』を使う方法があります。
電流センサーとなるINA219チップを使ったモジュールは、測定結果をI2Cで接続したArduinoなどのマイコンボードで受け取ることが出来ます。
I2Cでのデータのやり取りで使えるモジュールなので、ArduinoとはSCL/SDAの2本の信号線の接続のみで使える電圧・電流の計測で使えるセンサーモジュールとなります。
専用のライブラリも用意されているので基本的な使用方法は簡単で、Arduinoを使った電圧・電流の測定や工作等で便利に使えるモジュールです!
電圧・電流センサーモジュール INA219の基本的な使い方!
Arduino単体で電圧だけなら簡単に計測する方法はあります。
Arduinoにはアナログ入力端子が用意されているのでこの端子を使った方法です。
Arduinoのアナログ端子は10ビットの分解能を持っています。
つまりアナログ端子にかかった0~5Vの電圧を0~1023までの数値に変換(ADC)して扱うことが出来ます。
しかし電流の計測はそう簡単には出来ず、テスターを使う場合も電圧計測とは違い接続が少し面倒となります。
そこでArduinoで簡単に電圧・電流を計測する方法として今回はINA219モジュールを使ってみたいと思います。
INA219センサーモジュール
こちらが『INA219モジュール』です。
INA219チップを搭載した電流計測モジュールとなり、電流は最大3.2A・DC電圧は最大26Vまで計測する事が出来ます。
電圧・電流・電力の計測などで使える便利なモジュールです。
接続した回路の電圧・電流を誤差±1%の精度で計測する事が出来ます。
オリジナルのモジュールはAdafruit製のものとなりますが、多くの互換(クローン)モジュールが販売されています。(上記写真のものは互換製品です)
いくつか互換モジュールを持っていますが、基本的に内部回路構成は簡単で使われているINA219チップも問題ないようです。
ただ使われているINA219チップには2つのグレードが存在します。
INA219AとINA219Bの2つのチップがあり、INA219Bチップの方が精度が高いようです。(±0.5%)
手元にあったモジュールは電子工作を始めた頃に購入したもので全てINA219Aチップを使ったモジュールでした。
最近販売されているモジュールはINA219Bチップに置き換わっているようですね!
INA219Bはチップサイズが小さくなっているのが特徴です。
誤差が0.5%ほど変わるようでこれは使用用途にもよりますが、Arduinoを使ったテストや工作で使うレベルでは全く問題にならないと思います!
各接続端子
ボードバージョンによって多少異なるかもしれませんが、各端子を見ておきます。
モジュール駆動用電源端子(VCC/GND)
モジュールを駆動するための電源端子です。
駆動電圧は3.3V~5Vとなっています。
ロジックレベルは3~5Vとなっているので、Arduinoの5V以外にESP系のマイコンボードでの3.3Vでも使用することが出来ます。
I2C端子(SCL/SDA)
INA219モジュールは計測したデータをI2C接続によりマイコンボードに送ります。
ボード内にI2C接続に必要なプルアップ抵抗(10kΩ)が接続されているので、SCL/SDA端子をArduinoの対応した端子に直接接続するだけで使えます。
電圧・電流計測用端子(Vin+/Vin-)
電圧・電流を測定したい回路をVin+端子とVin-端子間に直列で接続します。
Vin+/Vin-端子はターミナルブロックから接続することも出来ます。
ボードには測定用の0.1Ω(1%)のシャント抵抗(電流検出抵抗)が内蔵されています。
I2Cアドレスパッド
A0/A1の2つのアドレスパッドが用意されています。
I2Cアドレスを変えることにより最大4つのINA219モジュールを接続することが出来ます。
また他のI2C機器を同時に使用する際にアドレスを変更したい場合などでも使えます。
デフォルトのI2Cアドレスは0x40となっています。
アドレスパッドをはんだでショートすることによりI2Cアドレスを変更することが出来ます。
I2Cアドレス | A0 | A1 |
0x40(デフォルト設定) | ー | ー |
0x41 | ◯ | ー |
0x44 | ー | ◯ |
0x45 | ◯ | ◯ |
以上がINA219モジュールの端子となります。
ArduinoのI2C通信に関してはこちらの記事も参考にして下さい!
モジュールの回路構成
INA219モジュールの回路構成はこのようになっています。
モジュールを使用する場合、内部の回路がどのようになっているのか特に気にする必要はないのですが、電流の計測を行うモジュールなのでシャント抵抗について少し意識しておいた方がいいかもしれません!
回路の電流を計測するための抵抗器のことをシャント抵抗と呼びます。
詳しくは割愛しますが、電流の測定範囲を拡大するために分流器として電流計(ここではINA219チップ)と並列に接続する抵抗がこれにあたります。
INA219モジュールでは、測定対象の回路を接続する端子(Vin+/Vin-端子間)に並列に接続されています。
ライブラリの導入
INA219モジュールは用意されている専用ライブラリを使うことにより簡単にArduinoで使うことが出来ます。
まずArduino IDEにライブラリのインストールを行っておきます。
必要なライブラリは、「Adafruit INA219」ライブラリです。
Arduino IDEの[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理]へと進みます。
[INA219]で検索すると目的のライブラリが見つかります。このライブラリをインストールして準備は完了です。
ちなみにArduino IDE2.0以降では左側のメニューからライブラリマネージャを直接呼び出すことが出来ます。
接続
INA219モジュールとArduinoとの接続です。
INA219の駆動に必要な電源VCC/GNDはArduinoの[5V端子]から取り、I2C接続なのでSCL/SDA端子をArduinoの対応した端子に接続するだけなので簡単です。
あとは電圧・電流の計測したい対象回路をVin+/Vin-端子間に直列で接続するだけです。
Arduinoとの基本的な接続はこのようになります。
INA219モジュール | Arduino |
VCC | 5V |
GND | GND |
SCL | SCL |
SDA | SDA |
簡単なテストとして電池に繋いだLED点灯回路を接続してテストしてみます。
3.6Vのリチウムイオン電池に150Ω程度の抵抗とLEDを接続しただけの簡単回路です。
これをINA219モジュールのVin+/Vin-間に直列で接続します。
接続はこのようになります。
テストスケッチ
それでは上記回路に流れる電流と電圧を計測してみます。
Adafruit_IN219ライブラリをインストールすると電圧・電流等の計測で使えるサンプルスケッチが入っています。
分かりやすいようにこのサンプルスケッチに一部手を加えたこちらのスケッチを使ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | // Arduino入門編㉛ INA219モジュールを使い電流・電圧の計測を行う! // https://burariweb.info #include <Wire.h> // ライブラリのインクルード #include <Adafruit_INA219.h> Adafruit_INA219 ina219; // INA219オブジェクトの生成(アドレス0x40) void setup(void) { Serial.begin(115200); // シリアル通信の開始 ina219.begin(); // INA219との通信を開始(初期化) ina219.setCalibration_16V_400mA(); // 測定レンジの設定 //ina219.setCalibration_32V_1A(); //ina219.setCalibration_32V_2A(); } void loop(void) { float shuntvoltage = 0; float busvoltage = 0; float current_mA = 0; float loadvoltage = 0; float power_mW = 0; shuntvoltage = ina219.getShuntVoltage_mV(); // シャント抵抗間の電圧計測 busvoltage = ina219.getBusVoltage_V(); // 接続した回路の電圧計測 current_mA = ina219.getCurrent_mA(); // 電流の計測 power_mW = ina219.getPower_mW(); // 電力の計測 loadvoltage = busvoltage + (shuntvoltage / 1000); // 負荷電圧の計算 Serial.print("Bus Voltage: "); Serial.print(busvoltage); Serial.println(" V"); Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV"); Serial.print("Load Voltage: "); Serial.print(loadvoltage); Serial.println(" V"); Serial.print("Current: "); Serial.print(current_mA); Serial.println(" mA"); Serial.print("Power: "); Serial.print(power_mW); Serial.println(" mW"); Serial.println(""); delay(2000); } |
上記スケッチをArduinoにアップロード後、シリアルモニタを立ち上げるとINA219モジュールで計測した各項目が表示されます。
ライブラリで用意されている既存の関数を使うだけで簡単に計測できるのは便利ですね!
スケッチ解説
簡単にスケッチを見ていきます。
ライブラリのインクルード
ライブラリのインクルードおよびINA219クラスの設定です。
4 5 | #include <Wire.h> // ライブラリのインクルード #include <Adafruit_INA219.h> |
INA219オブジェクトはアドレスが指定されていない場合はデフォルトアドレスとなる「0x40」が使用されます。
6 | Adafruit_INA219 ina219; // INA219オブジェクトの生成(アドレス0x40) |
複数のINA219モジュールを接続する場合や、他のI2C機器との関係でアドレスを変更したい場合は指定することも出来ます。
Adafruit_INA219 ina219_A;
Adafruit_INA219 ina219_B( 0x41 );
INA219との通信を開始(初期化)
ArduinoとのI2C通信を開始(初期化)します。
11 | ina219.begin(); // INA219との通信を開始(初期化) |
測定レンジの設定
ライブラリには3つの測定レンジが用意されています。
12 13 14 | ina219.setCalibration_16V_400mA(); // 測定レンジの設定 //ina219.setCalibration_32V_1A(); //ina219.setCalibration_32V_2A(); |
デフォルト(何も記述しないと)、setCalibration_32V_2A();の設定となるようです。
今回はLEDでのテストなので計測範囲を狭めて分解能を上げています。
関数を使ってセンサーの値を読み取る
ライブラリにはセンサーの値を読み取るいくつかの関数が用意されています。
26 27 28 29 30 | shuntvoltage = ina219.getShuntVoltage_mV(); // シャント抵抗間の電圧計測 busvoltage = ina219.getBusVoltage_V(); // 接続した回路の電圧計測 current_mA = ina219.getCurrent_mA(); // 電流の計測 power_mW = ina219.getPower_mW(); // 電力の計測 loadvoltage = busvoltage + (shuntvoltage / 1000); // 負荷電圧の計算 |
①getShuntVoltage_mV();
モジュールに搭載されているシャント抵抗の両端で測定された電圧(mV)を測定する関数です。
つまりVin+端子とVin-端子間の電圧を読み取っています。
このモジュールには0.1Ω(100mΩ)のシャント抵抗が取り付けられているので、例えば1Aの電流が流れた場合1A × 0.1Ω = 0.1Vの電圧が検出されるということになります。
②getBusVoltage_V();
接続した対象回路の電圧の測定を行う関数です。
GNDとVin-端子間の電圧(V)を読み取ります。
③getCurrent_mA();
電流の計測で使われる関数です。
測定されたシャント電圧から算出された電流値(mA)となります。
④power_mW = ina219.getPower_mW();
電力値を計測する関数です。(mW)
⑤loadvoltage = busvoltage + (shuntvoltage / 1000);
こちらは関数ではありませんが、負荷電圧(loadvoltage)を計算しています。
負荷電圧(loadvoltage) = シャント電圧(shuntvoltage) + 回路側電圧(busvoltage)ということになります。
今回は電流値が小さいテストのためシャント電圧がかなり低い値となるため、負荷電圧(Loadvoltage) と回路側の電圧(Bus Voltage)がほぼ同じ値という結果になっています。
接続も簡単でライブラリで用意されている既存関数を使うことにより簡単に測定値を得ることが出来るのは便利ですね!
Adafruit_IN219 Arduinoライブラリーに関して詳細はこちらのサイトにまとめられているので参考にして下さい!
参考 Adafruit INA219 Arduino Library<br /> Adafruit GitHub測定レンジについて
INA219モジュールの測定レンジは特に指定しなければデフォルトで【ina219.setCalibration_32V_2A();】が使われ最大3.2Aまでの計測が可能となります。
INA219チップは内部に12bitのADCを搭載しているので、3.2A / 4096(2の12乗) = 0.8mAとなり3.2Aレンジでの分解能は0.8mAとなります。
3.2Aのような大きな電流を扱う必要がない計測では、レンジの設定を変更する事により分解能を上げることが出来ます。
今回最大電流400mAの設定【ina219.setCalibration_16V_400mA();】で行いました。
この設定では分解能は0.1mAまで精度を向上させることが出来ます。
ライブラリを使うと簡単に設定が変更できます。
【追記】INA219を使い負荷のリアルタイム電力表示が出来るUSB PD電源ボードを自作してみました!
PDトリガーチップにCH224Kを使い、INA219により負荷側の電圧・電流・電力をリアルタイム表示できるUSB PDトリガー電源ボードを作ってみました!
今回使ったアイテム
Arduino UNO
Arduinoはオープンソースハードウェアなので正規品以外にも互換品が多数販売されています。
互換品でも正規品と比べて特に問題なく使用でき安価なためArduino学習用としていいと思います。
Elegoo製のArduinoボードは、互換ボードの中でも非常にクオリティーが高く本家ボードと遜色なく使えるのでおすすめです!
Arduino スターターキット
これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。
私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)
そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)
参考 チュートリアルダウンロードELEGOO基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。
スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーやモジュールなど必要なものを増やしていくのがいいと思います。
最近の半導体不足による価格高騰によりArduinoボードも以前と比べ非常に割高感があります。
上記Elegoo製Arduino互換ボードも私が購入していた時より倍近くの価格まで高騰しているようです。
これからArduinoを始めてみようとお考えの方は、価格的にもお得感があるArduinoスターターキットから始めてみるのがいいかと思います。
INA219電流センサーモジュール
INA219電流センサーモジュールは、本家Adafruit製のものや数多く出回っている互換ボードも国内サイトで安価で入手でき電流・電圧計測で便利に使えます。
最後に!
Arduinoに接続した回路の電圧や電流を計測する手段としてINA219モジュールは非常に便利だと思います。
I2CでArduinoと接続して専用ライブラリを使うことにより簡単にArduino側で計測値の取得が出来るのがいいですね!
今回のLEDを使った簡単なテストでは計測する電流が小さいためか用意されている関数から取得された値は実測値から計算したものと比較すると少し誤差が大きい印象も受けますが、計測機器で得られるようなかなり正確な値を必要とする用途ではない限り一般的な用途では全く問題にならないレベルだと思います。
何か製作物のリアルタイムの電圧や電流、消費電力等をモニターしたいなどの用途で便利に使えると思います。
・・・というのも、現在USB PD電源から任意の電圧を取り出せる電源モジュール基板の製作を考えているのですが、リアルタイムで負荷電圧・電流等の監視でINA219チップが使えるなということでINA219モジュールを使いブレッドボード上でいろいろとテストをやっていました。
この投稿をInstagramで見る
最大26V/3.2Aまでの計測が行えるので、そこそこ大きな負荷にも対応する事が出来る便利なモジュールです。
miliohm の A4,A5 が逆でした。
こんにちは。
いつも参考にさせていただいております。さて今回INA219を使用するにあたり、下記のサイトの配線ではあA4,A5の配線が逆になっております。
ArduinoでINA219電流センサーを使用し、それを使ってDIY電力計を作成する方法
https://miliohm.com/how-to-use-ina219-current-sensor-with-arduino-and-make-diy-wattmeter-with-it/
【Arduino入門編㉛】INA219モジュールで電圧・電流を計測する基本的な方法!
https://burariweb.info/electronic-work/arduino-learning/arduino-ina219.html
ご検討いただけますと幸いです。
木内肇