部屋が暗くなると自動で点灯するライトは便利だなって思いました。
そのような明暗センサ付きライトは値段が高く、すぐには手が出ないなぁとも思ってました。
そこでArduinoの出番です。
Arduinoを使うことで、様々なモノを電子工作で作ることが出来ます。
もちろん部屋の明るさをチェックすることも、ライトの明るさを変えることもできます。
今回は、部屋の明るさを検知してLEDの明るさを制御するシステムを作ります。
- フォトレジスターを使用して明るさを検知する方法
- 外部の明るさからLEDの明るさを制御する方法
- シリアル通信による入力電圧を確認する方法
本記事で使用するArduinoと電子部品
今回はArduino Unoを使って電子工作を行います。
部屋の明るさを検知するためには、フォトレジスタという素子を使用します。
また、出力をして制御するライトにはLED(発光ダイオード)を使用します。
これらフォトレジスターやLED、そして他に必要となる抵抗器やジャンパー線などを含んだおすすめのArduinoセットを紹介します。
ELEGOO Arduino UNO R3 スターターキット
(画像をクリックするとAmazonに飛びます。)
このArduinoセットにはArduino Unoの互換品も含まれています。
そのため、このセットがあれば直ぐにArduinoを使用した電子工作が始められます。
明暗感知LEDシステムの構成
今回は部屋の明るさを検知して、その明るさに合わせてLEDの明るさを変更するシステムを作成します。
明暗を検知するために、フォトレジスターを使います。
フォトレジスターとは、光の強さによって抵抗値が変化する素子です。
このフォトレジスターを使って、部屋の明るさを検知して、Arduinoへ信号を送ります。
Arduinoでは入力された信号から、部屋の明るさレベルを算出します。
そして、部屋の明るさに合わせてLEDの明るさを制御するため、LEDに適切なアナログ電圧を出力します。
Arduinoから出力されたアナログ電圧が変化することにより、LEDの明るさが変更されます。
このような流れで、Arduinoを使用した明暗感知LEDシステムを作成します。
フォトレジスタによる光感知部を含む電子回路
フォトレジスタ(Photoresistor)は、入ってくる光の強さにより抵抗値が変化する電子部品です。
フォトレジスタに与えられる光の強度が増加すると、フォトレジスタの電気抵抗が低下します。
反対に、与えられる光の強度が減少すると、フォトレジスタの電気抵抗は増加します。
このような特性を持つフォトレジスタを用いて部屋の明るさを検知する電子回路を作成します。
電源(5V)とGND(0V)の間にフォトレジスタを抵抗器と直列に接続します。
光の強度が増加してフォトレジスタの電気抵抗が低下すると、フォトレジスタにかかる電圧は小さくなり、直列に接続された抵抗器にかかる電圧が大きくなります。
反対に、光の強度が減少してフォトレジスタの電気抵抗が増大すると、フォトレジスタにかかる電圧が大きくなり、抵抗器にかかる電圧は小さくなります。
そこで、抵抗器とフォトレジスタの間の電圧をArduinoへの出力信号とすることで、光の強度によって変化する電圧を出力することが出来ます。
光の強さからLEDの明るさを決めるプログラム
部屋の明るさを検知するために、部屋の電気が点灯している時と消灯している時のセンサ入力電圧の値を確認する必要があります。
const int SENSOR_PIN = A0;
int sensorValue = 0;
void setup() {
// put your setup code here, to run once:
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
sensorValue = analogRead(SENSOR_PIN);
Serial.println(sensorValue);
delay(100);
}
フォトレジスタによる光感知センサーからのアナログ電圧の値は、Arduinoに用意されているanalogRead関数を用いて取得することが出来ます。
analogRead関数より得られるセンサの値は、0から1023の間で出力されます。
今回は、フォトレジスタによる光感知センサの値はA0ピンに入力するように設定しました。
このプログラムを実行し、部屋の電気がONとOFFの場合におけるセンサの値を確認することで、部屋の明るさに合わせてLEDを制御することが出来ます。
センサの値を取得するために、Arduinoのシリアル通信を用いてモニターで確認します。
今回のケース(私の部屋)は、部屋の照明を点灯させた場合の値が228で、消灯させた場合の値が885でした。
そのため、センサの最小値を200、最大値を900としてLEDの制御を行うことにします。
const int SENSOR_PIN = A0;
const int LED_PIN = 11;
int sensorValue = 0;
int ledValue = 0;
const int sensorMIN = 200;
const int sensorMAX = 900;
void setup() {
// put your setup code here, to run once:
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
sensorValue = analogRead(SENSOR_PIN);
Serial.println(sensorValue);
ledValue = (int)(sensorValue - sensorMIN)*255.0/(sensorMAX - sensorMIN);
if (ledValue < 0) {
ledValue = 0;
}
if (ledValue > 255) {
ledValue = 255;
}
analogWrite(LED_PIN, ledValue);
delay(100);
}
LEDに出力するアナログ電圧を制御するために、光感知センサから得られたアナログ電圧から部屋の明るさレベルを算出します。
プログラム中のledValueについての式で、部屋の明るさからLEDに送る電圧を算出しています。
出力するアナログ電圧は0から255の間のため、センサからの値をスケーリングしています。
算出したレベルに合わせてanalogWrite関数を用いてLEDに与えるアナログ電圧(ledValue)を制御します。
これにより、部屋の明るさを検知してLEDの明るさを変更するシステムを作成することが出来ました。
まとめ
今回の記事では、部屋の明るさを検知してLEDの明るさを制御するシステムの作成を行いました。
フォトレジスタを用いることで、簡単な電子回路のみで光を感知することが可能であることが分かりました。
今回は入力としてフォトレジスタによる光感知センサを用いましたが、これを温度センサに変換すれば、温度によりLEDの明るさが変わるシステムを作ることもできます。