ArduinoとCdS光センサ

 

こんなこと、やります。

  • ArduinoでCdS光センサを使ってみる
  • 光センサを使って、光の方角を判定してみる

ArduinoとCdS光センサ

つかうもの

この記事で主につかうものは、ArduinoとCdS光センサと固定抵抗です。

CdSセル 光センサ

CdSセルの光センサを使用します。抵抗値は、1MΩ程度のものが使いやすいです。

CdSとは

CdSとは、硫化カドミウムを使用した光センサーです。可視光線の光の強さによって抵抗値が変化する抵抗型センサーです。光が強くなればなるほど、センサの抵抗値が下がり、電流が流れやすくなります。

フォトトランジスタに比べると反応速度はだいぶ遅いですが、日中と夜を判断するような用途にはCdSセンサで十分です。

ちなみに、フォトトランジスタの使い方は【ラズパイ】照度センサ(フォトトランジスタ)と温度センサ(TMP36)をご参考になさってみてください。

Arduino

Arduino Uno Rev3を使用しました。

この記事の内容は、ほかのArduinoでも動作します。

Arduinoをお持ちでないようでしたらオススメArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へをご参考になさってみてください。

その他の電子部品

10kΩの固定抵抗を使いますので、あわせて用意しておいてください。

ブレッドボードやジャンプワイヤをお持ちでない方は揃えておいてください。

開発環境

項目 バージョン
統合開発環境 VS Code x Platform IO
パソコン macOS Big Sur 11.0.1

Macを使用しましたが、WindowsやLinuxでも構いません。また統合開発環境も、Arduino IDEで大丈夫です。

ArduinoでCdS光センサをつかってみる

ArduinoでCdS光センサ
ArduinoでCdS光センサ

まずは、ArduinoにCdS光センサをつないで、光に応じて変化するセンサの値を読み取ってみましょう。

ArduinoとCdSの配線

CdS光センサと10kΩの抵抗を直列につないで、その両端に5Vの電圧をかけます。CdS光センサと抵抗で分圧した点を、Arduinoのアナログ入力へつなぎます。

ArduinoとCdSの配線
ArduinoとCdSの配線

CdS光センサに極性はないので、とくに向きを気にする必要はありません。

ソースコード

CdSと抵抗で分圧された電圧値をArduinoで読み取ってみましょう。こちらがソースコードです。

#include <Arduino.h>


int A0 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
}

void loop() {
  float v = analogRead(A0);  
  Serial.println(v);
  delay(1000);
}

光センサの周辺の明るさを変えると、読み取ったアナログ値が変化するはずです。光センサにライトを近づけたり、離したりして実験してみてください。ちなみにArduinoでは、analogReadは0〜1023の値で変化します。

2つの光センサで光の方角を判定

次に、2つのCdSセルを使って光の方角を判定させてみます。

ArduinoとCdSの配線

先ほどの配線をベースに、さらにもう1つのCdSセルと抵抗を使って、分圧された地点をArduinoのA1につなぎます。

2つの光センサで光の方角を判定
2つの光センサで光の方角を判定

ソースコード

光源が左右のどちらにあるか判定させるだけの、カンタンなプログラムを書いてみました。

#include <Arduino.h>


int LEFT = 0;
int RIGHT = 1;
int threshold = 100;

void setup() {
  Serial.begin(9600);
  pinMode(LEFT, INPUT);
  pinMode(RIGHT, INPUT);
}

void loop() {
  int vL = analogRead(LEFT);
  int vR = analogRead(RIGHT);
  int diffLR = vL - vR;
  if (diffLR > threshold)
  {
    Serial.println("LEFT");
  }
  else if(diffLR < -threshold) {
    Serial.println("RIGHT");
  }
  else
  {
    Serial.println("CENTER");
  }
  delay(1000);
}

コード内のthresholdはしきい値です。しきい値がないと、光源が中央にあっても常に左右どちらかに振れてしまうので、そのために必要です。

発展:オペアンプの作動入力を使ったアイデア

さらにセンサを追加して、上下の方角も判定させることが可能です。ひまわりのように、太陽の方向にあわせて向きを変えることができれば、効率よく太陽発電ができそうです。

ただし、センサの数が増えるごとにアナログピンが占領されていきます。そこで、もう少しスマートにやれる方法を考えてみました。それが、オペアンプの作動入力を使ったアイデアです。回路図のように、オペアンプの作動入力を使うこと、どちらのセンサが明るい方角にあるか判定できます。

オペアンプの作動入力を使って光源を判定させる回路図
オペアンプの作動入力を使って光源を判定させる回路図

作動入力は、2つの入力電圧の引き算を結果として出力する回路です。

この場合、それぞれの入力に対する出力は次の式で計算できます。

$$V_{OUT} = V_{IN+} - V_{IN-}$$

回路図の100kΩの抵抗は、増幅率を上げるためのものです。

これを使えば、Arduinoのアナログ入力を2つ使っていたところを、1つで済ませることができます。

オペアンプに興味のある方はギターエフェクタで使える!電子回路図特集にさまざまな回路図例を掲載してますので、ご参考になさってみてください。

発展:センサひとつで方角を判定する裏ワザ

2つのセンサを使って方角を判定するのは、動物の目や耳もおなじです。いちはやく強敵や獲物の方角を探知できないと、自然界では生きてはいけないでしょう。そういった理由で、動物には目や耳が2つあるのかどうかはわかりませんが。

ところで、ひとつだけのセンサでも、方角を判定できるのをご存知でしたでしょうか。

こちらの映像のように、センサ自身が首を振ることで可能です。レーダーや潜水艦のソナーと同じような発想ですね。

超音波センサひとつで方角を判定してみた
超音波センサひとつで方角を判定してみた

この映像の詳細はこちらの記事をご覧ください。

記事に関するご質問などがあれば、
Twitter または お問い合わせ までご連絡ください。
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事