マイコンボードArduino Nanoと、明るさセンサであるCdSセルという部品を使って、暗くなった時にLEDを点灯させてみようという試みです。
周囲の明るさに応じてPWMでLチカの強さを調整し、その値をLCDキャラクタディスプレイに表示してみます。
このページは、マイコン Lチカ道場 Arduino編:3-3:暗くなるとLチカ に対応するページです。
CdSセルとは
CdSセルは、明るさで抵抗値が変わる部品です。
暗いときに抵抗値が大きく、光りが当たると抵抗値が小さくなります。
ちなみに、CdSとは硫化カドミウムの略です。なんだか毒々しい名前ですね。
※カドミウムは毒性があるので、なめたり・むやみに砕いて捨てたりは絶対にしないようにしましょう。
今回使用するCdSセルの型名と特性チェック
共立エレショップで購入したCdSセルです。
形名:SEN-9006(メーカー不明)
※現在は販売終了しているようです。
明るさ(ルクス)とCdSの抵抗値を確認してみました。
明るさ ルクス(lux) | CdSの抵抗値 (kΩ) | 備考 |
– | 5877 | 缶で覆って暗くした状態 |
40 | 37.84 | 薄暗い玄関照明 |
126 | 11.75 | 昼の薄暗い部屋 |
389 | 4.13 | 夜リビングの照明を点けた部屋くらい |
1181 | 1.75 | レースのカーテン越しの日差し |
1631 | 1.29 | 〃 |
-(6000以上) | 0.27 | 直射日光 |
明るさを測定しているテスターは、秋月電子で購入したMETEX:M-6000Mです。
抵抗値の測定は三和のPC7000を使用しています。
回路図
今回の回路図は下記になります。
今回Arduino NanoでA/D変換を行うので、データがどうなっているか確認するためにLCDディスプレイモジュール(キャラクタ液晶モジュール)を繋げて表示させてみます。
部品リスト
品名 | 参照名 | 数量 | 数値・仕様 |
マイコンボード | A1 | 1 | Arduino nano |
LED | D1 | 1 | 青色LED |
抵抗器 | R1 | 1 | 100kΩ |
CdSセル | R2 | 1 | SEN-9006 |
可変抵抗 | RV1 | 1 | 10kΩ、Bカーブ |
LCDモジュール | – | 1 | HiLetgo製 16X2 キャラクタ LCDディスプレイ |
I2C変換基板 | – | 1 | HiLetgo製 LCD用 IIC/I2C/TWI/SPI シリアルインタフェースモジュール PCF8574使用 |
CdSと抵抗による分圧値の予測
CdSと抵抗(R1:100kΩ)の分圧回路から、明るさがどの位の時にどの程度のA/D変換値となるか予測してみました。
明るさ ルクス(lux) | CdSの抵抗値 (kΩ) | 分圧後の電圧 | AD変換予測値 |
– | 5877 | 4.916 | 1006 |
40 | 37.84 | 1.372 | 281 |
126 | 11.75 | 0.526 | 108 |
389 | 4.13 | 0.198 | 41 |
1181 | 1.75 | 0.086 | 18 |
1631 | 1.29 | 0.063 | 13 |
-(6000以上) | 0.27 | 0.013 | 3 |
上記の表より、40ルクスあたりの時(AD変換値で280以上あたり)にLEDが光はじめるように設定してみます。
LCDキャラクタディスプレイモジュールについて
LCDキャラクタディスプレイは、Amazonで購入した16列×2行のものを使います。
I2Cへの変換基板を接続して使用します。
これを使用することで、LCDキャラクタディスプレイをI2C接続に変換することができます。
可変抵抗でLCDのコントラストを調整できます。
はじめ何も映らずに焦りましたが、可変抵抗を回すことで表示されました。
プログラム(スケッチ)
やりたいこと
ある程度暗いとLEDが光りだすようにする。
単純なオンオフではなく、PWMで暗さに応じて明るさを換えてみる。
光りだす明るさを可変抵抗で調整できるようにする。
LCDキャラクタディスプレイにA/D変換した値とPWM値を表示させてみる。
プログラム
#include <LiquidCrystal_I2C.h>
#define LED_PIN 9 // LEDのピン番号
#define CdS_PIN A0 // CdSのピン番号
#define REF_PIN A1 // 基準電圧用の可変抵抗のピン番号
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCDディスプレイのオブジェクトを作成
int cds_value; // CdSのA/D変換値を格納する変数
int ref_value; // 基準電圧のA/D変換値を格納する変数
int pwm; // PWMの数値を格納する変数
void setup() {
pinMode(LED_PIN, OUTPUT); // LEDピンを出力モードに設定
lcd.init(); // LCDディスプレイの初期化
lcd.backlight(); // LCDディスプレイのバックライトを点灯
}
void loop() {
cds_value = analogRead(CdS_PIN); // CdSの値を読み取る
ref_value = analogRead(REF_PIN); // 可変抵抗の値を読み取る
if (cds_value > ref_value ){
//cds_valueがref_valueより大きい場合、その差に応じてPWM値を増やしてLEDを点灯する。
pwm = map(cds_value, ref_value, 1023, 10, 255); // 点滅用のPWM値に変換する(ref_value~1023 → 10~255)
analogWrite(LED_PIN, pwm); //LEDをPWMで点灯させる
} else {
//ref_valueの方が大きい場合、LEDを消灯させる
pwm = 0;
analogWrite(LED_PIN,pwm);
}
//LCD表示用
lcd.clear(); // LCDディスプレイの内容を消去する
lcd.setCursor(0,0); // LCDディスプレイのカーソル位置を設定する(左上が(0,0))
// LCDディスプレイにAD変換値を表示する
lcd.print("CdS:");
lcd.print(cds_value);
lcd.setCursor(8,0);
lcd.print("REF:");
lcd.print(ref_value);
// LCDディスプレイにPWM値を表示する
lcd.setCursor(0,1);
lcd.print("PWM:");
lcd.print(pwm);
delay(1000); // 測定間隔
}
動作確認
ブレッドボードで組んで動作確認してみました。
まず可変抵抗を回すことで、光りはじめる基準値(ref_value)を設定します。
ここでは、269に設定しています。
部屋は夜にシーリングライトをつけている状態で、CdSピンのA/D変換値(cds_value)は55になっています。※たぶん380ルクスくらい。
この状態では、ref_value>cds_valueなので、LEDは光りません。
部屋の明るさを減らすと、cds_value>ref_valueとなって、LEDが点灯しました。
cds_valueの値と、ref_value~1023までの比でPWM値を決めるようにしたので、PWM値は78となっています。
CdSセルを布で覆って遮光すると、cds_valueは745、PWM値は164になりました。
もっと完全に遮光してやらないとMAXにはならないようです。
CdSセルに懐中電灯を照射すると、抵抗値が下がってcds_valueは7になりました。
もちろんLEDは消灯します。
可変抵抗を最小まで回すことで、ref_valueが0になり、LEDは常時点灯するようになります。
ただし、部屋が明るい状態ではPWM値が小さいので、暗めに点灯しています。
動画で見てみよう
まとめ
マイコンボードArduino Nanoと、明るさセンサーのCdSセルを使って、暗くなるとLEDがPWMで点灯するような回路を作ってみました。
センサーとA/D変換を使って、周囲の環境に応じてLチカをさせることができました。
また、A/D変換した値をLCDキャラクタディスプレイに表示させてみました。
液晶画面で数値を確認出来るので、動作がわかりやすくていいですね。
引き続き難しいLチカに挑戦して行きましょう。
参考リンク
今回使用したCdSセル(SEN-9006)が共立エレショップで取り扱い終了していたので、類似品になります。