A/D 変換 (MicroPython + Jupyter)
サーミスタとは
サーミスタは温度によって抵抗値が変化する素子である. 抵抗値は温度の関数として以下のような近似式で表現できる.

但し, R と Rref はそれぞれサーミスタの抵抗値と基準となる抵抗の抵抗値, B はサーミスタの種類によって決まる定数, T と T0 はそれぞれ温度と基準温度, である. 上式を温度について解けば以下のように書ける.

上式中の定数の値であるが, 学習ボードでは
- Rref = 10.0 kΩ
- T0 = 25 ℃
- B = 3435
となっている. あとは抵抗値 R の値が計測できれば温度が計算できる. 抵抗値 R を計算するために, 教育ボードでは以下のような回路が組まれており, Vref の値からオームの法則より R が得られるようになっている (図はITOC のチュートリアルより引用).

Vref を求めるプログラムを書けば, Vref より R が得られる.

ESP32 マイコンには ADC(アナログ・デジタル・コンバータ)が搭載されており, Vrefの値を簡単に計測することができる.
プログラムの書き方
MicroPython のリファレンスのADC(アナログ・デジタル変換) を参照する.
注意すべきことは, ESP32 マイコン自体は 2 つの AD コンバーターをサポートしているにもかかわらず, microPython では AD1 (GPIO 32 ~ 39) しかサポートしていないことである. このことは MicroPython のリファレンスのADC(アナログ・デジタル変換) に以下のように明記されていることからわかる.
ESP32 で ADC 機能はピン 32-39 で利用できます。デフォルト設定を使用する場合、ADC ピンの入力電圧は 0.0V-1.0V である必要があります(1.0V を超える値は 4095 となります)。この電圧範囲を広げるには attenuation (減衰率)を適用する必要があります。
サーミスタ温度計での測定
MicroPython のリファレンスのADC(アナログ・デジタル変換) を参照して以下のように書く.
1 from machine import Pin, ADC 2 from time import sleep 3 import math 4 5 # A/D 変換 6 adc = ADC(Pin(39)) 7 adc.atten(ADC.ATTN_11DB) 8 adc.width(ADC.WIDTH_12BIT) 9 10 #温度計測用変数初期化 11 B = 3435.0 12 To = 25.0 13 V = 3300.0 14 Rref = 10.0 15 16 while True: 17 val = adc.read() 18 voltage = val * 3600.0 / 4095.0 19 temp = 1.0 / ( 1.0 / B * math.log( (V - voltage) / (voltage/ Rref) / Rref) + 1.0 / (To + 273.0) ) - 273.0 20 print(val, voltage, temp) 21 sleep(10)
- 3 行目: log 計算があるので math を import.
- 6 行目: サーミスタが接続されているピンを指定
- 7 行目: 計測可能範囲を 0 ~ 3.6 V に設定.
- 8 行目: AD 変換の解像度の指定. 12 bit => 0 ~ 3.6 V の範囲を 0 ~ 4095 を対応させて計測.
- 11-14 行目: 温度計算に必要な変数の初期化
- 17 行目: 値の読み込み
- 18 行目: 読み込んだ値を電圧値に変換.
- 19 行目: 温度に変換
- 20 行目: 出力

課題
LED, スイッチ, サーミスタ温度計を使ったプログラムを作成せよ.
- 温度がある閾値を超えたら LED を点灯させてみよ. (サーミスタ温度計を触ると)