スターターキットなどでArduinoを始めた方も、そろそろ実用的な電子工作を試してみたくなってきた頃ではないでしょうか?
それには一つ一つの電子部品の特性を理解しないと回路の設計はできません。
そこで今回は、スターターキットの中によく含まれている電子部品の一つであるフォトレジスタの仕組みに注目します。
フォトレジスタは光に反応する部品です。機能はシンプルですが、上手く使えば、夕方に室内が暗くなり始めた時に電灯をONしたり、カーテンを閉じたりする用途に応用できます。
本記事では簡単な照度計を作りながらフォトレジスタの動作を説明します。
目次
1. フォトレジスタをArduinoの光センサに使用
フォトレジスタは硫化カドミウム(CdS)を主成分とする電子部品です。「Cdsセル」と呼ばれることもあります。
硫化カドミウム(CdS)には、光の当たる量によって抵抗値が変わる特性があり、フォトレジスタは、その性質を利用した光センサです。
一般的に抵抗は、抵抗値が変わらないことが理想であり、電子回路の中で常に決まった量の電流を流す目的に使用されます。フォトレジスタは、周囲の明るさに応じて、抵抗値が変化する抵抗と考えることができ、周囲が明るければ明るいほど、より多くの電流を流します。反対に、暗くなると抵抗値が増加するので回路に流れる電流が減少します。
この、フォトレジスタの抵抗値の変化をArduinoで読み取ることで、明るさを検出する光センサとして利用できます。
2. 抵抗の分圧を利用してセンサの電圧をA/D変換
フォトレジスタを単純にArduinoボードに接続しても抵抗値は測定できません。
フォトレジスタの抵抗値が変化する様子をArduinoで読み取るには、「抵抗の分圧」を使って電圧を測定するテクニックが必要です。
「抵抗の分圧」とは、「電源・抵抗(A)・抵抗(B)・グランド」とつながる回路があった場合、「抵抗(A)と抵抗(B)の間の電圧は、その抵抗値の比で決まる」という原理です。
説明しやすいように「抵抗(A)と抵抗(B)の間の電圧」のことを「Vout」と呼ぶことにします。
例えば、電源が5V、抵抗(A)が10kΩ、抵抗(B)が10kΩとすると、Voutは
Vout = 抵抗(B) ÷ (抵抗(A)+抵抗(B)) × 電源電圧
で計算でき2.5Vとなります。
また、抵抗(A)が小さくなり5kΩ、抵抗(B)が10kΩの時のVoutは3.3V、反対に抵抗(A)が大きくなり20kΩ、抵抗(B)がそのままの時は1.7Vです。
計算は抵抗の分圧計算を使うと便利です。
この時に、抵抗(A)をフォトレジスタに置き換え、フォトレジスタと抵抗(B)の間をArduinoボードのアナログ入力ピンに接続します。(上記の例ではVoutと呼んでいた部分です)
こうすることで、フォトレジスタの抵抗値の変化に応じてアナログ入力ピンにかかる電圧が変化します。
明るくなると上記の抵抗(A)の値が下がるのと同じ効果となり電圧は高くなります。反対に暗くなると電圧は下がります。
電圧はA/D変換によって0〜1023の整数値(1024段階)に変換されスケッチに送られるので、スケッチからArduinoボードの周囲の明るさを数値として知ることができます。
この数値を、スケッチから表示するように指示すれば照度計になります。
今回の実験では、明るさに応じて異なる色のLEDを点灯することで、この照度を表示します。
3. 準備
カーテンの開閉や電灯のON/OFFなどの制御にはモータやリレーなどが必要ですが、今回はフォトレジスタ自体の動作に注目します。
今回の実験では、以下のような、Arduinoの初心者向けスターターキットで揃う程度の電子部品しか使いません。
Arduino Uno
Arduino IDE
LED
赤・青(色違いであれば何でも可)
フォトレジスタ
抵抗
220Ω 1本
100Ω 2本
いかがでしょうか? スターターキットを購入した方は一度、中を確認してみると良いでしょう。
LEDは2本の色が異なれば手持ちのもので構いません。
220Ωの抵抗は、前述の「抵抗の分圧」の抵抗(B)に相当します。
100Ωの抵抗はLEDの破損防止用です。100Ω〜1kΩ程度のものであれば使用できます。
上記以外に、USBケーブルが必要です。また、ブレッドボードがあると便利です。
4. スケッチ
今回の実験では、フォトレジスタの読み取りにアナログ入力ピンを1本使用します。また、2本のデジタル入出力ピンをLEDの制御に使用します。
アナログ入力ピンの電圧が、あらかじめ設定したしきい値(動作の境になる値)を下回っている(暗い)際は赤色のLEDが点灯、しきい値を超えている(明るい)際は青色のLEDが点灯します。
以下がそのスケッチです。
int redLED = 7; int blueLED = 8; int photoresistorPIN = A0; int lightValue = 0; void setup() { pinMode(redLED, OUTPUT); pinMode(blueLED,OUTPUT); Serial.begin(9600); } void loop(){ lightValue = analogRead(photoresistorPIN); Serial.println("Light value: "); Serial.println(lightValue); if(lightValue < 50){ digitalWrite(redLED, HIGH); } else{ digitalWrite(blueLED, HIGH); } delay(200); digitalWrite(redLED, LOW); digitalWrite(blueLED, LOW); }
スケッチのポイントを説明します。
最初は、変数の定義と初期化です。
int redLED = 7; int blueLED = 8; int photoresistorPIN = A0; int lightValue = 0;
1行目と2行目は、それぞれ赤色・青色LEDの接続されているデジタル入出力ピンの定義です。赤色LEDはデジタル入出力ピンの7番に、青色LEDは8番に接続することを意味します。
3行目は、フォトレジスタからの電圧を読み取るアナログ入力ピンの定義です。A0を指定します。A0はArduino IDE上で使用できるピンの名前であり引用符は不要です。
最後の行は、フォトレジスタから読み取った値を格納するための変数です。0で初期化しておきます。
setup()関数は以下の部分です。
void setup() { pinMode(redLED, OUTPUT); pinMode(blueLED,OUTPUT); Serial.begin(9600); }
関数ブロック内の最初の2行は、赤色・青色LEDの接続されているデジタル入出力ピンの動作を「出力」に設定しています。
3行目は、フォトレジスタから読み取った値をArduino IDEのシリアルモニタに表示できるように、シリアルポートを初期化します。
閾値はArduinoボードが置かれている周囲の明るさによって決める必要があり、シリアルモニタの表示を見ながら調整します。
次にloop()関数です。
void loop(){ lightValue = analogRead(photoresistorPIN); Serial.println("Light value: "); Serial.println(lightValue); if(lightValue < 50){ digitalWrite(redLED, HIGH); } else{ digitalWrite(blueLED, HIGH); } delay(200); digitalWrite(redLED, LOW); digitalWrite(blueLED, LOW); }
ブロック内の1行目で、フォトレジスタの値を読み込み変数lightValueに格納します。値はSerial.println()関数を使ってシリアルポートから送信され、即座にシリアルモニタ上に表示されます。
続くソースコードは、フォトレジスタから読み取った値がしきい値の50を下回っている際に赤色LEDを点灯します。
実験する環境によっては、しきい値の50は小さいかもしれません。その場合、青色LEDが常に点灯し続けます。
シリアルモニタに表示される数字を頼りに閾値の値を決定してください。
5. 配線
スケッチが完成したらArduinoボードに転送してください。
それでは、パソコンにつながるUSBケーブルを一端取り外して、以下の手順で配線します。ブレッドボードを使用すると便利です。
- 青色LEDの長い方の端子を、Arduinoボードのデジタル入出力ピンの8番に接続。
- 青色LEDの短い方の端子に、抵抗(100Ω)の片方のリード線を接続。
- 抵抗のもう一方のリード線を、ArduinoボードのGNDに接続。
上記の手順を赤色LEDにも繰り返します。接続するデジタル入出力ピンは7番です。
LEDの配線が終了したら、フォトレジスタを取り付けます。
- フォトレジスタの片方のリード線を、Arduinoボードの5Vに接続。
- フォトレジスタのもう一方のリード線を、Arduinoボードのアナログ入力ピンのA0に接続。
- 上記と同じリード線に、抵抗(220Ω)の片方のリード線を接続。
- 抵抗のもう一方のリード線を、ArduinoボードのGNDに接続。
全ての配線が終わったら、Arduinoボードを再びパソコンに接続します。
青色LEDが点灯するはずです。
その状態で、フォトレジスタの上に手をかざしてください。青色LEDが消灯し赤色LEDが点灯すれば成功です。
もしどちらかのLEDが点灯し続ける場合は、スケッチ内のif文にある閾値(上記のスケッチでは50)を書き換えてください。
6. まとめ
今回紹介した電子部品、フォトレジスタ(Cdsセル)は街灯などにも利用されています。低価格で入手しやすい部品なので、身の回りにある電子機器にも数多く使われているはずです。
フォトレジスタを使って実際に何かを制御する際には、人の影などで動作しないような工夫や、明るさだけでなく時間と組み合わせて動作を安定させるなどの工夫が必要です。
フォトレジスタを回路に組み込むのは簡単です。接続を間違えなければ確実に動作するので、次のステップとしては、より安定した動作方法などを考えてみるのも良いでしょう。