ホーム < 電子工作やってみた


Arduino編

その5 お部屋の明るさを数値化してみよう(LEDでテスト)


 前章まではArduino基板に流したプログラムで決められた値をピンに出力していました。電光掲示板のような物はこの延長かなと思います。一方、Arduinoには外から情報を与える事もでき、そのための「入力ピン」が用意されています。入力ピンに電圧を加えると、内部でその値を数値化してくれます。

 キットの中にはCdsセルという光センサーが同封されていました。光センサーというくらいですから、光を与えると何か反応を返してくれる物のはずです。そこで、Cdsセルを回路に組み込んで、お部屋の明るさを数値として目にする事に挑戦してみます。まずはCdsセルについて調査です。



@ Cdsセル

 Wikipedia(フォトレジスタ)で調べて見ると、Cdsセルは「フォトレジスタ」という光センサーの一つで、光が当たると抵抗値が下がる電子部品とあります。フォト(Photo)は光、レジスタ(Registor)は抵抗の意味ですから、まんまですね。ちなみにCdsは「硫化カドミウム(Cadmium sulfide)」の事で、この化学物質が持つ特性がフォトレジスタとして利用されているようです。



A Arduinoのアナログ入力ピン

 Arduino UNO R3にはアナログ入力ピンが6つ用意されています。ここに0〜5Vの電圧を掛けるとそれを0〜1023の10bitな整数として内部で変換してくれます(ADコンバータの働き)。プログラム上からアナログ入力ピンの値を取得するにはanalogRead関数を用います(説明は前章参照)。

 Arduinoには丁度5Vの電力を提供してくれるピンもあります。5Vピンから線を伸ばしアナログ入力ピンに挿せば、原理的にはプログラム内で最大値の1023が返ってくるはずです。ですから、その回路の間にCdsセルを挟めば、それが抵抗になるのでアナログ入力ピンにかかる電圧が下がり、数値が減るはずです:


(後書き:この回路は結局失敗します!)

 回路図で書けば上のような感じです。ただ、上の図だと「たぶんそうなってるだろうなぁー」としか感じられません。目に見える出力が無いからです。Cdsセルが反応した結果入力ピン3番(アナログ出力なので3番)に返って来る値を出力する方法を考える必要があります。例えばLEDを光らせるというのは一つのわかり易い出力ですよね:


(後書き:この回路は結局失敗するんですっ!(T_T))

Cdsセルの能力をとりあえず見てみたくもありますので、まずは上の回路を組んで実験してみたいと思います。こういう時にブレッドボードは重宝しますね(^-^)。



B 光センサーの反応をLEDで見る(失敗!)

 ブレッドボードはこんな感じの回路になりました:

 5Vからスタートして一番下の黄色い回線を通ってCdsセルへ、白い線を通ってアナログ入力ピン0番へ入ります。その値をプログラムが解釈しOut3ピンへ出力します。出力電圧はLEDを光らせます。

 プログラム側でやる事はアナログ入力ピン0番に入った値をデジタル出力ピン3番に矩形波(PWM)として出力する事です:

int inPin = 0;
int outPin = 3;

void setup() {
    pinMode( outPin, OUTPUT );
}

void loop() {
    int analogInVal = analogRead( inPin );
    analogWrite( outPin, analogInVal / 4 );
}

 setup関数でデジタルピン3番を出力として設定、loop関数内ではanalogInVal関数でアナログ入力ピン0番から値を整数値で貰っています。それをanalogWrite関数でピン0番に出力しています。analogInValを4で割っているのはanalogInValが0〜1023の値で返るのに対し、analogWrite関数へは0〜255の値で与える必要があるからです。

 さて、このプログラムをArduino基板に流し込めば光センサーであるCdsセルの値に反応してLEDが明るくなったり暗くなったりするはずです:

ん?左は明るい所に置いた場合、右はキャップを被せて暗くした場合なんですが…LEDの明るさに全然違いが無いように見えます…。ん?

 こういう時はテスターが役に立ちます。試しにCedセル間の電圧を測定してみると…:

0V!0.1mV単位で測れるテスターなので、Cedセルの抵抗が凄まじく大きいとしても0Vって事はちょっと考えにくいです。これ、もしかして電気流れて無くね…?あれ、でもLEDは光ってたしなぁ…。何か変です。そこで、色々テストしてみました。

 Cdsセルだと分かり辛いので1kΩの抵抗に変えてあれこれやってみた結果、こういう事だと認識しました:

 変な絵…(^-^;;

 まず、一番左は抵抗の間に電圧が掛かっていない状態で、そもそも電流が流れていない感じです。In0の先にGNDがるのかなぁと思っていたのですが、そういう事では無いようです。ただLEDが光っているの理由は良く分かりません(^-^;。次に、抵抗から入力端子までの間にGND線を設けました。すると抵抗間に5Vの電圧がかかりました。GNDへ繋げた事で電圧降下が起き電流が流れたようです。しかし、抵抗の所で電圧を使いきってしまい、In0への圧がもう無くなってしまっているためLEDは光りませんでした。そこでGND線の間にももう一つ1kΩの抵抗を入れてみました。すると、物の見事に2.5Vずつ分圧され、In3側へも電圧がかかるようになりました。LEDもちょっと暗くなって光っています。

 つまり、先程の回路には「GNDへ繋ぐ線+抵抗」が足りなかったというわけです。



C 光センサーの反応をLEDで見る(成功!)

 改めてCdsセルの後にGNDに繋ぐ抵抗を追加した回路を作りました。抵抗の値をどう決めるかですが、なるべくIn0に多くの電圧がかかるようにしたいので、手持ちにある一番大きな抵抗である10kΩを使う事にしました:

左側に10kΩの抵抗をGNDの前に設けています。これでIn0側にそれなりの電圧がかかるはずです:

お〜〜〜、右側のキャップをかぶせたら殆ど光らなくなりました。Cdsセルは暗くすると抵抗がぐっと上がるためIn0側への電圧が減り、analogRead関数が小さな整数値を返したためこうなったわけです。これはインタラクティブを感じますねぇ。楽しいー(^-^)

 という事で、この章では光センサーであるCdsセルの性質をLEDに反映させるテストをしてみました。失敗した事からアナログ入力端子へ電圧をかける方法もわかりました。次の章では、Out3ピンへいったいどういう値が渡っていたのか、それをPCの画面で確認してみます。ArduinoからPCへデータを送信するという新しい試みです(^-^)