はじめに
今作っている水位計は乾電池で動いています.このため,どのくらい電池の持ちがあるのかを確認する必要がありました.たまたま秋月電商のサイトを見ていたらINA219という電流センサモジュールがあることに気が付いたため,こちらで電流ロガーを試してみることとなりました.この文書ではその手順について述べています.
環境
- コンピュータ: Raspberry Pi 3
- OS: Raspberry Pi OS(Bookworm)
- 電流センサモジュール: 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()
これを使ってロギングし,電圧の変化を調べてみたいと思います.
