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のセラミックコンデンサなら何でもいい。電子パーツを扱っている店なら必ず在庫があると思われる。 |
さて、使い方である。MPC9700/9701のデータシートによれば、図1の様な形で利用することになる。今回は折角8個もMPC9700があることなので、Arduino Duemilanove/Uno/Uno SMDでサポートされている6ch分のAnalog Input全部につなげてみることにした。最終的な回路図はこんな感じ(図2)である。まずはブレッドボードに組んで、動作を確認してみることにしたいと思う(Photo04)。ブレッドボードの実体配線図は図3の通りだ。
Photo04: ブレッドボードに組んでみた図。GND側の共通配線は、写真で言えば一旦下端の共通部分に持ってきて、そこからもう一度Arduinoに引き戻しているので、ちょっとみっともないと言うか、配線が汚いがご容赦のほどを。 |
動作確認のスケッチはList 1の様になっている。とりあえずは動くことが確認できるかどうかだから、こんな程度で十分である。setup()の中は、表示用のSerial Portのボーレート設定のみである。loop()の方は2秒毎にAD0~AD5のポートからanalogRead()で読み出し、これをSerial.print()で表示するだけである。問題なく動けば、シリアルコンソールにはこんな具合(Photo05)に、各MPC9700から読み取った値が表示される筈である。ここでたとえばMPC9700を指で握ると数字が増え、逆にファンなどで風をあてて冷やすと数字が減ることが全部のMPC9700で確認できればとりあえずはOKである。
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 |
(続く)