質問編集履歴

1

追記

2023/08/23 08:33

投稿

shinchoroX
shinchoroX

スコア18

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
+ ```