Contents
Youmile DR-YM-578
ラズパイで電圧モニターをするために、TI製INA3221が搭載されたYoumile製DR-YM-578を購入した。
残念ながら公式?HPは見つからず。
INA3221はI2C I/Fでアクセス可能な、3Chの電圧・電流モニターIC。
外付けのシャント抵抗の両端の電圧から電圧・電流、そして電力も測定してくれるらしい。
I2Cアクセス
ラズパイのI2C I/Fをまずは有効化するために/boot/firmware/config.txtの以下を編集してリブート。
|
1 |
dtparam=i2c_arm=on |
i2c-toolsをインストール
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
pi@raspberrypi:~ $ sudo apt-get install i2c-tools パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 状態情報を読み取っています... 完了 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libyuv0 これを削除するには 'sudo apt autoremove' を利用してください。 以下の追加パッケージがインストールされます: libi2c0 read-edid 提案パッケージ: libi2c-dev python3-smbus 以下のパッケージが新たにインストールされます: i2c-tools libi2c0 read-edid アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。 104 kB のアーカイブを取得する必要があります。 この操作後に追加で 787 kB のディスク容量が消費されます。 続行しますか? [Y/n] y 取得:1 http://deb.debian.org/debian trixie/main arm64 libi2c0 arm64 4.4-2 [9,736 B] 取得:2 http://deb.debian.org/debian trixie/main arm64 i2c-tools arm64 4.4-2 [78.8 kB] 取得:3 http://deb.debian.org/debian trixie/main arm64 read-edid arm64 3.0.2-1.1+b1 [15.3 kB] 104 kB を 0秒 で取得しました (398 kB/s) 以前に未選択のパッケージ libi2c0:arm64 を選択しています。 (データベースを読み込んでいます ... 現在 69602 個のファイルとディレクトリがイン ストールされています。) .../libi2c0_4.4-2_arm64.deb を展開する準備をしています ... libi2c0:arm64 (4.4-2) を展開しています... 以前に未選択のパッケージ i2c-tools を選択しています。 .../i2c-tools_4.4-2_arm64.deb を展開する準備をしています ... i2c-tools (4.4-2) を展開しています... 以前に未選択のパッケージ read-edid を選択しています。 .../read-edid_3.0.2-1.1+b1_arm64.deb を展開する準備をしています ... read-edid (3.0.2-1.1+b1) を展開しています... libi2c0:arm64 (4.4-2) を設定しています ... read-edid (3.0.2-1.1+b1) を設定しています ... i2c-tools (4.4-2) を設定しています ... man-db (2.13.1-1) のトリガを処理しています ... libc-bin (2.41-12+rpt1) のトリガを処理しています ... |
i2cdetectで使用可能なI2C番号を調べる
|
1 2 |
pi@raspberrypi:~ $ i2cdetect -l i2c-1 i2c bcm2835 (i2c@7e804000) I2C adapter |
1番しかない。
1番に繋がっている全I2Cデバイスを調べる。
|
1 2 3 4 5 6 7 8 9 10 |
pi@raspberrypi:~ $ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- |
INA3221のデフォルトのアドレスである0x40が見えている。
レジスタにアクセスしてみる。
INA3221のレジスタマップは以下。

2Byteデータなので、i2cgetにwオプションを指定する必要がある。
|
1 2 3 4 |
pi@raspberrypi:~ $ i2cget -y 1 0x40 0xFE w 0x4954 pi@raspberrypi:~ $ i2cget -y 1 0x40 0xFF w 0x2032 |
問題なし。
Pythonからアクセス
一から全て作るのはPythonではナンセンス。
どこかにINA3221のPythonパッケージがあるはず。
探していたら、PyPIにあった。
https://pypi.org/project/INA3221-linux/
pipでインストールしてみる。
|
1 2 3 4 5 6 7 8 |
i@raspberrypi:~/lib $ pip3 install INA3221_linux --break-system-packages Defaulting to user installation because normal site-packages is not writeable Collecting INA3221_linux Downloading ina3221_linux-0.1.0-py3-none-any.whl.metadata (15 kB) Requirement already satisfied: smbus2 in /usr/lib/python3/dist-packages (from INA3221_linux) (0.4.3) Downloading ina3221_linux-0.1.0-py3-none-any.whl (9.2 kB) Installing collected packages: INA3221_linux Successfully installed INA3221_linux-0.1.0 |
importしてAPIを叩くだけでよいみたいなので、以下を作成して動かしてみる。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import time from INA3221_linux import INA3221 # I2Cバス番号, INA3221スレーブアドレス bus = 1 dev = 0x40 ina = INA3221(address=dev, bus=bus) if ina.begin(): # 基本情報採取 conf = ina.get_configuration() print(f"Configuration: \t\t{hex(conf)}") dieid = ina.get_die_id() print(f"Die ID: \t\t{hex(dieid)}") mfid = ina.get_manufacturer_id() print(f"Manufacture ID: \t{hex(mfid)}") # MODE changes to 110 (Bus voltage, continuous) ina.set_configuration(0x7126) time.sleep(0.1) # CH3無効化 ina.disable_channel(2) time.sleep(0.1) # Average設定(1024) ina.set_average(avg=7) time.sleep(0.1) # バス電圧読出し for ch in range(2): volt = ina.get_bus_voltage(ch) print(f"{ch} : {volt} V") |
実行すると以下が表示
|
1 2 3 4 5 |
Configuration: 0x7127 Die ID: 0x3220 Manufacture ID: 0x5449 0 : 0.016 V 1 : 0.0 V |