2010年1月25日月曜日

Arduinoで温度を計測する -1

この投稿は、建築発明工作ゼミ2009 『温度センサ』をもとに、新しく書き直したものです。

図1 温度センサ LM35DZ
温度センサ LM35DZを使用し、Arduinoで温度を計測してみます。
温度センサといっても、温度計のように温度を表示してくれるわけではありません。センサの三本足のうち、左側(+Vs)はArduinoの5V電源につなぎ、右側(GND)をArduinoのGNDに接続します。Arduinoにスケッチを送り込んで処理を開始させると、真ん中のVoutから、温度に応じた電圧を出力します。これを温度換算し、Arduino Serial Monitorで表示させてみるということです。

この温度センサLM35DZは、0℃で0V、1℃当たり10mVの出力が得られます。25℃だと250mV、100℃だと1000mV(1V)の出力が得られます。Arduinoのアナログ入力最大電圧は5Vなので単純計算で500℃まで計測できる計算になりますが、LM35DZ自体の計測範囲が-55℃〜+150℃なので、ここでは余裕をもって、0℃〜100℃までを計測範囲として回路を考えてみます。

まずは図1のような回路を組んでみます。

回路1
この場合、LM35DZのVoutを直接Analogピンに入れていますから、

0℃で0V、1℃当たり10mV増加
よって、100℃で1V

となります。
Arduinoのアナログ入力最大電圧は5V、取得値は0〜1023(1024段階)の数値として取得できます。
100℃・1Vだと 1024 / 5 で0〜203(204段階)。つまり、

0℃ 〜 100℃ [ 0V 〜 1V ] = 0 〜 203.8(Analog入力値)

の範囲の値を取得できます。1℃当たりの分解能は約2.048(上記のAnalog入力値は小数で書きましたが、実際には0〜203)。
/* 
  温度計測(0℃〜100℃)
*/

int   A_inPin = 0;  // アナログ入力ピン番号
float A_val;        // アナログ入力値(0〜203)
float tempC   = 0;  // 摂氏値( ℃ )

void setup()
{
  // シリアル通信速度
  Serial.begin(9600);
}

void loop()
{
  // アナログピンから計測値を取得(0〜203)
  A_val = analogRead( A_inPin );

  // 摂氏に換算
  tempC = ((5 * A_val) / 1024) * 100;

  // 改行しながら出力
  Serial.println( tempC );

  // 1秒停止
  delay(1000);
}
スケッチ

上記のスケッチをArduinoにアップロードして、シリアルモニタで確認してみます。
PCとArduino はUSB で接続した状態で、スケッチを実行させた後にArduino IDE の一番右上の 『Serial Monitor』ボタンをクリックすると、別ウィンドウでシリアルモニタが表示され、スケッチ中の Serial.print()関数で指定した変数の中身が表示されます。
ちなみに、Serial.print()Serial.println()の違いは、改行するかしないかです。

温度が一秒毎に出力されています。

  // 摂氏に換算
  tempC = ((5 * A_val) / 1024) * 100;


xV : 取得した電圧値
aVal : 取得したアナログ値(0〜1023)

とすると、

xV : 5V = aVal : 1024

となり、

xV = ( 5V × aVal ) / 1024

これを×100した数値が温度になります。
画像の温度値をみてもらうとわかるように、18.55℃、19.04℃、15.63℃を行ったり来たりしています。この中間の値(例えば15.3℃など)は、計測できても表示はできません。最大1Vを出力する温度センサの値に対して、Arduinoは最大5Vまで感知できます。1Vには204まで、5Vには1023までの値を取得できます。最大1Vまでしか感知しないような回路を組んでいたので、0℃〜100℃までの温度を、たった204段階でしか表現できないことになります。

100℃ / 204 = 0.4901...

つまり、取得するアナログ値1は0.49℃単位となるため、18.55℃〜19.04℃の中間の温度は表示できません。もっと精密に温度を計測するには、

0℃〜100℃ 0〜203(204段階)...Arduinoの感知電圧範囲0V〜1V

を、

0℃〜100℃ 0〜1023(1024段階)...Arduinoの感知電圧範囲0V〜5V

と、アナログ値1に対する分解能を上げてやります。
オペアンプを使って、温度センサの最大出力電圧1Vを5V、五倍に引き上げてみます。

1 コメント:

Unknown さんのコメント...

LM35温度センサをキャリブレーションしたいのですが、どういった方法がありますか?

コメントを投稿