前回、デジタル入出力端子に超音波センサー(HC-SR04)を繋ぎ距離の測定や障害物の検知をやってみました。
これまでArduinoのデジタル端子を使いLEDを点灯や消灯させたり、PWM制御によりその明るさの制御などもやってきました。
デジタル入出力ピンの電圧をHIGH(5V)やLOW(0V)にしたり、PWM制御でデューティー比を変え電圧をアナログ的に変化させるといったものです。
今回はそのあたりの復習もかね、そしてアナログ入力端子を使い光センサー(Cdsセル)を使い制御に使ってみたいと思います。
目次
【Arduino】光センサー(Cdsセル)を使いLEDの点灯を制御してみる!
今回の目標
Cdsセルやフォトレジスタと呼ばれる光センサーの値をArduinoで読み取り制御に使ってみたいと思います。
明るさによって抵抗値が変化する光センサー(Cdsセル)ですが、抵抗値の変化はそのままではArduinoで読み取ることが出来ません。
そこで「抵抗の分圧」という方法を使いCdsセルの電圧変化をArduinoのアナログ入力ピンから取り込み、A/D変換(アナログ/デジタル変換)により数値の変化(0~1023までの数値)として制御に使ってみたいと思います。
今回はLEDの点灯で確認してみたいと思います。
光センサーの特性を活かし、暗くなるとLEDが点灯し明るくなるとLEDが消灯する制御が出来るところまでを今回の目標としたいと思います。
光センサー(Cdsセル)とは?
Cdsセルと呼ばれる光センサーは、センサーに当たる光が明るければそれ自身の抵抗値が低くなり、また暗くなれば抵抗値が大きくなる性質を持っています。
フォトレジスタと呼ばれることもあるパーツとなります。
「Cds」とは硫化カドミウムのことですが、光の強さに応じて抵抗値が変化(光が強ければ低下する)という性質を持つ抵抗器のようなものとなります。
この抵抗値の変化を利用して明るさを測定するセンサーとして使われています。
抵抗値が変化するのでその変化による電圧の変化(アナログ的な変化)をArduinoのアナログ入力端子から取り込めばいろいろと制御に使えます。
真っ先に思い浮かぶものと言えば、暗くなるとLEDが点灯し明るくなると消灯するといった用途で使えますね。(今回の目標です)
光センサー(Cdsセル)の抵抗値の変化
まずは光センサー(Cdsセル)単体での抵抗値の変化を確認したいと思います。
明るい状態で約270Ωの抵抗値。
そしてセンサー部分を塞いで暗くした状態で約216kΩとなりました。(個体差があります)
かなり大きな変化がありますね。
光センサー(Cdsセル)の明るさによる抵抗値の変化が確認できました。
それでは簡単な回路を組みLEDの明るさの変化を確認してみたいと思います。
このような簡単な回路を組んでみました。
デジタル入出力ピンD5からの出力(5V)でLEDの明るさを確認してみます。
光センサーは明るさにより抵抗値が変化する抵抗器のようなものなので極性はありません。
そしてLEDの電流制限抵抗との間に入れてみました。
スケッチは0.5秒間隔でON/OFFを繰り返す簡単なものを使いました。
デジタル出力に関してはこちらを参考にして下さい!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // Arduino入門編⑫ 光センサー(Cds)でLEDの点灯制御1 // https://burariweb.info int led_pin = 5; void setup() { pinMode(led_pin,OUTPUT); // デジタルピン5を出力に } void loop() { digitalWrite(led_pin, HIGH); // LEDを点灯 delay(500); // 500ms(0.5秒)待つ digitalWrite(led_pin, LOW); // LEDを消灯 delay(500); // 500ms(0.5秒)待つ } |
このように光の変化によりLEDの明るさが変化しているのが分かります。
この投稿をInstagramで見る
光センサー(Cdsセル)の基本的な使い方がわかりましたが、この回路ではArduinoは単に5Vを出力するだけの電源みたいなものです。
そして任意の明るさ(設定した明るさ)になると点灯したり消灯したりすることが出来ません。
また暗くなるとCdsセルの抵抗値が大きくなりLEDの点灯は暗くなりますが、これを逆の動作にすることが出来ません。
ここで少し光センサー部分の回路を工夫してArduinoに入力された値を取り出しLEDの点灯を自由に制御してみたいと思います。
その前に少しArduinoのアナログ入力ピンの復習です。
Arduino Unoのアナログ入力ピンを利用
光センサー(Cdsセル)の雰囲気がつかめたと思います。
上記回路では、デジタル出力(0V or 5V)を使い単に光センサーの抵抗値を変化させLEDに流れる電流値を変えその明るさの変化を見てみました。
光センサー(Cdsセル)の特性が分かったところで、これを上手くArduino(ここではArduino Unoで解説していきます)に取り込み制御で使えるか考えてみます。
Cdsセルは上記で確認したように明るさに反応してその抵抗値が変化するセンサーとなります。
抵抗値を直接Arduinoに取り込むことは出来ないので、ここではCdsセルにかかっている電圧をArduinoに取り込もうと思います。
Cdsセルにかかる電圧の変化を取り込むのでアナログ入力ピンから読み取らせたいと思います。
Arduino Unoにはアナログ入力ピンがA0~A5までの計6本あります。
入力された電圧0~5Vの範囲を0~1023までの1024通りの数値に置き換えて読み取る事が出来るポートとなります。
読み取った電圧値のアナログな変化をArduinoが処理できる数値に置き換えるというものです。(A/D変換)
Arduinoのアナログ入力ピンの使い方はこちらの記事を参考にしてみて下さい。
そしてCdsセルにかかる電圧の変化をArduinoに取り込む方法として「抵抗の分圧」を使えば簡単にその変化を取り込むことが出来ます。
「抵抗の分圧」で光センサーの電圧変化を読み取る
光の変化によりその抵抗値が変化する光センサー(Cdsセル)ですが、先程ご説明した通りその抵抗値を直接Arduinoに取り込むことは出来ません。
そこで抵抗値の変化による電圧の変化をArduinoに読み取らせる方法を取ります。
「抵抗の分圧」によりCdsセルに掛かる電圧をArduinoのアナログ入力ピンで読み取らせるというものです。
Arduinoのアナログ入力ピンにかかる電圧(0~5V)はA/D変換により0~1023の1024段階の整数に変換されてArduinoに取り込まれます。
アナログ入力ピンにかかるアナログな数値をArduinoが処理しやすいデジタルな数値に変換するというものです。(A/D変換)
数値化することにより制御で扱いやすくなります。
そしてこのような回路を組んでみました。
分圧用に4.7kΩの固定抵抗を使っています。
また、アナログ入力ピンは今回A0を使用しました。
回路図はこのようになります。
「抵抗の分圧」によりCdsセルにかかる電圧を計算してみます。
この回路では、明るい時にCdsセルの抵抗値は約270Ωだったのでアナログ入力ピンA0にかかる入力電圧Vinは
Vin = 5 × 270 / (4.7k+270) = 0.27V
また暗い時では、Cdsセルの抵抗値は約216kΩだったのでアナログ入力ピンA0にかかる入力電圧Vinは
Vin = 5 × 216k / (4.7k+216k) = 4.89V
今回R1に4.7kΩの固定抵抗を使いましたが、1kΩの抵抗値やさらに大きな10kΩや50kΩなどを使っても問題ありません。
このR1の抵抗を大きくすれば電圧の変化する範囲が広くなります。
抵抗値を変え私の環境で変化が分かりやすかった4.7kΩの抵抗値で今回試しています。
このように「抵抗の分圧」によりCdsセルにかかる電圧を取り出すことが出来れば、あとはこれをArduinoのアナログ入力ピンで読み取らせArduinoが0~1023までの数値に変換してくれます。
アナログ入力ピンに入力された電圧値の変化(0~5V)はA/D変換され0~1023の数値の変化として取り扱われるようになります。
それでは実際に確認してみます。
このようなスケッチを作ってみました。
シリアルモニタを使いアナログ入力ピンに取り込まれた数値を表示させるものとなります。
シリアルモニタの使い方はこちらの記事を参考にして下さい!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Arduino入門編⑫ 光センサー(Cds)でLEDの点灯制御2 // https://burariweb.info int cds = 0; void setup() { Serial.begin(9600); // シリアル通信の開始 } void loop() { cds = analogRead(0); // アナログピンA0の値を読み取る(0~1023) Serial.print("アナログ値:"); // シリアルモニタにアナログ値を表示 Serial.println(cds); delay(500); } |
数値化することが出来れば、あとはスケッチ(プログラム)によりいろいろと利用できます。
それでは今回の目的である明るい時にはLEDを消灯し、暗くなると点灯するという回路&スケッチにしてみたいと思います。
明るさの変化でLEDを制御してみる
明るさによりLEDをON/OFFさせる
それでは先程の回路はそのままで、LEDを点灯させる回路を追加したいと思います。
LEDのON/OFFなのでデジタル入出力ピンを使います。
先程の回路にLEDを点灯させる回路を追加しました。
デジタル出力ピンD5を今回使いました。
LEDの電流制限抵抗を1本入れただけの簡単な回路ですね。
デジタル入出力ピンを使ったLEDの点灯方法はこちらの記事を参考にしてみて下さい!
そしてこのようなスケッチを作ってみました。
ここではしきい値を600としています。
この値を変えることによりLEDのON/OFFが切り替わるタイミング(明るさ)を調整できます。
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 | // Arduino入門編⑫ 光センサー(Cds)でLEDの点灯制御3 // https://burariweb.info int cds = 0; int led_pin = 5; void setup() { pinMode(led_pin,OUTPUT); // デジタルピン5を出力に Serial.begin(9600); // シリアル通信の開始 } void loop() { cds = analogRead(0); // アナログピンA0の値を読み取る(0~1023) if(cds>600) // アナログピン入力値が600より大きい場合(暗い場合) { digitalWrite(led_pin,HIGH); // LEDを点灯 Serial.print(" 点灯 アナログ値:"); // シリアルモニタにアナログ値を表示 Serial.println(cds); delay(500); } else { digitalWrite(led_pin,LOW); // LEDを消灯(明るい場合) Serial.print(" 消灯 アナログ値:"); // シリアルモニタにアナログ値を表示 Serial.println(cds); delay(500); } } |
暗くなるとLEDが点灯し、明るい場合は消灯する動作となります。
この投稿をInstagramで見る
明るさに応じLEDの照度を変化させる
次にまわりの明るさに応じLEDの明るさを徐々に変化させることもPWM制御を使えば簡単です。
LEDのPWM制御に関してはこちらの記事を参考にして下さい!
デジタル入出力ピン5はPWM制御で使える端子となるので上記回路はそのままでスケッチのみ変更したいと思います。
このようなスケッチを作りました。
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 | // Arduino入門編⑫ 光センサー(Cds)でLEDの点灯制御4 // https://burariweb.info int cds = 0; int PWM = 0; int per = 0; int led_pin = 5; void setup() { pinMode(led_pin,OUTPUT); // デジタルピン5を出力に Serial.begin(9600); // シリアル通信の開始 } void loop() { cds = analogRead(0); // アナログピンA0の値を読み取る(0~1023) PWM = map(cds,0,1023,0,255); // アナログ入力値を0~255の範囲に変換 per = map(PWM,0,255,0,100); // アナログ入力値を0~100の範囲に変換 analogWrite(led_pin,PWM); // PWMでLEDを0~255段階で点灯 Serial.print("照度:"); // シリアルモニタに表示 Serial.print(per); Serial.println("%"); delay(100); } |
ここで注意したいのが、入力によりアナログ入力ピンから取り込まれた値は0~1023までの1024段階だということ。
そしてLEDのPWM制御で使うanalogWrite関数に指定できる値は0~255までの256段階だということです。
単純に4で割って対応出来ます。(ここではmap関数を使っています)
またシリアルモニタにLED照度をパーセント(%)表示させています。
この投稿をInstagramで見る
このように明るさに応じLEDの点灯照度を制御することも出来ました。
これで今回の目標は達成です!
回路&スケッチともに簡単なものとなりますが、いろいろと応用が出来るかと思います。
今回のポイント
光センサー(Cdsセル)を今回使ってみましたが、Arduinoの制御方法としてはこれまでやってきたアナログ入力ピンやデジタル入出力ピンに関して理解できていれば簡単な内容のものとなります。
- 光センサー(Cdsセル)は明るさにより抵抗値が変化する
- Arduinoに取り込むには「抵抗の分圧」を使えば電圧の変化として取り込むことができる
今回使ったパーツ
フォトレジスタセット(光センサー:Cds)
光センサー(Cdsセル)は、明抵抗値と暗抵抗値によりサイズや型番が異なるようです。
今回使用したセルは以下リンクのGL5528のものとなります。
明抵抗:10~20kΩ、暗抵抗:1MΩのものとなります。
Arduino UNO
Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数メーカーから販売されています。
互換品でも正規品と比べて特に問題なく使用でき安価で入手出来るのでArduino学習用としていいですね!(ELEGOO製のArduino Unoは使いやすいかと思います。)
Arduino スターターキット
また、これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。
私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)
そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)
参考 チュートリアルダウンロードELEGOO基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。
スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
今回使用したフォトレジスタも数個付属していました。
抵抗セット
抵抗は電子工作では使用頻度が高いパーツの1つです。
1000本ほど入ったものがセット販売されていますが、1セット持っておくとこれから便利になるかと思います。
上記Arduinoスターターキットにもある程度の数(正確な本数数えてなくてすいません)入っており、LEDの制限抵抗としてやプルアップ・プルダウン用抵抗として使えます。
ブレッドボードを使い複数の回路を組んで同時にいろいろと試して・・・なんてやってると、やはり本数的にたくさん手元にあった方がいいかと思います。
最後に!
光を検出するセンサーは高精度のものなど多数ありますが、電子工作用途で安価で入手できるセンサーとしては簡単に使えるものでした。
複数の光センサーを取り付け一番明るい方向(太陽など)にサーボモーターを動かして太陽電池の位置を最適にするなど・・・アイデア次第でいろいろと使えそうですね!
コメントを残す