I2C接続の電流センサINA3221はINA219(以前の記事にてMicroPythonでの使い方をまとめた)の3回路版。AliExpressではセンサモジュール基板が200〜300円で売られている。
INA3221のMicroPython用ドライバは一応存在しているようだが、CircuitPythonの方が簡単に使えそうだったので実際に試してみた。
INA3221のCircuitPython用ドライバ
GitHubに登録されている。
サブディレクトリbarbudor_ina3221/の下にあるfull.pyもしくはlite.pyがドライバ本体で、それぞれ、
- full版(full.py): 低レベルレジスタにアクセスするための定数定義+アラームのためのAPIが含まれる
- lite版(lite.py): 基本のAPIのみ&定数定義も無し→メモリ使用量が少ない
PyPIにも登録されているので、Linux+Blinkaの環境ではpipで一発インストール可能だ。
pip3 install barbudor-circuitpython-ina3221
PythonプログラムからINA3221をコントロールする方法
INA3221クラスにはboard.I2Cクラスのオブジェクトを渡して初期化をする。INA3221クラスの主なメソッドは、以下の通り。
メソッド名 | 引数 | 機能 |
---|---|---|
コンストラクタ | I2Cオブジェクト | 初期化 |
enable_channel | チャネル番号 | チャネルの有効化 |
bus_voltage | チャネル番号 | バス電圧の測定(単位V) |
current | チャネル番号 | 電流の測定(単位A) |
コンストラクタは初期化済みのI2Cオブジェクトを引数に取り、各メソッドはチャネル番号を引数に指定して呼び出すことにより電流や電圧の測定を行う。
実回路で測定してみる
下の図のように、電源Vccから負荷抵抗RLに流れる電流をINA3221で測定する回路を組む。
Vccは安定化電源の出力約10V、RLは100Ωの抵抗とし、下の写真のようにみの虫クリップでINA3221のCH1に測定対象を接続して実回路を組んだ。安定化電源の電流表示はオームの法則通り、0.1Aを指し示している。
ラズパイとのI2C接続は以下のようにした。
SCL | SDA |
---|---|
GPIO3 | GPIO2 |
このような回路構成のもと、まずはラズパイ上のPython対話型インタープリタ上で測定を行ってみた。
オブジェクトの初期化
以下のコードを実行すると、INA3221クラスのインスタンスina3221が初期化される。
import board
from barbudor_ina3221.full import INA3221
i2c_bus = board.I2C()
ina3221 = INA3221(i2c_bus)
電流/電圧の測定
初期化が完了した後は、ina3221を介して各種測定が出来る。
チャネル番号ch(1〜3)の電流は、
ina3221.current(ch)
同様に、バス電圧は、
ina3221.bus_voltage(ch)
によってそれぞれ測定され、測定で得られた値がコンソール上に表示される。
1秒おきに電流と電圧を測定するプログラム
ドライバ付属のサンプルプログラムからエッセンスを拾ってシンプルにしたPythonプログラムは以下。回路を動作させながらプログラムを実行すれば、1秒おきにリアルタイムで各chの測定を行いprint文で電圧と電流の測定値を表示してくれる。
import time
import board
from barbudor_ina3221.full import INA3221
i2c_bus = board.I2C()
ina3221 = INA3221(i2c_bus)
ina3221.enable_channel(1)
ina3221.enable_channel(2)
ina3221.enable_channel(3)
mescnt = 0
while True:
if ina3221.is_ready:
mescnt += 1
print('======== Measure Count: {0} ========'.format(mescnt))
for ch in range(1,4):
volt = ina3221.bus_voltage(ch)
cur = ina3221.current(ch)
print('CH{0}: {1}V({2}A)'.format(ch, volt, cur))
time.sleep(1)
このプログラムを実行しながら、みの虫クリップを付け替えてINA3221の測定チャネルを切り替えると、該当チャネルの値が振れて正しく測定出来ることを確認出来た。
まとめ
CircuitPythonで3回路電流センサINA3221の動作を確認した。3回路同時に電流と電圧を測定出来るので、複数バッテリーを切り替えて使う時の電源管理とか、あるいは複数電圧出力のレギュレータのモニタとか色々使えそう。Linux上のPythonからも使えるので、今後重宝しそうだ。
コメント