目次
本記事で使用するもの
以下のリンクのスターターキットを購入した場合、上記で述べた使用するものは、PC以外すべて入手することができます。
Arduinoをまだ購入していないという方やArduinoで動かすことができるたくさんのパーツが欲しいという方は、購入を検討してみてください。
フォトレジスタ(CdSセル)の説明
フォトレジスタは、光の強さに応じて、電気抵抗が変化する部品です。
上記で紹介したスターターキットの中には以下の写真のようなフォトレジスタが2つ入っています。
このフォトレジスタは、光の強さに応じて、電気抵抗が変化する「硫化カドミウム(CdS)」というものを利用しているので、「CdSセル」と呼ばれています。
CdSセルは、当たっている光が強いと、電気抵抗が低くなり、当たっている光が弱いと、電気抵抗が高くなります。
つまり、CdSセルの電気抵抗の変化を測定することができれば、CdSセルに当たっている光の強さがどのように変化しているか分かるのですが、「Arduino」に電気抵抗の変化を直接読み取るような機能はありません。
よって、以下のような抵抗器との直列回路を作成して、電圧を読み取り、光の強さを測定するといった使われ方が良く行われています。
フォトレジスタ(CdSセル)を試す
まずは、上記で説明した回路を用いて、以下の画像のように、CdSセルに当たっている光の強さに応じた数値をシリアルモニタに表示させる方法について説明したいと思います。
空のスケッチを書き込む
回路を作成する前に、空のスケッチ(「ファイル」タブの「New Sketch」をクリックしたときに出てくる何の処理も書かれていないスケッチ)を書き込みます。
そうすることにより、前に書き込んだスケッチが、新しく作成しようとしている回路に影響を及ぼすことを防げます。
新しい回路を作成するときは、いつもこの作業をやっておくと、安全に回路を作成することができます。
回路を作成する
以下のような回路を作成してください。
ここで、使用する抵抗器は、ひとまず、10[kΩ]程度のものを使用します。
また、抵抗器とCdSセルを繋げる順番は、上記の通り、抵抗器を5V側、CdSセルをGND側に繋げます。
抵抗器とCdSセルを繋げる順番を変えても、当たっている光の強さの変化を読み取ることはできますが、これから説明するものと動作が異なってしまうので注意してください。
スケッチを書き込む
回路の作成が終わりましたら、以下のようなスケッチを書き込んでください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//CdSセルに当たっている光に応じて変化する値(A0ピンで読み取る値) int cds_value=0; void setup() { //A0ピンを入力ピンとして設定する(デフォルト設定なので省略しても良い) pinMode(A0,INPUT); //シリアル通信の初期処理を行う Serial.begin(9600); } void loop() { //アナログピンA0の値を読み取る(0~1023) cds_value=analogRead(A0); //読み取った値を表示 Serial.println(cds_value); //0.5秒待機 delay(500); } |
スケッチの書き込みが終わりましたら、シリアルモニタを開き、入力部分の右に表示されている設定が「9600baud」、自動スクロールが「ON」になっているのを確認して、CdSセルに当たる光を手で遮ったりしてみてください。
スケッチと回路が正しければ、シリアルモニタに表示されている値が、当たっている光の強さに応じて変化していくのが確認できます。
スケッチの解説
スケッチの内容としては、A0ピンに繋いだ部分の電圧を「analogRead()」で読み取り、シリアルモニタに表示させるということを行っています。
ここで、「analogRead()」が良く分からないという方は、以下のリンク先の記事で説明していますので、是非、ご覧になってください。
A0ピンに繋いだ部分の電圧は、オームの法則と直列回路の性質を利用することで、計算を行うことができます。
まず、直列回路の性質とオームの法則より、回路に流れる電流は以下のように計算ができます。
そして、CdSセルに加わっている電圧はオームの法則より、以下のように計算することができます。
上記の式だけ見ても、RCdSと読み取っている部分の電圧V2の関係のイメージが分かりづらいと思いますが、この求めた式をグラフにすると、以下のようになり、CdSセルの電気抵抗RCdSが大きいほど、読み取る電圧V2は高くなることが分かります。
上記で説明したように、CdSセルは、当たっている光が強いと、電気抵抗RCdSが低くなり、当たっている光が弱いと、電気抵抗RCdSが高くなります。
よって、CdSセルは当たっている光の強さが強いと、読み取る電圧は低くなるので、値は小さくなり、光の強さが弱いと電圧は高くなるので、値が大きくなるという現象が起こります。
今回、CdSセルに繋げている抵抗器は10[kΩ]のものを使用しましたが、抵抗器の電気抵抗R1の高さによって、RCdSが変化したときの電圧の変化の仕方が異なります。
1[kΩ]、5[kΩ]、10[kΩ]、100[kΩ]の抵抗器を使用したときの、RCdSとV2の関係は以下のようになります。
CdSセルの電気抵抗RCdSが大きいほど、読み取る電圧V2は高くなるというのは共通ですが、抵抗器の電気抵抗R1が低い方が、電圧の変化が急になっているのが分かると思います。
よって、お手持ちのCdSセルで、値の変化があまり見られなくて、困っているという方は、抵抗器の電気抵抗を調整してみると、問題を解決することができるかもしれません。
ただし、抵抗器の電気抵抗を低くしすぎると、電流が大きくなり、消費電力が大きくなったり、熱を発するようになってしまったりと、別の問題が生じてしまうので、1[kΩ]を下回らないくらいで調整することをお勧めします。
フォトレジスタ(CdSセル)でLEDを制御する
次は、以下の動画のように、CdSセルに当たっている光の強さに応じて、LEDの点灯を制御する方法について説明したいと思います。
ここでは、CdSセルに当たっている光が弱いとき(光を手で遮ったり、周りを暗くしたりしたとき)にLEDを点灯させる方法を説明します。
その際に、CdSセルに当たっている光が弱いときの値を利用しますので、光を手で遮ったり、周りを暗くしたりした状態のときの値をメモしておいてください。
回路を作成する
以下のような回路を作成してください。
ここで、LEDに繋げる抵抗器の電気抵抗の高さは、LEDの順電圧と順電流から計算で求めます。
CdSセルに繋げる抵抗器は先程のままです。
以下に、LEDに対して、直列に繋げる抵抗器の電気抵抗の高さを計算するツールを用意しましたので、ご活用ください。
回路で使用する抵抗器は、上記のツールで求めた電気抵抗よりも少し高い電気抵抗のものを使用します。
上記のツールが行っている電気抵抗の計算方法については、以下のリンク先の記事で説明していますので、気になる方はご覧になってください。
ここで、電気抵抗の計算が行えない場合は、電気抵抗が高いもの(大体1[kΩ])から順番に接続していき、ちょうど良い明るさになるものを探していきます。
その際、電気抵抗を低いものにすれば、その分点灯が明るくなるのですが、電気抵抗が低すぎるもの(大体100[Ω]を下回るくらい)の場合、LEDの寿命を縮めてしまったり、破壊してしまったりすることがあるので注意してください。
今回、私は220[Ω]の抵抗器を使用しています。
スケッチを書き込む
回路の作成が終わりましたら、以下のようなスケッチを書き込んでください。
ここで、5行目にある「cds_value_threshold」の値は、先程メモをした、CdSセルに当たっている光が弱いときの値より少し小さい値に変更してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//CdSセルに当たっている光に応じて変化する値(A0ピンで読み取る値) int cds_value=0; //A0ピンで読み取った値がここで設定した値を超えたらLEDを点灯させる(値は各自調整) int cds_value_threshold=600; void setup() { //A0ピンを入力ピンとして設定する(デフォルト設定なので省略しても良い) pinMode(A0,INPUT); //LEDに繋いだピン(2番ピン)を出力ピンとして設定する pinMode(2,OUTPUT); //シリアル通信の初期処理を行う Serial.begin(9600); } void loop() { //アナログピンA0の値を読み取る(0~1023) cds_value=analogRead(A0); //読み取った値を表示 Serial.println(cds_value); //読み取った値がcds_value_thresholdを超えたときLEDを点灯させる if(cds_value>cds_value_threshold){ digitalWrite(2,HIGH); }else{ digitalWrite(2,LOW); } //0.5秒待機 delay(500); } |
上手くいけば、先程の動画のように、CdSセルに当たっている光が弱いときにLEDが点灯するのが、確認できます。
CdSセルに当たっている光を弱くしているのに、LEDが点灯しない場合は、シリアルモニタを確認してみてください。
ここで、CdSセルに当たっている光が弱いときに読み取っている値が、5行目にある「cds_value_threshold」の値を超えていない場合は、「cds_value_threshold」の値を光が弱いときに読み取っている値よりも小さくなるように変更してください。
読み取っている値が、「cds_value_threshold」の値よりも大きいのに、LEDが点灯しない場合は、回路やスケッチが間違っていると思われるので確認をしてみてください。
スケッチの解説
今回のスケッチは、先程のスケッチと同じように、A0ピンに繋いだ部分の電圧を「analogRead()」で読み取ることにより、CdSセルに当たっている光の変化を確認しています。
「analogRead()」で読み取った値をシリアルモニタに表示させるのも先程のスケッチと同様です。
しかし、今回のスケッチは読み取った値により、条件を分岐させて、LEDを点灯させるか、消灯させるかを制御しています。
ここで、5行目にある「cds_value_threshold」の値を、小さくするとより明るいときに、大きくするとより暗いときにLEDが点灯するようになります。
LEDが点灯する光の強さ(明るさ)の条件を変えたい場合は、シリアルモニタを確認しながら、「cds_value_threshold」の値を調節してみてください。
フォトレジスタ(CdSセル)で複数のLEDを制御する
続いて、以下の動画のように、2つのCdSセルに当たっている光の強さに応じて、複数のLEDの点灯を制御する方法について説明したいと思います。
回路を作成する
以下のような回路を作成してください。
スケッチを書き込む
回路の作成が終わりましたら、以下のようなスケッチを書き込んでください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
//左のCdSセルに当たっている光に応じて変化する値(A0ピンで読み取る値) int cds_value_1=0; //右のCdSセルに当たっている光に応じて変化する値(A1ピンで読み取る値) int cds_value_2=0; //LEDを点灯させるピンの番号 int HIGH_pin=2; void setup() { //A0ピンを入力ピンとして設定する(デフォルト設定なので省略しても良い) pinMode(A0,INPUT); //A1ピンを入力ピンとして設定する(デフォルト設定なので省略しても良い) pinMode(A1,INPUT); //LEDに繋いだピン(2~7)を出力ピンとして設定する for(int i=2;i<=7;i++){ pinMode(i,OUTPUT); } //シリアル通信の初期処理を行う Serial.begin(9600); } void loop() { //アナログピンA0の値を読み取る(0~1023) cds_value_1=analogRead(A0); //アナログピンA1の値を読み取る(0~1023) cds_value_2=analogRead(A1); //読み取った値を表示 Serial.print("cds_1:"); Serial.print(cds_value_1); Serial.print(" cds_2:"); Serial.println(cds_value_2); //cds_value_1とcds_value_2の値を比べ、結果に応じてHIGHにするピンを変更する if(cds_value_1>cds_value_2){ //cds_value_1がcds_value_2より大きいかつ、点灯しているLEDが左端じゃないとき、点灯させるLEDを左に移動 if(HIGH_pin<7){ digitalWrite(HIGH_pin,LOW); HIGH_pin++; digitalWrite(HIGH_pin,HIGH); } }else if(cds_value_2>cds_value_1){ //cds_value_2がcds_value_1より大きいかつ、点灯しているLEDが右端じゃないとき、点灯させるLEDを右に移動 if(HIGH_pin>2){ digitalWrite(HIGH_pin,LOW); HIGH_pin--; digitalWrite(HIGH_pin,HIGH); } } //0.5秒待機 delay(500); } |
スケッチの解説
今回はCdSセルとLEDを複数使用していますが、「analogRead()」で読み取ることにより、CdSセルに当たっている光の変化を確認するといった基本的な部分は先程までと同様になります。
CdSセルが2つあるので、アナログ入力ピンと抵抗器を追加でもう1つ用意し、先程までと同じように「analogRead()」でそれぞれの値を読み取っています。
また、確認のため、シリアルモニタに読み取った2つの値を表示させるようにしています。
LEDの点灯は、読み取った2つの値を比較することにより、処理を分岐させ、読み取った値が大きい方(光が弱い方)に向かってLEDの点灯が移動するように、HIGHにするピンを切り替えて制御しています。
CdSセルなどの個体差により、同じ光の強さの光を当てても、2つの値は異なる場合がほとんどなので、何もしていない状態でも片側にLEDが寄っていくと思われます。
しかし、同じ種類のCdSセルを使っている場合、基本的に、個体差による電気抵抗の差よりも、手で光を遮ったときの電気抵抗の変化の方が大きいため、手で光を遮ったほうにLEDの点灯が寄っていくのが確認できると思われます。
終わりに
フォトレジスタ(CdSセル)の使い方について、ご理解いただけたでしょうか。
今回の知識を利用すれば、周りが明るいか、暗いかといった環境を、判断させることができるので、日の光がどのくらい当たっているかを測定する装置を作ったり、ロボットに取り入れて明るさに応じた行動をとるようにしてみたりといったことができます。
アイデア次第で色々な事ができると思うので、是非、色々と試してみてください。
次回の記事では温度を測定するときなどに利用する「サーミスタ」という部品の使い方について説明したいと思います。
本記事はここまでです。ご清覧ありがとうございました。
広告
楽天モーションウィジェットとGoogleアドセンス広告です。
気になる商品がございましたら、チェックをしてみてください。