ArduinoとCdSセルで遊ぶ

前回の記録: Arduinoはちっちゃなコンピュータ。

What's CdSセル?

CdSセルはフォトレジスタやフォトセルとも呼ばれ、光量によって電気抵抗が変化する素子のことです。 CdSセルを明るい光で照らすとセル自体の電気的抵抗は小さくなります。暗いところでは抵抗値が大きくなります。ちなみにCdSセルの”CdS”とは硫化カドミウムの組成式のことです。

準備

  • Arduno UNO R3
  • 10kΩ抵抗器
  • CdSセル
  • ワイヤー
使用するArduinoは、UNOという種類のRevision3をつかいます。10kΩ抵抗器はショート防止用(負荷抵抗)です。今回準備するものは、”Arduino始めようキット”にすべて入っています。

配線図


赤ワイヤーが5V
黄ワイヤーがA0
黒ワイヤーがGNDに接続されています。

回路についてもっとくわしく

ブレッドボード(番号とアルファベットのある白っぽい四角形)の穴のなかでは下の図のような電気的つながりがあります。図のように縦方向に電気的つながりがあります。横方向にはありません。また、A~E(上部)とF~J(下部)に電気的つながりはありません。それぞれで独立しています。
10kΩの抵抗器に、赤から5Vの電圧が加わります。これは、黒を0V基準とした時の5Vです。黄はArduinoのアナログ0番ピンにつながっています。これをアナログ入力としてつかいます。入力の役割は、そこにどれほどの電圧が加わっているのかを示すことです。Arduinoの場合、0~5Vの入力を0~1023の間の値で示してくれます。この機能をAnalog-to-Digital Converter(ADC:アナログからデジタルへの変換器)と呼びます。
回路図に目を戻すと、赤がつながった抵抗器の先に、黄(アナログ入力)とCdSセルがつながっています。もし、環境光が少なければ(暗)、抵抗器の値R1は一定で、CdSセルの抵抗値R2だけが大きくなります。ここで、抵抗器による分圧則を持ってくると、
$$ V_O = \frac{R_2}{R_1+R_2}\cdot V_I $$
VIが5Vを表し、VOがアナログ入力に加わる電圧を表します。分圧則より、R2が大きくなると、VOは5Vに近づくことがわかります。よってArduinoは、0~1023の間のなかでも大きな数値を示します。

環境光が多い(明)ときは、CdSセルの抵抗値R2は小さくなります。同様に分圧則で考えると、VOは0Vに近づくことがわかります。0~1023の間のなかでの小さな数値を示すことがわかります。
それはつまり…
CdSセルを暗くすると大きな値を、CdSセルを明るくすると小さな値を、Arduinoは出力することを意味します。
では、Arduinoはその値をどこへ出力する?
それについては、”スケッチについてもっとくわしく”で説明します。

スケッチ

Arduinoの世界ではプログラムコードのことをスケッチと呼んでいます(Processingに由来したのでしょうかね)。このスケッチと先の回路があれば、環境光に応じて13番ピンのLEDが点灯/消灯するようになります。めざす動作は、部屋の照明を落とすとLEDが点灯、照明を点けるとLEDが消灯!
int val = 0;
int iPin = A0;
int oPin = 13;

void setup() {
  Serial.begin(9600);
  pinMode(oPin, OUTPUT);
}

void loop() {
  val = analogRead(iPin);
  Serial.println(val);
  if(val<920){
    digitalWrite(oPin, LOW);
  }else{
    digitalWrite(oPin, HIGH);
  }
  delay(200);
}

IDEではこんな感じ

スケッチについてもっとくわしく

valはADCにより変換された数値(0~1023のどれか)を格納するための変数です。iPinは入力ピン、つまり黄ワイヤーの接続先ピン番号(A0)を格納しています。oPinは出力ピン、すなわちLEDのピン番号(13番)を格納してあります。

PCとArduinoを接続しているシリアルポートを使って数値valを、ArduinoからPCへと送信。PCで数値をリアルタイムに確認できる仕組みです。はじめのsetup()、すなわちArduinoの準備では、数値をPCに送信するためのシリアルポートをボー9600で開放、LEDピンである13番ピンを出力に設定しています。

次がこのスケッチのメインであるloop()という部分です。A0(センサーピン)に加わっている電圧をADCを介して数値として読み取り、変数valへ格納します。こんな複雑な処理を、わずか一行でコーディングできるArduinoはすごいです。次の行では値valをシリアルポートで送信・プリントしています。この値は、Arduino IDEのシリアルポートモニターという監視ソフトで読み取ることができます。逐一更新されてゆく値が少しでも見やすくなるように、delay関数で待ち時間を0.2秒ほど設けました。

if文がLEDの点灯・消灯を制御してくれます。図の場合、if文の部分に920という値が入力されているはずです。これはvalの値(環境光の明るさ)が920未満ならLEDピンに0V(LOW)を、920以上ならLEDピンに5V(HIGH)を与えよ、ということを意味しています。

もう説明は十分ですね。

いざArduinoへ

ArduinoをUSBでPCに接続します。初めて接続した場合には設定が必要になります。このページへリンクして方法を設定をすませましょう。

Arduino IDE
設定完了後、スケッチをIDEへサクっと入力しましょう。念のため保存して、IDE画面上部のUploadボタンをクリック、スケッチをArduinoへアップロードします。プログレスバーが表示されます。バーがいっぱいになるまで待ちます。下部のログに“Done uploading”が表示されれば成功!オレンジ色やなんやらでいろいろ文字が表示されていたらスケッチに間違いがあることを警告しています。ログを見ながら間違いを修正しましょう。

アップロードが完了すれば、Arduinoはスケッチ通りに動作しているはずです。どの明るさが0で、どの暗さが1023なのかは想像できないので、実際に確かめてみます。IDE画面右上の虫眼鏡アイコン“Serial Monitor”をクリックします。こんなウィンドウが現れるはずです。

リアルタイムで表示される数値に注目
それが、環境光の明るさを表す数値です。0~1023のどれかが表示されるはずです(とは言っても回路の特性上、0や1023やその付近などの極端な数値はお目にかかれません)。部屋の照明を落としてみます。数値を確認。照明を点けてみます。数値を確認。照明が点いていても影の影響でや温度でも数値が変化してしまうので、それを考えて環境光の明暗の境の数値を見つけましょう。見つけたらその数値をif文の部分に入力して再度アップロードします。自分の環境では、数値920が環境光の明暗の境でしたので、if文の部分に920と入力しました。

変更したら保存しましょう。そしてアップロード、動作チェックです。照明を落としてみます。Arduinoボード上、13番ピン近くのLEDが点灯したでしょうか?照明を点けてみます。LEDは消灯しましたか?うまく動作するまでif文に入力した数値を編集してみましょう。

終わりに...

今回は、環境光によってLEDの点灯/消灯を制御するものでした。言い変えれば、これは13番ピンの電圧を制御している、といえます。環境光が暗いと5V、明るいと0V。if文の“val<920”を“val>920”に書き換えれば、その逆に制御できるのです。
最後に疑問をひとつ
身近に5Vで動作するものがいくつあるでしょう?
次回の記録: ArduinoとProcessingで遊ぶ。
4386197232228273499 http://www.storange.jp/2012/03/arduinocds.html http://www.storange.jp/2012/03/arduinocds.html ArduinoとCdSセルで遊ぶ 2012-03-27T16:39:00+09:00 http://www.storange.jp/2012/03/arduinocds.html Hideyuki Tabata 200 200 72 72