「Arduinoの基礎 - 温度センサ」の版間の差分
編集の要約なし |
細 (文字列「source lang」を「syntaxhighlight lang」に置換) |
||
34行目: | 34行目: | ||
<br> | <br> | ||
<code>analogRead()</code>関数でTMP36からの電圧を取得して、SC1602に表示するサンプルコードは以下の通りである。<br> | <code>analogRead()</code>関数でTMP36からの電圧を取得して、SC1602に表示するサンプルコードは以下の通りである。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <LiquidCrystal_I2C.h> | #include <LiquidCrystal_I2C.h> | ||
157行目: | 157行目: | ||
温度センサに手をかざすと直ちに温度が上がり、手を離すと元の温度に下がることを確認する。<br> | 温度センサに手をかざすと直ちに温度が上がり、手を離すと元の温度に下がることを確認する。<br> | ||
[[ファイル:Arduino GY-906 2.png|フレームなし|中央]] | [[ファイル:Arduino GY-906 2.png|フレームなし|中央]] | ||
< | <syntaxhighlight lang="c++"> | ||
#include <Adafruit_MLX90614.h> | #include <Adafruit_MLX90614.h> | ||
#include <LiquidCrystal.h> | #include <LiquidCrystal.h> |
2021年11月15日 (月) 00:34時点における版
概要
ここでは、温度センサとして人気のあるTMP36とNTCサーミスタ(MF52-103)の使用方法を記載する。
また、赤外線温度センサモジュールGY-906についても併せて記載する。
TMP36
TMP36の概要
TMP36は、アナログ出力温度測定ICである。
サーミスタと違い、TMP36において、出力電圧が測定範囲(-40℃〜125℃)では10[mV/℃]とほぼ線形になる。
温度T[℃]は、次式で得られる。
… (1)
正確な計算式はデータシートを参照する。
TMP36のデータシートには次のような記載がある。
すなわち、TMP36では、1[℃]ごとに電圧が10[mV]上がり、オフセットが0.5[V]なので、Vout[V]は次式となる。
… (2)
この(2)式を整理すると、上の(1)式になる。
入力電圧Vsは、2.7[V]〜5.5[V]である。
TMP36の接続は下図の通りである。
下図の出力ピンであるVoutを、Arduinoで測定する。
また、パスコンは0.1[μF]のセラミックコンデンサを使用して、TMP36のVsに近い場所に配置する。
サンプルコード
Arduinoを使用してTMP36の出力を読む場合、アナログ入力値を読むことでできる。"Arduinoで電圧を測定する(アナログ入力を読み取る)"を参照すること。
analogRead()
関数の戻り値は、直ちに電圧が得られるわけではなく、0[V]から5[V](または、0[V]から3.3[V])が、0から1023の値となることに注意すること。
また、SC1602のI2Cアダプタを使用する方法については、"SC1602 I2Cアダプタを利用する"を参照すること。
analogRead()
関数でTMP36からの電圧を取得して、SC1602に表示するサンプルコードは以下の通りである。
<syntaxhighlight lang="c++"> #include <LiquidCrystal_I2C.h> const int PIN_TMP36 = 1; const int LCD_LEN = 16; LiquidCrystal_I2C lcd(0x27,16,2); void setup() { // LCD初期化 lcd.init(); lcd.clear(); lcd.backlight(); } void loop() { // TMP36から電圧を取得して温度へ換算 float a = (float) analogRead( PIN_TMP36 ); float v = a * 5.0 / 1023.0; float t = v * 100 - 50; // 温度の表示 char degree_symbol = (char) 223; String s = String(t, 1) + degree_symbol + 'C'; int pos = ( LCD_LEN - s.length() ) / 2; lcd.clear(); lcd.setCursor(pos, 0); lcd.print(s); // 3秒待つ delay(3000); } </source>
NTCサーミスタ
NTCサーミスタの概要
このセクションでは、NTCサーミスタを用いて、温度を測定する方法について記載する。
温度を測るアナログICとしては、上記セクションで説明したTMP36もあるが、サーミスタはより安価である。
このセクションで使用するNTCサーミスタは、MF52-103である。
サーミスタ(thermistor)の名前は、"thermal"(熱)と"resistor"(抵抗器)から由来で、温度変化によって抵抗値が変化する抵抗器のことである。
サーミスタの種類により、変化する温度で抵抗値はいくら変化する(または、抵抗値がいくら変化すれば温度はいくら変化する)という計算ができる。
サーミスタには大きく分けて、NTCタイプとPTCタイプの2種類ある。
NTCは温度の上昇と共に抵抗値が下がるタイプで、PTCはその逆で温度が上昇すると抵抗値も上昇するタイプである。
一般的に、サーミスタと言えば、NTCタイプのサーミスタのことを指す。
また、10[kΩ]のNTCサーミスタと言う場合、25[℃]の時に抵抗値が10[kΩ]であることを意味する。
温度の取得
NTCサーミスタでは、次式で温度が取得できる。
ここで、R0、T0は、それぞれ25[℃]での抵抗値[Ω]と温度[K]である。
… (1)
例えば、10[kΩ]のサーミスタを使用すると、R0は10[kΩ]、T0は298.15[K](=25[℃])である。
摂氏温度からケルビンに換算する場合は、273.15を加算する。
BはサーミスタのB値と呼ばれる定数で、サーミスタの種類ごとに異なる。Bまたはβとして、データシートに記載されている。
なお、MF52-103のB値は、3950である。
上記の(1)式をTについて解き、抵抗値Rの関数にすると次式(2)となる。
Tはケルビンで得られるので、摂氏への換算は273.15を減算する。
… (2)
抵抗値の取得
Arduinoを使用してサーミスタの抵抗値を取得する場合、抵抗値を直接測定することはできないが、電圧を測定して抵抗値に変換することでできる。
そこで、次のような分圧回路を構成して、Voutを測定する。
ここで、Rはサーミスタの抵抗値、R1は分圧測定のために導入した抵抗である。
例えば、10[kΩ]のサーミスタに対して、R1は10[kΩ]程度とする。
すると、出力電圧Voutの分圧式は次式(3)となり、この式をRについて解くと(4)式となる。
… (3)
… (4)
なお、この分圧回路で設定したR1をバランス抵抗という。
赤外線温度センサ(GY-906)
GY-906の概要
このセクションでは、非接触の赤外線温度センサモジュールGY-906を使用する方法を記載する。
GY-906は赤外線温度センサMLX90614を組み込んでいる。
MLX90614には多くのバリエーションが存在するが、ここでは、MLX90614ESF-BAAを使用する。
ESF-BAAの意味は、以下の通りである。
- E
- 動作温度範囲 -40[℃]〜85[℃]
- SF
- TO-39パッケージ
- B
- 動作電圧 3[V]
- A
- シングルゾーン(サーモパイル)
- A
- スタンダードパッケージ
動作電圧については、GY-906では内部電圧レギュレータが搭載されているので、MLX90614 "B"ではあるが、3[V]〜5[V]の範囲で使用できる。
GY-906の接続
GY-906のピン配置およびArduino Unoとの接続は、下図のようになる。
TO-39パッケージの突起から反時計回りに、SCL、SDA、VDD、GNDである。
GY-906との接続では、I2Cインターフェイス(SCL、SDA)を使用して、10[kΩ]のプルアップ抵抗が必要である。
なお、Arduino Unoでは、SDA、SCLはそれぞれA4、A5が割り当てられている。
また、温度測定の結果をLCD(1604A)に表示するので、その接続も必要である。
LCDとの接続については、Arduinoを用いてLCDに文字を表示を参照すること。
サンプルコード
ArduinoからGY-906を使用するため、Adafruit社が提供しているAdafruit MLX90614 Libraryを使用する。
Arduino IDEのメニューバー[Sketch] - [Include Library] - [Manage Libraries...]を選択する。
[ライブラリの管理]画面が起動するので、検索項目から"906"等と入力するとライブラリ一覧が表示される。
この一覧から、必要なライブラリをインストールする。リスト項目を選択して、リスト右側の[Install]ボタンを押下する。
温度センサに手をかざすと直ちに温度が上がり、手を離すと元の温度に下がることを確認する。
<syntaxhighlight lang="c++"> #include <Adafruit_MLX90614.h> #include <LiquidCrystal.h> Adafruit_MLX90614 mlx = Adafruit_MLX90614(); LiquidCrystal lcd(4,6,10,11,12,13); void setup() { mlx.begin(); lcd.begin(16,2); lcd.clear(); } void loop() { String line1 = "", line2 = ""; line1 = String(mlx.readObjectTempC(), 1); line1 += "[C]"; line2 = "Ambient: "; line2 += String(mlx.readAmbientTempC(), 1); line2 += "[C]"; lcd.clear(); lcd.setCursor(0,0); lcd.print(line1); lcd.setCursor(0,1); lcd.print(line2); delay(3000); } </source>