💡

光センサの使い方

2022/12/22に公開


暗いとLEDが点灯する

CdSセルを使うと明るさがわかる

  • 「光センサ」や「光可変抵抗」とも呼ばれる
  • CdS → 硫化カドミウム
    • Cd → カドミウム
    • S → 硫黄
  • 光によって電子が動くと抵抗値が変わる
  • GL5528 がよく使われる

https://akizukidenshi.com/catalog/g/gI-05859/

配線

  • CdSセルと抵抗を直列に繋ぐ (LEDのときと同じ)
  • CdSセルと抵抗の間にジャンパー線を指してアナログ入力の A0 に接続する

基本: CdSセルの抵抗値を取得するコード

void setup() {
}

void loop() {
  int value = analogRead(A0);
  float volt = float(value) * 5 / 1024;
}

A0 の入力が analogRead(A0) で取れる。そのまま使ってもいいけど1024段階を5段階の電圧値に変換すると扱いやすい。

1023 は 5V ではない ← 重要

https://www.jh4vaj.com/archives/28146

http://igarage.cocolog-nifty.com/blog/2020/01/post-a02d3f.html

http://igarage.cocolog-nifty.com/blog/2020/05/post-115911.html

間違った情報が広まっているとのこと。

入力値の最大1023に対応するのは5Vではなく5Vに最も近い5V未満の値なので1023で割るのではなく1024で割るのが正しい。

応用: 暗いとLEDを灯す

void setup() {
  pinMode(10, OUTPUT);
}

void loop() {
  int value = analogRead(A0);
  float volt = float(value) * 5 / 1024;
  digitalWrite(10, volt < 1.0);
  delay(1000 * 0.1);
}

部屋の電気を消したら 1 未満だったので volt < 1.0 のとき LED をつけるようにした。

ループ問題

LED の光によって暗い状態が解消され、「明るくなったので LED が消える」→「やっぱり暗いので LED 灯す」をループしてしまいそうだが実際ループする。

LED の光が弱いのでCdSセルはまだ暗いと思っているだけなので、LED の上を手で覆うと、手に反射した光にCdSセルが反応してループしだす。

同様にもし街路灯の光センサが街路灯自身の光に反応してしまったらループすると思われる。

疑問

参考にしている入門書ではCdSセルに添える抵抗値を 10KΩ としているが、なぜその値なのかが解説を読んでもわからなかった。

スペック
明抵抗 10~20kΩ(10Lux時)

とりあえずわからない場合は明抵抗値の下限に合わせたらいいのかな?

TODO: わかったら書く

Discussion