Lesson 18
光電池
必要な部品構成
- (1) x Elegoo Uno R3
- (1) x 830 tie-points breadboard
- (8) x leds
- (8) x 220 ohm resistors
- (1) x 1k ohm resistor
- (1) x 74hc595 IC
- (1) x Photoresistor (Photocell)
- (16) x M-M wires (Male to Male jumper wires)
CdS セル 光可変抵抗器
CdSセルは、硫化カドミウム(CdS)を主成分とする光導電素子の一種で、光の当たる量によって抵抗値が変化します
受光部に当たる光の量が多ければ、抵抗値が小さくなり、暗くなると点灯する街路灯や保安灯などに利用されています。
フォトレジスター【CdSセル】 - sanuki-tech.net
本キットに入っている CdS セルのデータシートは下記
3mm CdS photosensitive resistor KLS6-3537
0Lux の光量で 2MΩ、10Luxで18-50KΩとある。
構成
Lesson 16 の構成を流用し CdS フォトレジスタを追加する
サンプルコードをデプロイするとフォトレジスタへの光の当たり具合で LED の点灯状況が変化する事を確認できる。
int lightPin = 0;
int latchPin = 11;
int clockPin = 9;
int dataPin = 12;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 57; //1023 / 9 / 2
if (numLEDSLit > 8) numLEDSLit = 8;
leds = 0; // no LEDs lit to start
for (int i = 0; i < numLEDSLit; i++)
{
leds = leds + (1 << i); // sets the i'th bit
}
updateShiftRegister();
}
ピン定義、setup()
定義周りは Lesson16 同様となっており、Loop()
内で フォトレジスタの抵抗値から光らせる LED 数を計算している。
int numLEDSLit = reading / 57;
通常に考えた場合、点灯を制御させたい LED 数は8個なので、アナログ入力の数値幅 1023 を8で割った数で制御することが正しく思えます。
しかしフォトレジスタにおいて抵抗値0はありえなく、抵抗値が 1KΩとなってしまった場合、固定抵抗の 1KΩ と合わせて 2kΩ、
その分を考慮し8分割しようとするので
8 = 1023 / 2 / x
8 = 511/x
そこから 57 となっている。
あとは取得されたアナログ入力値に沿ってシフトレジスタにどの LED を点灯させるかを指定している。