超ゆるゆる技術ブログ🌷

プログラミング勉強中です。

【Arduino】光センサ使ってみた


光センサでLEDを操る!

f:id:dd15038:20180725112849j:plain
前回の傾斜センサと回路もプログラムも同じような感じです。
傾斜センサが光センサに変わっただけみたいな🤔

f:id:dd15038:20180725113255j:plain
光センサはというとこんなやつです。
Amazonでめっちゃ安くて量が多いやつ買いました。
光センサは別名cdsセルと言うそうです。cdsというのは硫化カドミウムのことです。
このセンサーは、明るいときと暗いときで抵抗値が変わる仕組みになっています。

プログラム

//光センサを接続するピンを設定
//光センサはA0ピンに接続
//先頭にconstをつけるとこの後値を変更できなくなります
const int sPin = A0;
//LEDを接続するピンを設定
const int lPin = 13;

//光センサの闘値(HIGHかLOWかを判断する基準値)
//ここでの閾値は試行錯誤の結果で設定
const int threshold = 665;

void setup() {
  //デジタル13番ピンを出力用として設定
  pinMode(lPin, OUTPUT);
  //通信速度9600bpsでシリアル通信のポートを開ける
  Serial.begin(9600);
}

void loop() {
  //光センサから得た値をsValueへ格納
  int sValue = analogRead(sPin);

  //シリアルモニタに光センサからの値を表示
  Serial.print("sensor = ");
  Serial.println(sValue);

  //周りが暗いとき
  if (sValue < threshold){
    //LEDを点灯する
    digitalWrite(lPin, HIGH);
  }
  //それ以外の時(周りが明るいとき)
  else {
    //LEDを消灯する
    digitalWrite(lPin, LOW);
  }

  delay(250);
}

そいじゃあ解説。
まず、今回私は電源ピンの電圧は3.3Vで光センサに繋げたので、閾値の設定方法は傾斜センサのときとは異なっています。
なんでこうしたかというと、こちらのほうが数値の変化が分かりやすかったからです。
今回なぜか光センサから出力される値の変化がほぼ無く、閾値は光センサとシリアルモニタの様子を見ながら決めた変化が起こりそうなギリギリの値なのです。

で、次。loop()関数の中で光センサから得た値を格納する変数「sValue」を定義し、さらにシリアルモニタに表示させるようにと書いておきます。
またif()関数を使い、先ほどの変数が閾値より小さくなればLEDが点いて、大きくなればLEDは消える状態になるようにともしておきます。

最後に、delay()関数で250ミリ秒待つようにしておきます。
ちなみにこれを書いておくことで、シリアルモニタで値が表示される速度が変わります。

回路図

f:id:dd15038:20180725175843p:plain
だいたい今までのものと変わりはありませんが、今回は抵抗はさみませんでした。
光センサは山ほどあるし、LEDも他にあるし一個くらい壊れてもいいかなって思ったので。
色んなセンサーを試したいだけなのでね。

実際のようす

・まず、何もしてない状態。
f:id:dd15038:20180725180500j:plain
どうやらこの状態だと、光センサから得た値は閾値より大きいっぽいですね。
f:id:dd15038:20180725180623p:plain
シリアルモニタもこの通り。値は666~668の間をうろうろしています。閾値は665なのでギリ超えている感じです。

・次、指でセンサを押さえて暗くしている状態。
f:id:dd15038:20180725180835j:plain
f:id:dd15038:20180725180853j:plain
はい…。
なぜか点いたり消えたりしています(゜゜)
f:id:dd15038:20180725181155p:plain
シリアルモニタもこんな感じ。閾値と同じか小さくなっている値もあるのですが、大きくなっている値も存在しています!なんででしょう…?

ちなみに山ほどあるセンサ全部試しましたが結果は全部一緒でした。
これは何が悪いんだろう…。前の傾斜センサの時も値がうろちょろしてLEDは点いたり消えたりしてたし…。

感想

前回の傾斜センサのときからといい、難しい問題が次々と起きていて焦ります…!
回路の組み方が悪いのか、プログラムが悪いのか、センサーが悪いのか、もしかしたらArduino自身が悪いのか…?
一番ありえそうなのは回路の組み方だと思うんですよね…。だから一度、シールドっていうのを試してみたいです。
ただ前回の結果に対しての個人の勝手な意見は、傾斜センサがいろんな値を出していたのは中にあるボールが転がり続けてたんじゃないかなぁと。
または細かくXYZ軸を指定しないとだめなのかなぁと。

今回のは、センサーを別の品に変えてみようかなって思いました。安価だったのが少し心配ではあったので。
今も別のセンサーをいろいろ試していて、異常なく動いているのでArduino自身に問題があるとは思えませんでした。

まぁ結局、微妙ではあったけどセンサーの値は変化してLEDにちゃんとその結果が反映されて点灯消灯してくれたから良しとします!