Raspberry Pi CM4のI2CバスをLTC4331でLANケーブル延長してINA228で電圧・電流値を遠隔モニタ

I2C接続のINA228を搭載した電流・電圧・電力計モジュールを使って、真空管パワーアンプの845出力管のフィラメン端子にかかる電圧と電流値をモニタした際の作業メモです。
真空管パワーアンプの設置場所は離れているので、LTC4331モジュールとLANケーブルを使ってRaspberry Pi Compute Module 4(以下、CM4)のI2Cバスを3m先の真空管パワーアンプのシャーシ内部まで延長してINA228をI2C接続しています。

目次

準備したパーツ

真空管パワーアンプの左右チャンネルの電圧・電流測定用にストロベリー・リナックス製の INA228モジュールを2個、I2Cバスの延長のため LTC4331 絶縁型I2C延長モジュールを使いました。

#品名、仕様個数
1INA228 高精度I2Cディジタル電流・電圧・電力計モジュール
※電流は双方向最大70A、電圧は 85V
2
2LTC4331 絶縁型I2C延長モジュール(2個セット)
※マスター、スレーブセット(ジャンパパターンのはんだ付け)
※延長ケーブルには市販のLANケーブルを使いI2Cを延長
1
3LANケーブル(RJ45)3m
※LTC4331モジュールのマスターとスレーブ間の接続用
1
4GeeekPi Raspberry Pi 4 GPIOネジ留め式端子ハット1

INA228とLTC4331モジュールの組み立て、Python3で動作検証

CM4のI2C有効化

Raspberry PI OS の 苺マークのメニューから「設定 」–>「Raspberry PIの設定」の「インタ-フェイス」タブでCM4の「I2C」を有効化します。

I2Cの有効化
I2Cの有効化

モジュールの組み立て、ジャンパー線でCM4のGPIOに仮配線

LTC4331モジュール説明書 とINA228モジュール説明書の手順でモジュール基板上のジャンパーパターンをはんだ付けしてショートすることでマスタ/スレーブ設定、I2Cアドレス設定やプルアップ抵抗の有効化、Link LED点灯などを設定します。
CM4はI2Cバスにはプルアップ抵抗1.8kΩが実装されているので LTC4331モジュールのマスタ側のプルアップは不要ですが、スレーブ側はLTC4331モジュールの内蔵プルアップ抵抗(10KΩ)を有効化します。

CM4のGPIOから、I2C(SDA、SCL)、3.3V、GNDの4線をLTC4331モジュール(マスタ側) –> LANケーブル –> LTC4331モジュール(スレーブ側) –> INA228モジュールへと接続します。識別しやすいように、I2C(SDAは白のジャンバー線、SCLは緑のジャンバー線)、3.3Vは赤のジャンバー線、GNDは黒のジャンバー線としました。

LTC4331モジュールのマスタ側とスレーブ側をつなぐLANケーブルは、 通信用には4番線と5番線しか使いませんが、スレーブ側に接続する INA228モジュールに給電するために1番線に3.3V、2番線にGNDを追加で結線しました。

INA228モジュールは、電流測定用のISENCE+(黄色のケーブル)とISENSEー(青色のケーブル)、電圧測定用のV+(赤色のケーブル)とVー(黒色のケーブル)を被測定機器に太いケーブルで結線します。

CM4と LTC4331、INA228モジュールをジャンパーワイヤーで仮結線して動作確認
真空管パワーアンプに組み込む前に、CM4と LTC4331、INA228モジュールをジャンパーワイヤーで仮結線して動作確認。 真空管パワーアンプ内部に実装するパーツは LTC4331(スレーブ)以降のパーツ。 ケース実装用RJ45コネクタ でLANケーブルをシャーシ内部へ導入。

INA228モジュールのI2Cバスのアドレスは、モジュール基板上のジャンパーパターン(A1、A0) の組み合わせをはんだ付けして、0x40 (G、G)と0x41 (G、1) としました。

I2Cバスに接続されているデバイスを確認するには以下のコマンドを LXTerminalから入力します。

i2cdetect -y 1 


INA228 のI2Cバスのアドレス
INA228 のI2Cバスのアドレス

python3で確認プログラムを実行して動作検証

Texas Instrumentsのデータシート(7.6 Register Maps, p21)から、 電圧は 0x05の測定レジスタ、電流は 0x07の結果レジスタから取得(3バイト、20ビット有効)できます。
電圧は読み値に 0.1953125 をかけると mV の直読、電流は読み値に 0.15625 をかけると mA の直読となります。
Python3で簡単なプログラムを作って、Raspberry Pi OSにプリインストール されている「Thonny Python IDE」で動作確認しました。自作した845出力管用のフィラメント電源の電圧と電流の測定結果は10.44V、3.18Aでした。

電流測定の+-双方向対応やキャリブレーションレジスタは考慮していません。通信エラー(Clock Stretching)が起こる場合はi2c-gpioドライバ(ソフトウエアI2C)で回避できるようです。

INA228.py
ここをクリックするとコード表示を開閉できます。
#INA228.py
import smbus
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN
#Raspberry Piのi2cバス番号
i2c = smbus.SMBus(1)
#INN228のアドレス 0x40 or 0x41
addr = 0x40

#電圧測定レジスタの読み込み(3バイト、リスト形式 )
vol5 = i2c.read_i2c_block_data(addr, 0x05, 3)
#8ビットづつ左シフトとOR演算、4ビット捨て(20ビット)
vol5s = (vol5[0] <<16 | vol5[1] << 8 | vol5[2]) >> 4
#mV換算値をV表記、小数点以下3桁
vol5st = 0.1953125 * vol5s / 1000
vol5std = (Decimal(str(vol5st)).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP))

#電流結果レジスタの読み込み(3バイト、リスト形式 )
amp7 = i2c.read_i2c_block_data(addr, 0x07, 3)
#8ビットづつ左シフトとOR演算、4ビット捨て(20ビット)
amp7s = (amp7[0] <<16 | amp7[1] << 8 | amp7[2]) >> 4
#mA換算値をA表記、小数点以下3桁
amp7st = 0.15625 * amp7s / 1000
amp7std = (Decimal(str(amp7st)).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP))

#電圧、電流表示
print(vol5std , "(V)   " , amp7std , "(A)")
python3によるINA228レジスタの読み取りプログラム
python3によるINA228レジスタの読み取りプログラム

LXTerminalから下記コマンドで5秒間隔で連続測定します。

while true; do /usr/bin/python3 ./INA228.py; sleep 5s; done

真空管パワーアンプ内部へのスレーブ側モジュールの実装

パワーアンプにケース実装用RJ45コネクタを取り付けて20cm程のLANケーブルでシャーシ内部の LTC4331モジュール(スレーブ側)に接続 –> 左右チャンネルの845真空管のフィラメント端子近くに配置したINA228モジュールへとつなぎ、電圧・電流測定用のケーブルを結線すると完成です。

よかったらシェアしてね!
  • URLをコピーしました!
目次