A/D 変換 (MicroPython + Thonny)

サーミスタとは

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

但し, 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 = ..... (自分で書く) .....
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 を点灯させてみよ. (サーミスタ温度計を触ると)