はじめに
今作っている水位計は乾電池で動いています.このため,どのくらい電池の持ちがあるのかを確認する必要がありました.たまたま秋月電商のサイトを見ていたら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()
これを使ってロギングし,電圧の変化を調べてみたいと思います.