質問編集履歴
1
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -67,3 +67,183 @@
|
|
67
67
|
|
68
68
|
オブジェクト指向でのスッキリしたプログラムの考え方をアドバイス頂けると幸いです。
|
69
69
|
|
70
|
+
### 2023/8/23追記
|
71
|
+
現状のクラス化のプログラム
|
72
|
+
```
|
73
|
+
# -*- coding: utf-8 -*-
|
74
|
+
'''
|
75
|
+
2023/7/1
|
76
|
+
TI製のIC「INA226」を使ったストロベリーリナックス製の
|
77
|
+
「INA226iso」を使った基本プログラム
|
78
|
+
2023/07/06
|
79
|
+
複数台に対応できるように汎用化している。
|
80
|
+
ファイルライトも各ファイルにて書き出し可能
|
81
|
+
|
82
|
+
I2C用のライブラリはsmbus2が主流らしいが、デフォルトではまだ入っていないので
|
83
|
+
smbusを使う。
|
84
|
+
|
85
|
+
後学の為に、冗長表現がある。
|
86
|
+
1.数値の桁数の操作
|
87
|
+
a.PrintResult()内で、print時にfloatの数字の小数点を3桁にしている
|
88
|
+
b.calcPower=f'{calc_pow(busvolt,calc_i):.4f}' で、printを使用しない場合での桁数を指定している
|
89
|
+
これは後からファイルライトしている。
|
90
|
+
'''
|
91
|
+
import smbus
|
92
|
+
import time
|
93
|
+
import datetime
|
94
|
+
|
95
|
+
import File_w_time as FW
|
96
|
+
|
97
|
+
i2c = smbus.SMBus(1) #I2Cチャンネルの指定(基本は「1」)
|
98
|
+
|
99
|
+
'''
|
100
|
+
ユーザーで変更するのは以下の4つだが、基本的には2つしか変更しない
|
101
|
+
1. INA226_ADDR_1 :デバイスの物理的なアドレス。ハンダでA1とA0をショートさせて16パターンから選ぶ
|
102
|
+
2. CONFIG_VALUE :AD変換の平均回数や返還時間のパラメータ変更
|
103
|
+
***複数台接続時のほとんどの場合は、デバイスアドレスのみを変更すればOK
|
104
|
+
∵AD変換の回数等は同じ場合が多い
|
105
|
+
以下の2つはストロベリーリナックスのモジュールについているシャント抵抗なので基本的には変更しない
|
106
|
+
3. SHANT_OHM_VALUE -> : IC内部演算で電流値や電力を計算するときに使う
|
107
|
+
4. SHUNT_OHM -> 手計算用 : get_result()内のcalc_curr()にて使用
|
108
|
+
'''
|
109
|
+
|
110
|
+
|
111
|
+
DIR_PATH = './log'
|
112
|
+
|
113
|
+
INTERVAL_MEAS = 1 #電力測定の間隔[s]。台数分の積が1サイクルとなる。例)2[s] x 7台 = 14[s] / 1サイクル
|
114
|
+
|
115
|
+
'''以下は変更しない定数'''
|
116
|
+
CONFIG_REG_ADDR = 0x00
|
117
|
+
SHUNT_V_RED_ADDR = 0x01
|
118
|
+
BUS_V_REG_ADDR = 0x02
|
119
|
+
POW_REG_ADDR = 0x03
|
120
|
+
CURR_REG_ADDR = 0x04
|
121
|
+
CAL_SHANTOHM_REG_ADDR = 0x05
|
122
|
+
|
123
|
+
|
124
|
+
class Ina226():
|
125
|
+
|
126
|
+
def __init__(self,dev_addr,conf,shant_ohm_hex,shant_ohm):
|
127
|
+
self.dev_addr = dev_addr
|
128
|
+
self.conf = conf
|
129
|
+
self.shant_ohm_hex = shant_ohm_hex
|
130
|
+
self.shant_ohm = shant_ohm
|
131
|
+
|
132
|
+
def read_ina226(self,dev_addr,reg_addr):
|
133
|
+
word = i2c.read_word_data(dev_addr, reg_addr) & 0xFFFF
|
134
|
+
digitresult = ( (word << 8) & 0xFF00 ) + (word >> 8)
|
135
|
+
return digitresult
|
136
|
+
time.sleep(0.05)
|
137
|
+
|
138
|
+
def write_ina226(self,dev_addr,reg_addr,code ):
|
139
|
+
i2c.write_i2c_block_data(dev_addr,reg_addr,code)
|
140
|
+
time.sleep(0.1)
|
141
|
+
|
142
|
+
def init_ina226(self):
|
143
|
+
self.write_ina226(self.dev_addr,CONFIG_REG_ADDR,self.conf)
|
144
|
+
self.write_ina226(self.dev_addr,CAL_SHANTOHM_REG_ADDR,self.shant_ohm_hex)
|
145
|
+
|
146
|
+
def get_result(self):
|
147
|
+
busvolt = self.conv_busbolt(self.read_ina226(self.dev_addr,BUS_V_REG_ADDR))
|
148
|
+
shuntvolt = self.conv_shuntbolt(self.read_ina226(self.dev_addr,SHUNT_V_RED_ADDR))
|
149
|
+
current = self.conv_curr(self.read_ina226(self.dev_addr,CURR_REG_ADDR))
|
150
|
+
power = f'{self.conv_pow(self.read_ina226(self.dev_addr,POW_REG_ADDR)):.3f}'
|
151
|
+
|
152
|
+
calc_i=self.calc_curr(shuntvolt,self.shant_ohm)
|
153
|
+
calc_power=f'{self.calc_pow(busvolt,calc_i):.3f}'
|
154
|
+
|
155
|
+
return [busvolt,shuntvolt,current,power,calc_i,calc_power]
|
156
|
+
|
157
|
+
def print_result(self,num,busvolt,shuntvolt,current,power,calc_i,calc_power):
|
158
|
+
print('----------%d台目の測定結果--------------'%num)
|
159
|
+
print(f'busvolt = {busvolt:.4f}[V] , shuntvolt ={shuntvolt:.4f}')
|
160
|
+
print(f'calc I = {calc_i:.3f}[A] , Meas I = {current:.3f}[A]')
|
161
|
+
print(f'calc W = {float(calc_power):.3f}[W] , Meas W = {float(power):.3f}[W]')
|
162
|
+
print('---------------------------------------')
|
163
|
+
|
164
|
+
def savedata(self,dir_path,prefix,calc_power,power):
|
165
|
+
texttime = datetime.datetime.now().strftime('%H:%M:%S')
|
166
|
+
addpath = FW.make_tspath(dir_path,prefix)
|
167
|
+
adddata = texttime +'\t'+ str(calc_power)+ '\t'+ str(power)+ '\n'
|
168
|
+
FW.faddtxt(addpath,adddata)
|
169
|
+
|
170
|
+
### get_result用の関数 ###
|
171
|
+
def conv_busbolt(self,digitval):
|
172
|
+
busvolt = digitval * 1.25 /1000 # digit unit is [mV] so, divided by 1000
|
173
|
+
return busvolt
|
174
|
+
|
175
|
+
def conv_shuntbolt(self,digitval):
|
176
|
+
shuntvolt = digitval * 2.5 /(1000 *1000) # digit unit is [uV] so, divided by 1000*1000
|
177
|
+
return shuntvolt
|
178
|
+
|
179
|
+
def conv_curr(self,digitval):
|
180
|
+
current = digitval *1.0 / 1000 # digit unit is [mA]
|
181
|
+
return current
|
182
|
+
|
183
|
+
def conv_pow(self,digitval):
|
184
|
+
power = digitval *25.0 / 1000 # digit unit is [mW]
|
185
|
+
return power
|
186
|
+
|
187
|
+
def calc_curr(self,shuntbolt,shuntorm):
|
188
|
+
#input unit is [v][Ohm] not [mV] and [mOhm]
|
189
|
+
calc_curr = shuntbolt / shuntorm
|
190
|
+
return calc_curr
|
191
|
+
|
192
|
+
def calc_pow(self,busvolt,current):
|
193
|
+
power = busvolt * current
|
194
|
+
return power
|
195
|
+
|
196
|
+
|
197
|
+
if __name__ == '__main__':
|
198
|
+
|
199
|
+
conf_list = [{'dev_addr':0x40,
|
200
|
+
'conf':[0x41,0x27],
|
201
|
+
'shant_ohm_hex':[0x0A,0x00],
|
202
|
+
'shant_ohm':0.002},
|
203
|
+
{'dev_addr':0x41,
|
204
|
+
'conf':[0x41,0x27],
|
205
|
+
'shant_ohm_hex':[0x0A,0x00],
|
206
|
+
'shant_ohm':0.002},
|
207
|
+
{'dev_addr':0x42,
|
208
|
+
'conf':[0x41,0x27],
|
209
|
+
'shant_ohm_hex':[0x0A,0x00],
|
210
|
+
'shant_ohm':0.002},
|
211
|
+
{'dev_addr':0x43,
|
212
|
+
'conf':[0x41,0x27],
|
213
|
+
'shant_ohm_hex':[0x0A,0x00],
|
214
|
+
'shant_ohm':0.002},
|
215
|
+
{'dev_addr':0x44,
|
216
|
+
'conf':[0x41,0x27],
|
217
|
+
'shant_ohm_hex':[0x0A,0x00],
|
218
|
+
'shant_ohm':0.002},
|
219
|
+
{'dev_addr':0x45,
|
220
|
+
'conf':[0x41,0x27],
|
221
|
+
'shant_ohm_hex':[0x0A,0x00],
|
222
|
+
'shant_ohm':0.002},
|
223
|
+
{'dev_addr':0x46,
|
224
|
+
'conf':[0x41,0x27],
|
225
|
+
'shant_ohm_hex':[0x0A,0x00],
|
226
|
+
'shant_ohm':0.002}
|
227
|
+
]
|
228
|
+
|
229
|
+
ina226_list =[]
|
230
|
+
|
231
|
+
for dev in conf_list:
|
232
|
+
new_ina = Ina226(dev['dev_addr'],dev['conf'],dev['shant_ohm_hex'],dev['shant_ohm'])
|
233
|
+
ina226_list.append(new_ina)
|
234
|
+
|
235
|
+
for dev in range(len(ina226_list)):
|
236
|
+
ina226_list[dev].init_ina226()
|
237
|
+
|
238
|
+
#print( ina226_list[1].dev_addr)
|
239
|
+
print(len(ina226_list))
|
240
|
+
|
241
|
+
while(True):
|
242
|
+
|
243
|
+
for dev in range(len(ina226_list)):
|
244
|
+
res = ina226_list[dev].get_result()
|
245
|
+
ina226_list[dev].print_result(dev,*res)
|
246
|
+
ina226_list[dev].savedata(DIR_PATH,dev,res[5],res[3])
|
247
|
+
time.sleep(INTERVAL_MEAS)
|
248
|
+
|
249
|
+
```
|