稼働中

マイクロビット(c_11)INA219 用モジュール

INA219 (I2C) c_ina219_00.py

INA219は双方向電流を測定できるセンサです。※詳細はデータシートを参照ください。
MCP3004/3008で使う自作の’c_ina219_00.py’を作成しました。使い方だけを記載します。(※記事e_045を元にクラスにしました。)
‘c_ina219_00.py’は末尾にあります。使い方だけを記載します。

使い方

ファイル転送
micro:bitへ’c_ina219_00.py’を送った後でimportして使います。micro:bitに直接ファイルをアップロード出来ない場合(Thonny 3.1.12など)は、microfsなどを使ってアップロードします。
※microfsについては、当サイト内のこちらを参照ください。
※c_ina219_00.pyの末尾に、使用例(c_ina219_ex.py)の## example以降をコピペ追加しても動作確認できます。

メソッド
‘c_ina219_00’をimportすると「ina_cur, ina_vsh, ina_vbs, ina_conf,ina_pow」のメソッドが使えるようになります。

INA219(config_data=0x399f,sign_bit=16,i_max=3.2)で初期化します。
config_dataはINA219のConfiguration Registerにセットする値です。
sign_bitはPGAの設定に合わせた符号ビットです。
i_maxは想定される最大電流値(Maximum Expected Current)です。
※詳細はINA219のデータシートを参照ください。

(01)ina_cur()
電流値(mA)を返します。
(02)ina_vsh()
Rshの電圧値(μV)を返します。
(03)ina_vbs()
負荷の電圧(mV)を返します。
(04)ina_pow()
負荷の消費電力値(mW)を返します。
(05)ina_conf()
初期設定の値を返します。
[config, s_bit, IMAX, Rsh,Cur_LSB,Pow_LSB,CAL]が返ります。

使用例

電源DC 10V、負荷1.5kΩに流れる電流を測定しました。記事e_045と同じです。


c_ina219_ex.py
from microbit import i2c
from c_ina219_00 import INA219

## example ------------------
#i2c.init(freq=100000, sda=pin20, scl=pin19)
i2c.init()

# instance 測定値8回測定の平均値、想定最大電流1.5Aで初期化
a=INA219(0x1ddf,16,1.5) #(Defalt config_data=0x399f,sign_bit=16,i_max=3.2)

# read init data [config, s_bit, IMAX, Rsh,Cur_LSB,Pow_LSB,CAL]
l_sdat=a.ina_conf() 
print('set-data',l_sdat)

# Current
cur=a.ina_cur()
print('I(mA)=',cur)

# RSh voltage 
vsh=a.ina_vsh()
print('Vsh(uV)=',vsh)

# Bus voltage 
vbs=a.ina_vbs()
print('Vbs(mV)=',vbs)

# Power Bus voltage
pow=a.ina_pow()
print('Pow(mW)=',pow)

実行結果


>>> %Run c_ina219_ex.py
set-data [7647, 16, 1.5, 0.1, 4.57764e-05, 0.000915527, 8947]
I(mA)= 5.40161
Vsh(uV)= 539.999
Vbs(mV)= 8124.0
Pow(mW)= 44.8608
>>>

INA219用モジュール


c_ina219_00.py
# INA219 Bidirectional Current/Power Monitor With I2C
from microbit import i2c
class INA219:
    def __init__(self,config_data=0x399f,sign_bit=16,i_max=3.2):
        #addr=0x40  #slave address A1(GND)A0(GND)
        self.addr=0x40
        # MaxCurrent Rsh-ohm
        self.IMAX=i_max   # max_expect_current
        self.Rsh=0.1      # shunt register ohm        
        # LSB fixed value
        self.Vsh_LSB=10*10**-6   #Shunt voltage LSB 10uV fixed
        self.Bus_LSB= 4*10**-3   #Bus   voltage LSB 4mV  fixed

        # config setting config.pyでconfig s_bitを算出
        self.s_bit= sign_bit
        self.config= config_data  # default= 0x399F  8times-ave 0x1ddf
        self.w_reg(0x00,self.config) #Cfg=0x00 config-regi 設定     
        
        # Calc 各最小ビット値の計算
        self.Cur_LSB=self.IMAX/2**15
        self.Pow_LSB=20*self.Cur_LSB
        
        # calibrate register setting
        # Caliblation value
        self.CAL=int(0.04096/(self.Cur_LSB*self.Rsh))            
        #Cal=0x05 calibrate registerに書込み
        self.w_reg(0x05,self.CAL)

    # read init set data     
    def ina_conf(self):
        self.sdat=[self.config, self.s_bit, self.IMAX, self.Rsh,\
                     self.Cur_LSB,self.Pow_LSB,self.CAL]
        return self.sdat
        
    # read start register set
    def r_reg(self,reg):
        buf=bytearray(1)
        buf[0]=reg
        i2c.write(self.addr,buf)
        r_dat=i2c.read(self.addr,2)   # MSByte(0)LSByte(1)の2byte
        # 8bit*2>>16bit
        dat=r_dat[0]<<8 | r_dat[1]    # 2bytes 16bitデータにする
        #print('r_reg=',dat,hex(dat))
        return dat

    # signed data fugo keisan
    def sig(self,dat,num):
        if dat >= (2**(num-1)):
            dat=dat-(2**num)
        return dat

    # regi-pointer,dat=16bit>>8bit msb,lsb
    def w_reg(self,pointer,dat):
        buf=bytearray(3)        # pointer MSByte LSByte の3bytes
        buf[0]=pointer
        buf[1]=(dat>>8 & 0xff)  # MSB
        buf[2]=(dat & 0xff)     # LSB
        #print('w_reg=',hex(pointer),hex(dat),buf)
        i2c.write(self.addr,buf)

    # each calculation
    # 電流値測定 current reg*Cur_LSB
    def ina_cur(self):
        # Cur=0x04 currentReg signed
        self.cur=self.sig(self.r_reg(0x04),16)*self.Cur_LSB*1000 # mA signed 16bit
        return self.cur
    # シャント電圧測定 シャント電圧レジスタ*10uV
    def ina_vsh(self):
        #Vsh=0x01 shunt voltageReg signed uA
        self.vsh=self.sig(self.r_reg(0x01),self.s_bit)*self.Vsh_LSB*10**6        
        return self.vsh
    # バス電圧測定 バス電圧レジスタ*4mV
    def ina_vbs(self):
        #Vbs=0x02 bus voltageReg  [3:15] 読出し注意13bit
        self.vbs=(self.r_reg(0x02)>>3)*self.Bus_LSB*1000    # mV Vbs 13bit        
        return self.vbs
    # 電力測定 パワーレジスタ*Pow_LSB
    def ina_pow(self):
        #Pow=0x03 powerReg
        self.pow=(self.r_reg(0x03))*self.Pow_LSB*1000 # mW        
        return self.pow