マイクロビット(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