暗くなったらLチカ【マイコン Lチカ道場 Arduino編 3-3】

Arduino CdSセルで暗くなったらLチカ Arduino
当サイトのリンクにはアフィリエイト広告が含まれています。

マイコンボードArduino Nanoと、明るさセンサであるCdSセルという部品を使って、暗くなった時にLEDを点灯させてみようという試みです。

周囲の明るさに応じてPWMでLチカの強さを調整し、その値をLCDキャラクタディスプレイに表示してみます。

このページは、マイコン Lチカ道場 Arduino編:3-3:暗くなるとLチカ に対応するページです。

スポンサーリンク

CdSセルとは

CdSセルは、明るさで抵抗値が変わる部品です。
暗いときに抵抗値が大きく、光りが当たると抵抗値が小さくなります。

使用するCdSセル:SEN-9006
CdSセル:ブレッドボードに挿したところ

ちなみに、CdSとは硫化カドミウムの略です。なんだか毒々しい名前ですね。
※カドミウムは毒性があるので、なめたり・むやみに砕いて捨てたりは絶対にしないようにしましょう。

今回使用するCdSセルの型名と特性チェック

共立エレショップで購入したCdSセルです。
形名:SEN-9006(メーカー不明)
※現在は販売終了しているようです。

明るさ(ルクス)とCdSの抵抗値を確認してみました。

明るさ
ルクス(lux)
CdSの抵抗値
(kΩ)
備考
5877缶で覆って暗くした状態
4037.84薄暗い玄関照明
12611.75昼の薄暗い部屋
3894.13夜リビングの照明を点けた部屋くらい
11811.75レースのカーテン越しの日差し
16311.29
-(6000以上)0.27直射日光
40ルクス:薄暗い玄関照明
389ルクス:リビング照明
1181ルクス:レースのカーテン越しの日差し
缶で被った状態

明るさを測定しているテスターは、秋月電子で購入したMETEX:M-6000Mです。
抵抗値の測定は三和のPC7000を使用しています。

スポンサーリンク

回路図

今回の回路図は下記になります。

CdSセルのテスト回路図

今回Arduino NanoでA/D変換を行うので、データがどうなっているか確認するためにLCDディスプレイモジュール(キャラクタ液晶モジュール)を繋げて表示させてみます。

部品リスト

品名参照名数量数値・仕様
マイコンボードA11Arduino nano
LEDD11青色LED
抵抗器R11100kΩ
CdSセルR21SEN-9006
可変抵抗RV1110kΩ、Bカーブ
LCDモジュール1HiLetgo製 16X2
キャラクタ LCDディスプレイ
I2C変換基板1HiLetgo製 LCD用 IIC/I2C/TWI/SPI
シリアルインタフェースモジュール
PCF8574使用

CdSと抵抗による分圧値の予測

CdSと抵抗(R1:100kΩ)の分圧回路から、明るさがどの位の時にどの程度のA/D変換値となるか予測してみました。

明るさ
ルクス(lux)
CdSの抵抗値
(kΩ)
分圧後の電圧AD変換予測値
58774.9161006
4037.841.372281
12611.750.526108
3894.130.19841
11811.750.08618
16311.290.06313
-(6000以上)0.270.0133

上記の表より、40ルクスあたりの時(AD変換値で280以上あたり)にLEDが光はじめるように設定してみます。

LCDキャラクタディスプレイモジュールについて

LCDキャラクタディスプレイは、Amazonで購入した16列×2行のものを使います。

LCDキャラクタディスプレイ
LCDキャラクタディスプレイ:裏面

I2Cへの変換基板を接続して使用します。
これを使用することで、LCDキャラクタディスプレイをI2C接続に変換することができます。

I2C変換基板
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セル動作確認:室内照明ON

部屋の明るさを減らすと、cds_value>ref_valueとなって、LEDが点灯しました。
cds_valueの値と、ref_value~1023までの比でPWM値を決めるようにしたので、PWM値は78となっています。

CdSセル動作確認:室内照明OFF

CdSセルを布で覆って遮光すると、cds_valueは745、PWM値は164になりました。
もっと完全に遮光してやらないとMAXにはならないようです。

CdSセル動作確認:CdSセルを被い隠し

CdSセルに懐中電灯を照射すると、抵抗値が下がってcds_valueは7になりました。
もちろんLEDは消灯します。

CdSセル動作確認:CdSセルに懐中電灯をあてた状態

可変抵抗を最小まで回すことで、ref_valueが0になり、LEDは常時点灯するようになります。
ただし、部屋が明るい状態ではPWM値が小さいので、暗めに点灯しています。

CdSセル動作確認:基準値を0にした場合

動画で見てみよう

まとめ

マイコンボードArduino Nanoと、明るさセンサーのCdSセルを使って、暗くなるとLEDがPWMで点灯するような回路を作ってみました。

センサーとA/D変換を使って、周囲の環境に応じてLチカをさせることができました。
また、A/D変換した値をLCDキャラクタディスプレイに表示させてみました。
液晶画面で数値を確認出来るので、動作がわかりやすくていいですね。

引き続き難しいLチカに挑戦して行きましょう。

参考リンク

今回使用したCdSセル(SEN-9006)が共立エレショップで取り扱い終了していたので、類似品になります。

タイトルとURLをコピーしました