CircuitPythonで3回路電流センサINA3221を動かす

I2C接続の電流センサINA3221はINA219(以前の記事にてMicroPythonでの使い方をまとめた)の3回路版。AliExpressではセンサモジュール基板が200〜300円で売られている。

https://www.aliexpress.com/item/4000341802106.html?spm=a2g0o.store_pc_allProduct.8148356.1.118f1261D7EaIl

INA3221のMicroPython用ドライバは一応存在しているようだが、CircuitPythonの方が簡単に使えそうだったので実際に試してみた。

スポンサーリンク

INA3221のCircuitPython用ドライバ

GitHubに登録されている。

GitHub - barbudor/CircuitPython_INA3221: A driver for INA3221 compatible with Adafruit's CircuitPython
AdriverforINA3221compatiblewithAdafruit'sCircuitPython-GitHub-barbudor/CircuitPython_INA3221:AdriverforINA3221compatiblewithAdafruit'sCircuitPython

サブディレクトリ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で測定する回路を組む。

INA3221接続図

Vccは安定化電源の出力約10V、RLは100Ωの抵抗とし、下の写真のようにみの虫クリップでINA3221のCH1に測定対象を接続して実回路を組んだ。安定化電源の電流表示はオームの法則通り、0.1Aを指し示している。

INA3221で電流測定

ラズパイとのI2C接続は以下のようにした。

SCLSDA
GPIO3GPIO2

このような回路構成のもと、まずはラズパイ上の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からも使えるので、今後重宝しそうだ。

コメント