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ページは以下。
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を複数持っているので、意外と簡単に電圧と電流の測定が出来る。
用途に応じて使い分ければ良いかなと思う。
コメント