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ページは以下。

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. -...

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/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を複数持っているので、意外と簡単に電圧と電流の測定が出来る。

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

コメント

タイトルとURLをコピーしました