[ラズパイ] 電圧・電流をラズパイで計測する(INA226・INA260)[コーディング編]

前回は、センサーとラズパイの接続まで紹介した。

ここからはやっと、コードを使って電圧・電流を読み取っていこうとおもう。

この辺が参考になるかなぁと思って、まずは上のサイトの通りに接続して電圧表示までしてみた。Muを起動して、Python3で

import smbus
 
i2c = smbus.SMBus(1)
word = i2c.read_word_data(0x41, 0x02) & 0xFFFF
result = ( (word << 8) & 0xFF00 ) + (word >> 8)
volt = result * 1.25 / 1000
print volt

たぶん、Python2で書かれたコードなのでprintをカッコでくくって変更しただけで動作した。正しい電圧をかえしている様子。しかし、電流値がわからない。計算が必要かぁ。もう、ビット演算とか覚えてないし、何をしているのかよくわからない。リファレンスを読んでみると

このあたりがヒントになりそうだけど、この後の説明がよくわかんない。というか、まじめに読んでたんだけど、だんだんこれ読むならライブラリ探したほうがはやくね?」と手抜き悪魔のささやきが・・・w

やっぱりというか・・・次の瞬間、リファレンスを読むのをやめて、上の2サイトを読んでました。上の方のサイトを読むと、adafruit-circuitpython-ina260のパッケージをPython3にインストールして以下のテストコードを動かすと書いてある。おそらくPython3のみの対応となっているみたいだが、そっちのほうが好都合~。

言われた通り、PyPIによるインストールを指示通りに進める(理解してないw)

sudo pip3 install adafruit-circuitpython-ina260

↑コマンドを叩いて(叩いてすらないコピペw)インストールできた。とくにエラーもなく進み下のコードをPythonエディッタに入れて実行してみる

import time
import board
import adafruit_ina260

i2c = board.I2C()
ina260 = adafruit_ina260.INA260(i2c)
while True:
    print("Current: %.2f Voltage: %.2f Power:%.2f"
        %(ina260.current, ina260.voltage, ina260.power))
    time.sleep(1)

電流、電圧、電力が表示された。手抜きで申し訳ないけどライブラリってほんと便利(感謝)。これに手を加えて、csvに記録できるように書いたコードがこれ。CSVの処理とか文字列フォーマット処理は調べた。他言語でも似たような処理なのでささっと書いた。

# -*- coding: utf-8 -*-
import csv
from datetime import datetime
import signal
import time
import board
import adafruit_ina260

REC_START_HOUR = 8
REC_END_HOUR = 18


def task(arg1, arg2):

    # 電流・電圧・電力の取得
    cur = ina260.current
    vol = ina260.voltage
    po  = ina260.power
    
    # 日時の取得
    _now = datetime.now()
    today = _now.strftime("%Y-%m-%d")
    nowtime = _now.strftime("%H:%M:%S")
    file_end = _now.strftime("%Y%m%d")
    
    print ('日付 %s 時刻 %s 電流 %.2f mA 電圧 %.2f V 電力 %.2f mW' % (today,nowtime,cur,vol,po))
    
    if REC_START_HOUR&amp;lt;= _now.hour &amp;lt; REC_END_HOUR:
        with open('/home/pi/Desktop/power/power_%s.csv' % (file_end),'a') as f:
            writer = csv.writer(f)
            writer.writerow([today,nowtime,cur,vol,po])
    else:
        print('記録時間外')

i2c = board.I2C()
ina260 = adafruit_ina260.INA260(i2c)

signal.signal(signal.SIGALRM, task)
signal.setitimer(signal.ITIMER_REAL, 0.1, 1) # コマンドラインでCtrl+Cで止められるように

while True:
    time.sleep(1)

雑なコードで申し訳ない。日毎にCSVファイルを作り、8時~18時までの計測値を一秒ごとに記録するスクリプト。お弁当箱に入れて、ずっとZeroで動かしているけど特に問題なく動いてる様子。

で、取得したデータをエクセルで処理した結果が隣。一日中晴天時の計測結果で良好に取れている様子。モバイルバッテリー側で充電を制御しているし、流れた電流がすべて充電で蓄えられているわけではないけど、目に見えるようになったのは、とても分かりやすい。データをためて色々見ていきたいと思う。

2 thoughts on “[ラズパイ] 電圧・電流をラズパイで計測する(INA226・INA260)[コーディング編]

Comments are closed.