このサイトはMacを使って Arduino Uno の動作や活用法を学びます。

19 Arduino 光センサー(cdsセル)を接続

この記事では前回作成したLED 8個を制御できるハードウエアに光センサーを追加して使用します。光センサーで光の強さを測り、その強さに応じたLEDの数を点灯させるスケッチです。

今回使用する光センサーは、CdS光センサーで、光の強さに応じて電気抵抗が低下する抵抗器です。

回路図を掲載します。光センサーからの信号は、アナログポート AO に接続します。

 

 

cdsセルの動作確認

cdsセルがどのような働きをするのかをまず確かめます。

確認用スケッチの作成

今回使用したcdsセルは光が強くなると電気抵抗が低下するので、光が強くなるとアナログポートの電圧も上昇します。下のような簡単なスケッチで、明るい時、暗くした時、比嘉氏を遮断した時の値を読み取ります。

 

// cdsの値を読み取る
// 2021-6-13

int lightPin = 0;       // cds接続 pin

void setup() {
  Serial.begin(9600);   // シリアルモニター初期設定
}

void loop() {
  // cds読み込み値をモニターに出力
  int reading = analogRead(lightPin);
  Serial.println(reading);
  delay(1000);
}

確認用スケッチの実行

スケッチを Arduino に書き込みプログラムがスタートしたら、Arduino IDE 右上の「シリアルモニタ」アイコンをクリックします。

 

 

下のようなシリアルモニタ画面が開き、cdsセルの値を毎秒更新しています。cdsセルの上に手をかざしたり、光を完全に遮断したりして、値の変化を読み取ります。

私の部屋での観測値は、以下のようでした。

この値は。通常時に変化する範囲を示すので、次のスケッチでLEDの点灯個数の基準となります。つまり、analogReadの値が、750なら、8個のLEDを点灯、270なら全て消灯、等々...

 

 

明るさで点灯するLEDの数を変えるスケッチ

シフトレジスターでLEDを点灯させるプログラムと先ほどのcdsセルからの出力電圧を読み込むプログラムを組み合わせたものです。

cds読み取り値からLED点灯数に変換するに constrain()関数と、map()関数を使います。まず、 constrain()関数で読み取り値を変化する範囲の値に念のため制限し、その後、map()関数を使いLED点灯数に変換します。

LED点灯数から点灯パターンを作成するには、LED全て点灯のパターンである「11111111」 をLED点灯数だけ左へシフトすると、LED点灯数だけ消灯するパターンができます。これを反転すれば、希望の点灯パターンが完成です。

 

//  cdsで明るさをLED8個に表示
// 2021-6-13

int valMin = 240;       // cds最小値(LED全て消灯)
int valMax = 600;       // cds最大値(LED全て点灯)
int lightPin = 0;       // cds接続 pin
int latchPin = 11;      // 74HC595 [RCK] pin 12
int clockPin = 12;      // 74HC595 [SCK] pin 11
int dataPin  =  9;      // 74HC595 [S1]  pin 14

// LED点灯パターンをシリアルレジスタに送信する
void updateShiftRegister(byte leds) {
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}

void loop() {
  int reading  = analogRead(lightPin);

  // cds読み取り値からLED点灯数に変換
  int numLEDSLit = constrain(reading, valMin, valMax);
  numLEDSLit = map(numLEDSLit, valMin, valMax, 0, 8);

  // LED点灯数から点灯パターンを作成
  byte leds = ~(0xFF << numLEDSLit);
  updateShiftRegister(leds);  // データを送信
}

使用した Arduino命令

今回使用したArduino関連の命令の簡単な説明とその日本語レファレンスの掲載されているリンクを紹介します。

動作の確認

スケッチを Arduino に書き込みプログラムがスタートすると、LED 8個が点灯します。cdsセルに手などをかざし光を遮るとLEDが消灯していきます。 
 

 

次回は、直流モータの接続を学習します。