温度を測る その1 アナログ・センサLM35DZを利用
■温度センサが必要
Arduino UNOで使われているマイコン内部には温度センサが入っていますが、Arduinoを作った人はあっさり切り捨ててしまいました。温度を測りたいときは、市販されている温度センサを購入します。センサには「アナログ出力」と「ディジタル出力」があり、Arduino UNOはいずれをつないでも温度を測れます。
●Arduinoの外部との接点がヘッダピン
マイコン・ボードArduino UNOにはプリント基板の両端にピンヘッダが並んでいます。このピンの順番は決まっています。なので、アナログ入力はA0につないで、というと、みんな間違わずにマイコンの「A-Dコンバータのチャネル0」に何かセンサをつなぐことができます。
マイコンはディジタルICなので、そのままではアナログ事象を扱えません。アナログをディジタルの値に変換できる機能を利用します。Arduinoにはその機能があります。
それぞれの役割を次の図に示します。I2Cバスは信号線2本で、SPIバスは信号線4本で通信するディジタル・デバイス用インターフェースです。バスには複数のデバイスをつないで使えます。A0からA5はアナログ信号の入力端子です。最大6本のアナログ出力のデバイスをつなげられます。
●アナログ出力の温度センサを選ぶ
Arduino UNOは電源電圧5Vで動くので、アナログ入力A0には、0Vから5Vの電圧を入力できます。5V以上はだめです。12Vとかつないではだめです。電圧が測りたいといってAC100Vは絶対にダメです。
温度センサの定番はLM35DZ(※3)です。安くて確度が高いです。あまりにも有名なので、偽物も出回っています。
このセンサ、とてもわかりやすいのです。次の写真のように5Vの電源をつないで、センサの出力をDMMで測ります。
約196mVです。これは19.6℃のことです。25℃なら250mVという電圧が出力されます。0℃のとき0Vで、1℃あたり10mVの電圧が発生します。零下を測りたいときには、マイナス電源が必要です。
STEP1 配線
Arduino UNOとセンサを導線でつなぎます。電気的につなぐことを配線するといいます。導線は電気を流す線で銅線です。
①ブレッドボードで配線 ②空中配線 ③はんだ付けで配線 |
最初、空中配線でチャレンジします。アナログ入力を一つだけ使うのは、このように簡単です。LM35DZのリードの根元はぜい弱なので、ラジオ・ペンチでゆっくりと曲げます。短いジャンパ線を使っていますが、市販品では10cmが入手できます(※2)。
回路図(※1)です。
STEP2 スケッチの動作確認
Arduinoのプログラム言語は、C言語とほぼ同じです。Arduino.ccのsoftwareのページに行きます。Arduino Web Editorをクリックします。はじめてならCreate New Accountで、二度目ならUsernameとPasswordを入れます。>詳細
動作の確認をします。Arduino UNOとPCをUSBケーブルで接続します。
Examplesから01.Basic->Blinkを選びます。
スケッチの上にある「→」右矢印をクリックします。これは、スケッチをコンパイルしてArduino UNOに書き込む手順を一気に行います。スケッチは、人が読み書きできる高級言語と呼ばれ、マイコンでは直接実行できません。まず、スケッチをC++言語に変換します。コンパイラgccでオブジェクト・ファイルを作ります。利用している関数に合わせてライブラリを取り込んで実行ファイル(バイナリ)が作られます。それをマイコンに書き込めるフォーマットに変更して、シリアル通信でマイコンのフラッシュ・メモリに書き込みます。そのあと、リセットすると書き込んだプログラムが動きます。この一連の作業をボタン一つで行います。
LEDが点滅しました。点滅しているLEDはディジタル・ポート13番につながっています。プログラムでは13番ではなくLED_BUILTINと書いてあります。5年ほど前までは13と書かれていたのですが、Arduinoにいろいろなバリエーションが出てきたので、このExamplesのBlinkのプログラムも修正されました。
34行目のdelay(1000) の1000=1秒を100= 0.1秒に変更します。「→」右矢印をクリックします。点滅のタイミングが変わりました。以上で動作確認ができました。
STEP3 初めてのスケッチ
New Sketchボタンをクリックします。スケッチを書く準備ができました。setup()には初期設定事項、loop()にはメインのプログラムを書きます。
でも、使えるものは使いましょう。Examples->0.1Basics->ReadAnalogVoltageを選びます。アナログ入力A0から電圧を読み取り、シリアル・モニタに結果を表示するという内容です。Arduino UNOには表示機能がありません。この連載では、キャラクタ表示LCDに測定結果を表示する予定です。開発に利用しているPCの画面に計測結果を表示するのがシリアル・モニタです。
コメントがたくさんあるので、全部消します。//からはコメントです。文頭に//があると、その1行は全部コメントです。スケッチの途中に//があると、そこから文末(リターン・コード、見えない)までがコメントです。/* と */に挟まれた部分はコメントです。
ここでは、まだLM35DZはつないでいません。A0からGNDにジャンパ線で配線します。
「→」で実行します。Monitorをクリックすると、Serial.println()の実行結果が見れます。A0の電圧は0Vですから、実行例もそのとおりです。
A0から5Vにジャンパ線で配線します。
「→」で実行します。実行例でも5Vが表示されています。
A0から3.3Vにジャンパ線で配線します。
「→」で実行します。3.3Vではないですね。プログラムが正しくないのか、3.3Vのピンヘッダに出ている電圧が3.3Vでないのかもしれません(※4)。
基準電圧として利用されている電源電圧をDMMで測定した5.09をプログラムに記入した測定結果です。3.3Vが得られました。一般的なDMMのほうが、10ビットA-Dコンバータより確度が高いので、このような修正が有効です(※5)。
ここで、USBケーブルを抜きます。LM35DZを接続します。USBケーブルを接続します。「→」で実行します。
12行目 voltageに100を掛けます。
Serial.print(voltage*100);
「→」で実行します。シリアル・モニタに温度の値が表示されました。
小数点以下は不要なので、四捨五入し、単位Cを付けます。print()は改行なし、println()は改行します。
温度センサLM35DZは±0.5℃の確度をもっています。Arduino UNOのアナログ入力端子は10ビットのA-Dコンバータを使います。変換時に基準電圧源は電源電圧の5Vを用います。したがって、最小の電圧は、
5[V] / 2^10 = 4.9[mV] |
です。LM35DZは1℃あたり10mVなので、Arduino UNOのアナログ入力端子は約0.5℃より細かな分解能はありません。したがって、小数点の位は意味がないので、四捨五入して整数の温度の値にします。どうしても小数点第1位まで表示したいときは、次のように記述します。
Serial.println( voltage*100,1);
round()はC言語にある関数です。上記の記述方法はC言語にはありません。%dとかのフォーマットも使えません。
(※1)電子工作では、今、動くことが大切です。この回路が10年間動き続ける保証は何もありません。電子機器は、電解コンデンサなど寿命のある部品を使うため、10年ぐらいが最長の保証寿命です。10年間動き続ける回路設計や部品の選び方は、ノウハウの塊です。この回路では、0℃->50℃->0℃を高速に変化させると、正しく温度の表示ができない可能性があります。ゆっくりと変化する室温などの測定では問題は出ないと思われます。
(※2)電子工作でプロトタイプを作るとき、ジャンパ線は欠かせません。できるだけ安価な製品を入手します。市販品では長さが10cm、15cm、20cmをよく見ます。色は7色ぐらいありますが、電源用に赤と黒はよく使うので、多めに購入します。両端についているコネクタは、オス-オス、オス-メス、メス-メスの3種類があります。
(※3)LM35DZのおもな入手先。秋月電子通商 マルツエレック 共立電子産業 RSコンポーネンツ 千石電商
(※4)利用しているArduino UNOの電源関係の電圧を測りました。Vinは4.55V、5Vは5.09V、3.3は3.30Vでした。A-D変換の基準は5.09Vです。
(※5)Arduino UNOのA-D変換で使われる基準電圧は、5Vの電源電圧がデフォルトですが、製品によって微妙に電圧が異なります。基準電圧をInternalにするという設定では内部の安定な基準電圧源が使えます。1.1Vですから細かくA-D変換ができますが、最大入力電圧は1.1Vになります。