2019年8月3日土曜日

RaspberryPI + INA219 を使って電圧、電流を測定する

 せっかくRaspberry PI に Zabbix という値を監視して、美しくグラフを描いてくれるツールを入れたので色々監視したくなってきた。

 I2Cの電流/電圧計と安いRaspberry PI Zero W とか使えばいいんじゃね?

 

これを使ってやりたい事

  • 鉛蓄電池の現在の電圧を知りたい

    自作の180Wソーラーパネル4枚 + MPTTチャージャー + 鉛蓄電池(でっかいの8台)+AC100Vコンバーター(サイン波)で自分の部屋の電気をまかなっている

    鉛蓄電池が11Vを切ると電池保護の為にAC100Vを出すコンバーターが出力を止めてしまうので切れる前にZabbixからメールを飛ばして「あと10分で電池切れ!」とかしたい

  • ニッカド電池の電圧を知りたい

    テスターだと解放電圧なので、10mAとか流しながら実測の電圧を知りたい

  • USB電力テスターは買った方が安くて高機能だが、作ってみたい

  • 温度センサーとか10℃でアナログ電圧の1V出すものがあるので水槽の水温とか測りたい

    いやーでもデジタル温度センサーのほうがいいかな..(DS18B20など)

     

とまぁいろいろ夢が膨らむので、まずは電流と電圧を同時に計測できる仕組みがほしい。

 

I2C対応の電流/電圧計

 amazonで見つけたのは5個で¥1,000-(@¥200-)のINA219 DC電流電源センサー(実は中華コピー品だった)

 ±3.2Aまでの電流、26Vまでの電圧測定ができるらしい。200円で。

 注目は±3.2A。ブラスマイナスとあるので、太陽光+充電池の充放電記録に使える!?

 正規のものは¥1,300もするけど、パチモンは¥200なのでそっちを買った。

 この基盤についてるシャント(shunt※)は、0.1Ωのチップ抵抗(!)を使っていて26V / 3.2Aとなんと83ワットも測れる。ほんとかね。まぁUSBの5V 2.4Aくらいなら持つだろう。

(※ shunt : 小さく正確な抵抗を電線の途中に挟んでその電圧差で電流を計る仕組み。主にDCで使うが100Aとかの電流も割と正確に、安価に測れる)

 

 

Rasberry PIの準備

 Raspberry PI3のI2C通信は2組あって1組目は

  • GPIO2(3番ピン)がデータピン (SDA)
  • GPIO3(5番ピン)がクロックピン(SCL)

 電源はラズパイの1番ピンに3.3VがでているのでこれをVCCとして使う。

 最初はpigpioを使ってI2Cを素でアクセスして値を取ろうとしたが、INA219は安い割にはやたらに高機能で、分解能優先、速度優先、消費電力優先、電圧電流アラート送信などいろいろ相反する設定があって、何をどう設定すれば正しく動作するんだか調べるのが面倒くさい。マニュアルぶ厚い。

 面倒くさいならどこかにライブラリがあると思ったので検索したらバッチリあった。

 ありがとうありがとう。

 pigpioとは違い、Raspberry PI のI2C機能をONにする必要がある。

 少し長めなので別blog (ラズパイでI2Cを使う )に切り出した。

 

gitからライブラリを手に入れる

Raspberry Pi Python Library for Voltage and Current Sensors Using the INA219

https://github.com/chrisb2/pi_ina219

このpython用のライブラリをpython3に組み込みむ。

# pip3 が入っていない場合は別途 apt install してください

apt-get -y install python3-pip


# git側ではpipコマンドを使ってますが、python3にも対応していたのでpip3で導入
# 万一古いのが入っているとダメになるらしく、念の為一度uninstallする必要があるらしい
sudo pip3 uninstall pi-ina219
sudo pip3 install pi-ina219

で、gitの例題をそのままコピー

遅くて分解能は低くなるかもしんないけど、全自動で値を読み取る、とREADMEに書いてあった

$ vi iv.py

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

SHUNT_OHMS = 0.1

def read():
    ina = INA219(SHUNT_OHMS)
    ina.configure()

    print("Bus Voltage: %.3f V" % ina.voltage())
    try:
        print("Bus Current: %.3f mA" % ina.current())
        print("Power: %.3f mW" % ina.power())
        print("Shunt voltage: %.3f mV" % ina.shunt_voltage())
    except DeviceRangeError as e:
        # Current out of device range with specified shunt resistor
        print(e)

if __name__ == "__main__":
    read()

 

何も繋がず実行してみる

$ python3 iv.py

Bus Voltage: 0.884 V
Bus Current: 0.000 mA
Power: 0.000 mW
Shunt voltage: -0.010 mV

Bus VoltageはV+を解放しているのでノイズを拾って0.8Vと出ているようだ。

 エラーが出た?

FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'

エラーがでた場合は、OSでI2CをONにしていないので、

sudo raspi-config で Interface Options→I2C をONにしてリトライ


それでも同じエラー

/frb/i2c-1 に読み取り権限がないのかもしれません

i2cグループに自分のID(というか読み取らせたい人)を追加します

$ sudo usermod -aG i2c 自分のID

例 : sudo usermod -aG i2c zabbix  (zabbix_agentに読み取らせたかった)
 


ラズパイの電圧を計る

INA219の V+ を RasPIの2番PINに接続する。

V-はどこにも繋いではいけない!!(これは罠だ!!)

V-にGNDを差してしまうと0.1Ωで電源をショートさせてしまう事になり回路が焼けてしまうだけでなく

最悪やけどを負ってしまう

V-は電流を測るためのマイナス方向への接続。

測りたい電池のマイナス側はラズパイのGNDに繋ぎます

アイソレーションの心配あるけど仕方ない

気を取り直してもう一度実行。

$ python3 iv.py 
Bus Voltage: 5.048 V
Bus Current: 0.000 mA
Power: 0.000 mW
Shunt voltage: 0.000 mV

電源電圧が 5.048V という事がわかった。

V-を使った電流を測定するような配線をする記事は別に書く事にする

 

複数同時接続も可能

INA219のI2Cアドレスは、データシートからは0x40,0x41,0x44,0x45 が選択できる。

https://www.adafruit.com/product/904

 デフォルトは0x40で基盤のADDR0,ADDR1をハンダでショートさせると4台までのINA219を1つのI2C線にぶら下げる事ができる。