目次
センサ 人間でいう感覚器官のようなもの
ここまでの技術部では、LEDの点灯制御、PWM制御による明るさ制御などを扱ってきました。そろそろ少しステップアップということで、センサを扱ってみたいと思います。
センサとは?
センサ(sensor)は、人間でいうと目、耳、鼻などの感覚器官の役割を果すもので、身の回りの様々な現象を感知することができます。自動ドアで人間を感知するものや、暗くなると自動的に点灯する街灯などがイメージしやすいですね。もちろん、人間には感知できない情報を捉えるセンサもあります。赤外線センサや超音波センサなどです。
センサとマイコンを組み合わせることで、電子制御の幅が大きく広がります。今回の技術部では、LM35という温度センサを用いてArduinoで温度測定をしてみます。
LM35
LM35の外観です。見た目はトランジスタとそっくり(というか同じ)なので、混同しないように注意が必要です。

秋月電子などで100円程度で購入できます。
LM35はArduino関連の書籍などにもよく登場するセンサで、その扱いやすさが特徴です。上の秋月のページからデータシートも見られますが、重要と思われる部分をピックアップしてみます。
・4~20Vの電源電圧で動作(つまり5Vで動く→Arduinoからの電源供給で使える)
・出力電圧は0mV+10mV/℃(気温0度で0mV、以降1度上昇毎に10mVづつ増加→リニアでわかりやすい)
・-55~+150℃まで測定できる(ただし精度は0.5℃程度→精密な測定には不向き)
というかんじです。ようするに値段が安くてデータの処理がわかりやすくてある程度広い範囲の温度が測れるよってことです。電子制御で気温を測ってみるにはちょうどいいセンサといえると思います。100円で買えるので、間違って破壊しても精神的ショックが少なくすみます(重要)
また、データシートをみるとわかりますが、このLM35は様々なパッケージのものがあって、金属制のものやICチップ状のもの、色々です。形状によってピンの配置が違うので逆電圧をかけないようによく確認して下さい。(壊れると精神的ショックが)
余談 細かい話
このセンサ、気温1度毎に出力電圧が10mVずつ上昇するので、出力電圧の値をArduinoで読み取ってやればそこから気温が計算できる、という仕組みです。ということは、Arduinoでやることは「電圧の大きさを読み取る」ということになります。
Arduinoで電圧を読み取る A/D変換
Arduinoで電圧の大きさを読み取るためには、A/D変換という方法を使います。(アナログ-ディジタル変換)
読み取る電圧はアナログ量、一方Arduinoマイコンが扱うのはディジタル量であるので、変換してやらないとArduinoで扱うことが出来ない、ということですね。
ArduinoのA/D変換は、0~5Vの電圧を10ビットの分解能で変換します。
10ビットは0000000000 ~ 1111111111という範囲ですね。
1111111111を10進数に直すと1023になるので、簡単に言い換えると、
ArduinoのA/D変換は、0~5Vの電圧を1024個に等分して読み取る
ということになります。5Vを1024等分すると、
5/1024 ≒ 4.9mV
なので、Arduinoでは4.9mV以下の電圧変化は検出できない、という事になります。
使ってみる
プログラムではどう記述するか
ArduinoでA/D変換を行う場合、analogRead関数を利用します。対応いているピンはA0~A5ピンです。
例えば、このように使います。
int val;
val = analogRead(0);
こうすると、A0番ピンの電圧を読み取って整数型の変数valに格納します。
出力電圧を読み取る
それでは、LM35の出力電圧をArduinoで読み取るとどんな値が見えるのか試してみましょう。
配線

このように配線を行います。前述の通り、ピン配置はパッケージによって異なるのでよく確認して下さい。
プログラム
//LM35テスト
//出力電圧をそのままシリアルモニタに表示する
void setup(){
Serial.begin(9600);
}
void loop(){
int val = analogRead(0);
Serial.println(val);
delay(1000);
}
A0ピンの電圧を読み取って、そのままシリアルモニタに表示しているだけのプログラムです。シリアル通信については、以前の記事を参照してください。※A0~A5ピンについては、pinModeの設定は必要ありません。
プログラムを書き込んでシリアルモニタを表示すると、A/D変換された電圧の値が表示されます。この値は、「5Vを1024等分した最小単位何個分か」、を意味しているので、ここから出力電圧を計算するには、以下の計算が必要です。
Vout = val * 5 / 1024 [V]
例えば読み取った値が60だった場合、
Vout = 60 * 5 /1024 = 0.293 [V] = 293 [mV]
となります。気温1℃につき10mVなので、この場合の気温は
気温Temp = 293 / 10 = 29.3 [℃]
となります。
特定の温度条件でLEDを点灯させる
これでLM35の使い方がマスターできたので、まとめとして「一定の温度(30℃)を超えたらLEDを点灯させる」システムを考えてみます。今回はArduino内蔵LEDを用いるので、配線はさきほどのままでOKです。
プログラム
//LM35テスト2
//30℃を超えたらLEDを点灯させる
float val,temp;
void setup(){
pinMode(13,OUTPUT);
}
void loop(){
val = analogRead(0);
temp = val*5.0/1024*100;
if(temp>=30){
digitalWrite(13,HIGH);
}
else{
digitalWrite(13,LOW);
}
delay(200);
}
これで、手でセンサを温めてLEDが点灯するか確認してみましょう。
まとめ
色々小難しい勉強にもなりましたが、一度理解してしまえば簡単な配線とプログラムでセンサを使いこなすことができました。少し応用すると、複数の場所の気温を比較したり、センサに防水処理をすれば水温なども図ることができます。プログラム的には難解になりますが、一定間隔で温度情報を記録することも可能です。