80LEDはそんなわけで前回で終了。今回からは新しい話である。前回はCPU負荷のLED表示、つまりArduinoを出力機器として使うという話だったが、今回は逆にArduinoを入力機器として使う方法を紹介したいと思う。

んで最初のお題は「温度ロガー」。何をするかというと、温度を測定して、それをPCで記録しようというものである。最近はあんまりやらずに済んでいるが、ちょっと前はよく「PCを動かしたときの各パーツの温度変動を測定する」とかいう話があって、サーミスタ式の液晶表示ができる温度計を山ほど並べて、一定時間毎にこれを目で読み出してノートに記録するという、なんというかなかなかに辛いベンチマークをしばしば強いられていた。この測定と記録を自動化しようというもの。

ちなみに筆者はそういう訳で1秒とかもっと少ない間隔でのサンプリングを考えているが、逆にもっと長期間のサンプリングも当然可能である。このあたりは当然スケッチやらプログラムやらのパラメータで調整できる話だ。

というわけで、まずはパーツ集め。メインとなるのはArduinoで、これはまぁ決定で、問題は温度をどうやって(どんなセンサーで)測定するかである。ネットなどではここで(最近TIが買収した)National Semiconductor(NS)社のLM35を使うケースが散見される。実際LM35でも良かったのだが、秋月電子通商に行ったらMicrochipのMCP9700という温度-電圧変換タイプの温度センサーが8つ\200で売られていたので、これを使うことにした。このMPC9700は外付け部品なしでも利用できるのだが、応答特性の改善に0.1μFのコンデンサを付加することが推奨されている。ということで0.1μFのセラミックコンデンサ(Photo02)も入手した。ちなみに大きさはこんな感じ(Photo03)だ。

Photo01: 通販ではこちら。ちなみにMCP9701というモデルもあり、こちらのほうが若干温度分解能が高く取れるが、両方使った感想で言えば「あまり変わらない」。重要なのは校正である。

Photo02: こちらは10個で100円。通販ではこちらだが、これはもう0.1μFのセラミックコンデンサなら何でもいい。電子パーツを扱っている店なら必ず在庫があると思われる。

Photo03: 大きさの対比のため、USBメモリと並べてみた。

さて、使い方である。MPC9700/9701のデータシートによれば、図1の様な形で利用することになる。今回は折角8個もMPC9700があることなので、Arduino Duemilanove/Uno/Uno SMDでサポートされている6ch分のAnalog Input全部につなげてみることにした。最終的な回路図はこんな感じ(図2)である。まずはブレッドボードに組んで、動作を確認してみることにしたいと思う(Photo04)。ブレッドボードの実体配線図は図3の通りだ。

図1:

図2:

Photo04: ブレッドボードに組んでみた図。GND側の共通配線は、写真で言えば一旦下端の共通部分に持ってきて、そこからもう一度Arduinoに引き戻しているので、ちょっとみっともないと言うか、配線が汚いがご容赦のほどを。

図3:

動作確認のスケッチはList 1の様になっている。とりあえずは動くことが確認できるかどうかだから、こんな程度で十分である。setup()の中は、表示用のSerial Portのボーレート設定のみである。loop()の方は2秒毎にAD0~AD5のポートからanalogRead()で読み出し、これをSerial.print()で表示するだけである。問題なく動けば、シリアルコンソールにはこんな具合(Photo05)に、各MPC9700から読み取った値が表示される筈である。ここでたとえばMPC9700を指で握ると数字が増え、逆にファンなどで風をあてて冷やすと数字が減ることが全部のMPC9700で確認できればとりあえずはOKである。

Photo05:

List 1:

#define BAUDRATE 9600
#define WAIT  2000

void  setup()
{
  Serial.begin(BAUDRATE);
}

void  loop()
{
  int  lpCnt;
  int  analogValue;

  delay(WAIT);

  for(lpCnt=0; lpCnt < 6; lpCnt++)
  {
    analogValue = analogRead(lpCnt);
    Serial.print(analogValue);
    Serial.print(":");
  }
  Serial.println("");
}  
 

さて、ここまでやってから次は座学である。MPC9700の場合、5VをVccに供給されると、温度に比例した電圧をVoutに出力するというもので、その電圧Voutは、

Vout=Tc×TA+V0℃

とされる。TAが現在のMPC9700の温度、Tcは温度係数、V0℃は0℃のときのMPC9700の出力電圧である。で、Tcは10mV/℃(typ)、V0℃は400mV(typ)というのがスペックである。(typ)、というのは「典型例」の意味で、おおむね10mV/℃なり400mVだけど、製品の個体差によるばらつきは多少差はあるよ、という事である。実際にPhoto05を見ると、157~162程度の範囲で数字がバラついているのが判る。これは製品の個体差によるものだ。

ところでこの電圧をArduinoはどう取り込むかだが、ArduinoのAnalog Inでは0V~5Vの範囲を1024段階で出力する。つまり0VならanalogRead()の戻り値は0、5Vなら1023になる。この関係を表にしたのが表1である。Photo05を測定中の室内温度は30℃をやや下回る程度で、おおむね数字もこれに沿ったものになっているが、これだけばらつきがあると、もう少しちゃんと校正を行わないと誤差がちょっと大きすぎる。といってもこのまま校正を掛けるのは至難の業なので、もう少し作業を進める必要がある。

■表1
温度(℃) MPC9700の出力電圧(mV) analogRead()の戻り値
-40 100 20
-35 150 31
-30 200 41
-25 250 51
-20 300 61
-15 350 72
-10 400 82
-5 450 92
0 500 102
5 550 113
10 600 123
15 650 133
20 700 143
25 750 154
30 800 164
35 850 174
40 900 184
45 950 195
50 1000 205
55 1050 215
60 1100 225
65 1150 236
70 1200 246
75 1250 256
80 1300 266
85 1350 276
90 1400 287
95 1450 297
100 1500 307
105 1550 317
110 1600 328
115 1650 338
120 1700 348
125 1750 358

(続く)