A/D 変換 (mruby/c)
サーミスタとは
サーミスタは温度によって抵抗値が変化する素子である. 抵抗値は温度の関数として以下のような近似式で表現できる.
但し, R と Rref はそれぞれサーミスタの抵抗値と基準となる抵抗の抵抗値, B はサーミスタの種類によって決まる定数, T と T0 はそれぞれ温度と基準温度, である. 上式を温度について解けば以下のように書ける.
上式中の定数の値であるが, 学習ボードでは
- Rref = 10.0 kΩ
- T0 = 25 ℃
- B = 3435
となっている. あとは抵抗値 R の値が計測できれば温度が計算できる. 抵抗値 R を計算するために, 教育ボードでは以下のような回路が組まれており, Vref の値からオームの法則より R が得られるようになっている (図はITOC のチュートリアルより引用).
Vref を求めるプログラムを書けば, Vref より R が得られる.
ESP32 マイコンには ADC(アナログ・デジタル・コンバータ)が搭載されており, Vrefの値を簡単に計測することができる.
プロジェクトの準備
基本的に ESP-IDF 環境と同じなので, ESP-IDF 環境がインストールされているディレクトリ (ここでは $HOME/esp) 以下にプロジェクト用のディレクトリを作る. GitHub から j5_es_2020 ブランチを git clone する.
$ cd ~/esp $ git clone https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git mrubyc-03-adc $ cd mrubyc-03-adc
make menuconfig で “IoTeX ESP32 mrubyc Configuration” から ADC の項目にのみチェック入れる (課題を行うときは GPIO も必要になるが).
$ make menuconfig
サーミスタ温度計での測定
mrblib/loops/master.rb に以下のように書く.
1 # A/D 変換 初期化 2 adc = ADC.new( 39, ADC::ATTEN_11DB, ADC::WIDTH_12BIT ) 3 4 #温度計測用変数初期化 5 B = 3435.0 6 To = 25.0 7 V = 3300.0 8 Rref = 10.0 9 10 while true 11 voltage = adc.read() 12 temp = 1.0 / ( 1.0 / B * Math.log( (V - voltage) / (voltage/ Rref) / Rref) + 1.0 / (To + 273.0) ) - 273.0 13 puts "#{voltage} mV, #{temp} K" 14 sleep(10) 15 end
- 1 行目: インスタンスの作成.
- クラスの定義は mrblib/models/adc.rb
- 第 1 引数: サーミスタが接続されているピンを指定.
- 第 2 引数: 計測可能範囲を 0 ~ 3.6 V に設定 (ADC::ATTEN_11DB).
- 第 3 引数: AD 変換の解像度を 12 bit => 0 ~ 3.6 V の範囲を 0 ~ 4095 を対応させて計測 (ADC::WIDTH_12BIT).
- 4-8 行目: 温度計算に必要な変数の初期化
- 11 行目: 電圧値の読み込み
- 12 行目: 温度に変換
- 13 行目: 出力
コンパイルと実行を行う.
$ make $ make flash monitor
課題
LED, スイッチ, サーミスタ温度計を使ったプログラムを作成せよ.
- 温度がある閾値を超えたら LED を点灯させてみよ. (サーミスタ温度計を触ると)