はじめに

今作っている水位計は乾電池で動いています.このため,どのくらい電池の持ちがあるのかを確認する必要がありました.たまたま秋月電商のサイトを見ていたらINA219という電流センサモジュールがあることに気が付いたため,こちらで電流ロガーを試してみることとなりました.この文書ではその手順について述べています.

環境

配線

こちらの図のように配線しました.

設定

こちらにあるサイトをもとに行いましたが,そこそこ変更しなければうまく動きませんでした.まずはINA219のラズパイ用ライブラリのインストールです.最近のpythonでは仮想環境で動作させることが多いのですが,ここでは仮想環境を作らずインストールしました.

sudo pip3 install pi-ina219 --break-system-package

次にサンプルプログラムをgithubからダウンロードしました.こちらのサイトにありますのでクローンしてください.クローンするとpi_ina219フォルダができます.その中にexample.pyがありますので実行しますがそのままではエラーが発生します.内容としてはI2Cバスの番号が正しくないようです.そこで/usr/local/lib/python3.11/dist-packages/Adafruit_GPIO/I2C.pyにあるget_i2c_device関数を改造します.こちらのサイトが参考になりました.ただしこちらのサイトでは仮想環境の場合のため,先ほどのフォルダと異なりますが編集内容は同様です.要点を下に示しておきます.

  • get_i2c_device関数を探す
  • if文2行をコメントアウト
  • return文の第2引数を"1"に変更

水位計に電源を入れると以下のようになりました.

2025-09-06 13:21:05,977 - INFO - INA219 gain set to 0.04V
2025-09-06 13:21:05,978 - INFO - INA219 calibrate called with: bus max volts: 16V, max shunt volts: 0.04V, max expected amps: 0.200A
2025-09-06 13:21:05,979 - INFO - INA219 max possible current: 0.400A
2025-09-06 13:21:05,980 - INFO - INA219 max expected current: 0.200A
2025-09-06 13:21:05,982 - INFO - INA219 current LSB: 6.250e-06 A/bit
2025-09-06 13:21:05,983 - INFO - INA219 power LSB: 1.250e-04 W/bit
2025-09-06 13:21:05,984 - INFO - INA219 max current before overflow: 0.2048A
2025-09-06 13:21:05,985 - INFO - INA219 max shunt voltage before overflow: 20.4800mV
2025-09-06 13:21:05,986 - INFO - INA219 calibration: 0xfffe (65534)
Bus Voltage    : 4.932 V
Bus Current    : 160.699 mA
Supply Voltage : 4.948 V
Shunt voltage  : 16.210 mV
Power          : 796.149 mW

 ロギングプログラム

example.pyをもとに,下に示すようなプログラムを作成しました.

#!/usr/bin/env python
from ina219 import INA219
from ina219 import DeviceRangeError
import time
import datetime

SHUNT_OHMS = 0.1

def read():
    while True:
        ina = INA219(SHUNT_OHMS)
        ina.configure()
        try:
            print("%s\t%.3f" % (datetime.datetime.now(), ina.current()))
        except DeviceRangeError as e:
            # Current out of device range with specified shunt resistor
            print(e)
        time.sleep(0.1)
if __name__ == "__main__":
    read()

 これを使ってロギングし,電圧の変化を調べてみたいと思います.