machine.ADC 使い方
先の記事「ESP32のADC補正」で紹介した通り、個人的には少々大雑把な印象のあるADCですが、特性を理解して使う分には用途が広いと思います。最近では精度を要求するセンシングには、I2Cなどデジタル出力のセンサーを用いることが多いと思います。ESP32のADCは手軽に使える点を重視して、割り切って使うのが良さそうです。
基本的な使い方と、私の使用例を紹介します。
machine.ADC クラスをインポート
次のように、machineモジュールのADCクラスをインポートします。
from machine import ADC
ピンの割付け(オブジェクト作成)
ADCに特定の端子を割り付けてオブジェクトを作成します。
adc = ADC(Pin(32))
この例では、IO32をADCとして使用するオブジェクトを adc と言う名前で作成しています。以降adcにアクセスしてIO32のADCを動かします。
減衰率と分解能を設定
減衰率はADCの最小値(0)から最大値(分解能による)までの電圧を何ボルトにするか設定します。ESP32の外付け回路に合わせて減衰率を選択します。分解能は9,10,11,12bitsから選択できるようです。私は、あれこれ使い分ける必要を感じないので12bitsを使っています。
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_9BIT)
減衰率と信号電圧の関係は以下の通りです。
0~1V 0dB
0~1.34V -2.5dB
0~2V -6dB
0~3.6V -11dB
ただし、ESP32の電源電圧を超える信号電圧を加えないように回路を設計します。
測定値を読み出し
この例では変数 d に値を読み出しています。
d=adc.read()
実際の使用例
以下のようなclassを作って使っています。
端子割り付けのため、machine.Pinも必要だと思います。
ADCを使う度に減衰率やら調べなおさなくて良いように、if文が並んでいますが、ご容赦ください。
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
最後の read_adc()では「ESP32のADC補正」で紹介した補正を加えた値を返しています。
main では以下のようにオブジェクト ad を作成しています。
sub1 は前述のClassを含むファイルのインポート名です。
ad = sub1.adc() # ADC
ad.init_adc(34, 11, 12) # pin, attn, width
d = ad.read_adc()
とりあえず、これで動いています。
マイコンに興味のある同僚もおらず、独学なので修正すべき点など気が付かれましたら、教えていただけると助かります。
今後とも宜しくお願いします。
出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。