温度センサー(LM61CIZ)の使い方2

〔Arduinoの動かせ方入門に戻る〕



前のページでは、温度センサー(LM61CIZ)をArduinoに配線して温度を測る事を行いましたが、
すこし精度が悪かったのでこのページで改善して見たいと思います。
方法は色々有ると思いますが、ここでは簡単な回路でオペアンプと抵抗で温度センサーの信号を増幅したいと思います。

手持ちで有るオペアンプはLM358Nだけなのでこれを使用します。
オペアンプの詳しい話は他のサイトを見て下さい、私しぃあまりよく分かっていないので.....(ToT)
こちらの「マイコン回路での入力信号増幅をオペアンプで行う方法」を参照すれば少しだけ詳しく乗っています。

また、前のページを見ていない人は、見てからこのページを見る様にした方が良いです。

Temp21  このLM61CIZセンサーは-30℃〜100℃を
 300mV〜1600mV(0℃=600mV)の範囲で
 出力し、1℃あたり10mV変化します。

 この左回路でLM61CIZの信号を2倍に
 増幅します。
 3倍にしたかったのですが、
 このオペアンプLM358Nは電源電圧5Vで
 出力電圧が3.5V(実測3.74V)までなので、
 3.5Vまでだと3倍増幅(900mV〜4800mV)
 で、56℃までしか測定できません。
 (外気温56℃は有得ないから良いかもね)
 2倍増幅で100℃=3.2VなのでOK、
 で2倍にしましたがまあぁ使えました。

  Temp25

LM358Nの下の青い2本のワイヤーについて
今回の様な実験程度の回路では配線の必要は無いと思いますが、
これは、LM358Nには2回路分のオペアンプが入っています、今回は1回路しか使用していません。
残りの1回路分の入力端子をそのままにしておくとノイズ等により動作して使用している回路に 悪影響を与える可能性が有るそうです。
それで、実際にはんだ付け等して基板を作成する場合は図(青線)の様に配線した方が良いでしょう。
また、LM358Nの電源端子8番と4番の間にバイパスコンデンサーとして0.1uFを入れましょう。

サンプルスケッチ
使用する場合はIDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
---------------------------------------------------------------------
void setup() {
     Serial.begin(9600) ;      // パソコン(ArduinoIDE)とシリアル通信の準備を行う
}
void loop() {
     int ans , temp , tv ;

     ans = analogRead(0) ;              // アナログ0番ピンからセンサー値を読込む
     tv  = map(ans,0,1023,0,5000) ;     // センサー値を電圧に変換する
     temp = map(tv,600,3200,-30,100) ;  // 電圧から温度に変換する
     Serial.println(temp) ;             // 値をパソコン(IDE)に送る
     delay(1000) ;                      // 1秒毎に繰り返す
}
---------------------------------------------------------------------
LM61CIZセンサーのみの出力では
 temp = map(tv,300,1600,-30,100) ; でしたね。300mV〜1600mVを-30℃〜100℃へ変換
今回オペアンプLM358Nで2倍にしたので
 temp = map(tv,600,3200,-30,100) ; です。600mV〜3200mVを-30℃〜100℃へ変換

3倍増幅でやって見ました
3倍にするにはR1の抵抗値を5kΩにしますが、5kはないので10kΩを2本並列に配線します。
(PS ってかR2を20KΩにした方がよくねぇ! おお、なるほどぉ)
温度の表示を少し変えて小数点も表示させて見ました。
---------------------------------------------------------------------
void setup() {
     Serial.begin(9600) ;      // パソコン(ArduinoIDE)とシリアル通信の準備を行う
}
void loop() {
     int ans , tv ;
     float temp ;

     ans  = analogRead(0) ;              // アナログ0番ピンからセンサー値を読込む
     tv   = map(ans,0,1023,0,5000) ;     // センサー値を電圧に変換する
     temp = fmap(tv,900,4800,-30,100) ;  // 電圧から温度に変換する
     Serial.println(temp) ;              // 値をパソコン(IDE)に送る
     delay(1000) ;                       // 1秒毎に繰り返す
}
float fmap(float x, float in_min, float in_max, float out_min, float out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
---------------------------------------------------------------------
fmap()は、map()関数をコピーしてfloat(実数)で計算する様にしただけです。 もちろん3倍にしたので
 temp = fmap(tv,900,4800,-30,100) ; 900mV〜4800mVを-30℃〜100℃へ変換ですね。
 オペアンプは3500mVの56℃まで正常に出力します。

結果

ArduinoIDEのシリアルモニター画面の表示です。
 Temp22  Temp23  Temp24
左がセンサーのみで、中央が2倍増幅、右側が3倍増幅
3倍増幅は21℃ですが、後日追加実験を行った為に温度が変わりました。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2011 Shigehiro Kimura All Rights Reserved.