💡

光センサの使い方

2022/12/22に公開約1,700字


暗いとLEDが点灯する

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

  • 「光センサ」や「光可変抵抗」とも呼ばれる
  • CdS → 硫化カドミウム
    • Cd → カドミウム
      • 毒性の重金属でたくさん摂取すると肝機能障害になる
    • S → 硫黄
  • 光によって電子が動くと抵抗値が変わる
    • と言われてもピンとこないので光の強さに応じて可変抵抗のつまみを自動で動かしてくれるものと考えよう
  • GL5528 という部品がよく使われるらしい
    • 1個 25円

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段階の電圧値に変換すると扱いやすい
  • setup() は書くことないので取ったらエラーになったので空でもいるっぽい

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未満の値とのこと
  • それであれば1024段階のものを1023分割してはいけない
    • 参考にしている入門書では1023で割っちゃってるけれども(小声)

応用: 暗いと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

ログインするとコメントできます