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 を点灯させてみよ. (サーミスタ温度計を触ると)