見出し画像

Class 初心者

長くアセンブラを使っていましたが、時代の流れに抗しきれず C(XC8)とPythonを使うようになりました。Classって敷居が高くて使い方が解りませんでした。アセンブラでは言ってみれば全てがGlobal変数で、 C(XC8)を使っても関数に引数を渡すことが少なかったのが実情でした。

アセンブラでも要素毎にファイルを分けて書く位のことはしていましたし、数人で(ファイル毎に)手分けして書いたこともありますが、小規模なマイコンではオブジェクト指向ってそんなに重要だとは感じていません。
必要に迫られてRaspberry Pi でPythonを使い始めた時も、勉強しているよりまずは動くソフトをと言うことで、global を多用して動かしました。Class 使わなくても動くプログラムが作れます!

一方で、プログラムを書く同僚が居ない現状とは言え、将来に備えてそれなりの体裁のソースコードを残すべきだと考えて無理にでもclass を使うことにしました。

使いながら感じ始めたClassの良さ

Class を使わなくても要素毎にファイルを分けたいが故に、スコープ範囲には時々悩まされて来ました。
まだまだ初歩的な使い方しか出来ていませんが、Class を使うことで大分楽になった気がします。具体的にどこがどう楽になったかを書ける程整理出来ていませんが、「あっ、なんか楽!」と感じる場面があります。

現状はこんな風に使っています

変な書き方だったら教えて頂きたいのですが、こんなコードを書いています。この例では---main.py と ---sub1.py の二つのファイルに分けていて、---sub1.py の方に class が複数並んでいます。
これらは MicroPython の例です。

---main.py の一部


import ---sub1 as sub1
 ad = sub1.adc()           # ADC
 ad.init_adc(34, 11, 12)   # pin, attn, width
 d = ad.read_adc()

---sub1.py の一部

from machine import Pin, ADC
class adc:          # ADC
 
 def __init__(self):
   self.pin = 34
   self.attn = 6
   self.width = 12
 
 def init_adc(self, pin, attn, width):
   # pin, attn, width
   # attn: 0 or 2 or 6 or 11
   # width: 9 or 10 or 11 or 12
   self.pin = pin
   self.attn = attn
   self.width = width
   
   self.adc = ADC(Pin(self.pin))
   if self.attn == 0:
     self.adc.atten(ADC.ATTN_0DB)      # 0-1V
   elif self.attn == 2:
     self.adc.atten(ADC.ATTN_2_5DB)    # 0-1.34V
   elif self.attn == 6:
     self.adc.atten(ADC.ATTN_6DB)      # 0-2V
   elif self.attn == 11:
     self.adc.atten(ADC.ATTN_11DB)     # 0-3.6V
     
   if self.width == 9:
     self.adc.width(ADC.WIDTH_9BIT)    # 9 bit
   elif self.width == 10:
     self.adc.width(ADC.WIDTH_10BIT)   # 10 bit
   elif self.width == 11:
     self.adc.width(ADC.WIDTH_11BIT)   # 11 bit
   elif self.width == 12:
     self.adc.width(ADC.WIDTH_12BIT)   # 12 bit
   
 def read_adc(self):         # ADC 読出し
   d = self.adc.read()
   res = int(0.9622 * d + 143.0 + 0.5)
   return res

最後の4行は先の記事「ESP32のADC補正」でも使いました。

明らかに楽なのはADCを複数CH使う時です。

---sub1.pyに追記することなく、---main.py に次のように書き加えるだけでIO33を使った2CH目のADCが使えるはずです。(動作未確認)
ad2 = sub1.adc()
ad2.init_adc(33, 11, 12)
d = ad2.read_adc()

やってみなけりゃ解らない

多分ですが、---sub1.pyを他の似たような用途で使った時にうまく動くのか、他の用途で---sub1.pyに書き加えたときはバージョン管理をどうするのかなど課題が出てくるのだろうと思います。

それでも「やってみなけりゃ解らない」とばかり、これからも突き進みます。


出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。