MicroPythonでINA219電流センサを使う

INA219は±3.2A(0.1Ωシャント抵抗使用時)の電流を測定出来るI2C接続の電流センサで、MicroPython用ライブラリがGitHubに公開されている。このライブラリを使ってINA219で電圧・電流の測定を行ったので記事にまとめる。

スポンサーリンク

ESP32とINA219の接続

INA219はESP32のハードウエアI2C端子(18,19)と接続し、外部電源と負荷抵抗100Ωの回路をINA219のVin+,Vin-に繋いで回路に流れる電流と電源電圧を測定する。ついでにI2C接続のディスプレイSSD1306も接続して、ディスプレイにINA219による測定結果をリアルタイム表示してみる。

回路

INA219MicroPythonライブラリのインストール

INA219MicroPythonライブラリのGitHubページは以下。

GitHub - chrisb2/pyb_ina219: This library for MicroPython makes it easy to leverage the complex functionality of the Texas Instruments INA219 sensor to measure voltage, current and power.
This library for MicroPython makes it easy to leverage the complex functionality of the Texas Instruments INA219 sensor ...

git cloneでローカルに持って来る。

git clone https://github.com/chrisb2/pyb_ina219

ampyでライブラリをESP32本体にコピーする。

cd pyb_ina219
ampy put ina219.py

このライブラリはデバッグログ出力用のモジュールであるlogging.pyを内部で使っている。logging.pyそのものはMicroPython本家のGitHubリポジトリに置いてあるものの、MicroPythonの標準ライブラリではないため個別にダウンロードし、こちらもESP32本体にコピーしておく。

wget https://raw.githubusercontent.com/micropython/micropython-lib/master/python-stdlib/logging/logging.py
ampy put logging.py

サンプルプログラムを動かしてみる

サブディレクトリesp32にあるESP32用のサンプルプログラムを編集し、I2Cまわりを配線に合わせて変更する。

from machine import Pin, I2C
from ina219 import INA219
from logging import INFO

SHUNT_OHMS = 0.1

i2c = I2C(0)
ina = INA219(SHUNT_OHMS, i2c, log_level=INFO)
ina.configure()

print("Bus Voltage: %.3f V" % ina.voltage())
print("Current: %.3f mA" % ina.current())
print("Power: %.3f mW" % ina.power())

12VのACアダプタから外部電源を供給し、ampyで上記プログラムを実行すると以下のような結果が得られた。

$ ampy run example.py 
INFO:ina219:gain set to 0.04V
INFO:ina219:calibrate called with: bus max volts: 32V, max shunt volts: 0.04V
INFO:ina219:max possible current: 0.400A
INFO:ina219:current LSB: 1.220e-05 A/bit
INFO:ina219:power LSB: 2.439e-04 W/bit
INFO:ina219:max current before overflow: 0.3996A
INFO:ina219:max shunt voltage before overflow: 39.9598mV
INFO:ina219:calibration: 0x8333 (33587)
Bus Voltage: 11.408 V
Current: 113.793 mA
Power: 1298.293 mW

SSD1306ディスプレイに電圧・電流の測定値をリアルタイム表示する

以前の記事で、ESP32内蔵ADCで測定した電圧・電流のリアルタイム表示を行った。

この時のプログラムを改造して、INA219による測定結果をSSD1306にリアルタイム表示するプログラムに変更する。

from machine import Timer
from ina219 import INA219
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from logging import INFO

SHUNT_OHMS = 0.1

class MeasureIV(object):
    def __init__(self, i2c):
        self.ina = INA219(SHUNT_OHMS, i2c, log_level=INFO)
        self.ina.configure()
        self.val_v = 0
        self.val_mi = 0

    def measure(self, disp):
        disp.fill(0)
        disp.text('Voltage:%.2fV' % self.ina.voltage(), 0, 0);
        disp.text("Current:%.2fmA" % self.ina.current(), 0, 8);
        disp.show()

if __name__ == '__main__':
    i2c = I2C(0)
    oled = SSD1306_I2C(128, 64, i2c)
    ivmes = MeasureIV(i2c)
    oled.fill(0)
    oled.show()

    tim0 = Timer(0)
    tim0.init(period=500, callback=lambda t:ivmes.measure(oled))

上と同様12VのACアダプタを接続し、プログラムを実行しマルチメータの電流計と同時計測してみる。マルチメータが119mAの表示に対してINA219は112mAと出ており、少々誤差があるようだ。

写真

まとめ

ライブラリのお陰でMicroPythonでINA219を使うのはとても簡単。測定回路はINA219基板側に全て揃っており、マイコンとはI2C接続するだけで電流・電圧が測定出来るのも良い。

別記事でまとめた通りESP32は内蔵ADCを複数持っているので、意外と簡単に電圧と電流の測定が出来る。

用途に応じて使い分ければ良いかなと思う。

コメント