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セルの上に手をかざしたり、光を完全に遮断したりして、値の変化を読み取ります。
私の部屋での観測値は、以下のようでした。
- 明るい時 757
- 暗い時 500
- 遮断した時 272
この値は。通常時に変化する範囲を示すので、次のスケッチで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関連の命令の簡単な説明とその日本語レファレンスの掲載されているリンクを紹介します。
- constrain(x, a, b)
数値を指定した範囲のなかに収めます。
xがa以上b以下のときはxがそのまま返ります。
xがaより小さいときはa、bより大きいときはbが返ります。 - map(value, fromLow, fromHigh, toLow,
数値をある範囲から別の範囲に変換します。
fromLowと同じ値を与えると、toLowが返り、
fromHighと同じ値ならtoHighとなります。
その中間の値は、2つの範囲の大きさの比に基づいて計算されます。
動作の確認
次回は、直流モータの接続を学習します。