ArduinoとCdS光センサ

こんなこと、やります。

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

ArduinoとCdS光センサ
ArduinoとCdS光センサ

つかうもの

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

CdSセル 光センサ

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

CdSとは

CdSとは、硫化カドミウムを使用した光センサです。可視光線の光の強さによって抵抗値が変化する抵抗型センサです。光が強くなればなるほど、センサの抵抗値が下がり、電流が流れやすくなります。 フォトトランジスタに比べると反応速度はだいぶ遅いですが、日中と夜を判断するような用途にはCdSセンサで十分です。

ちなみに、フォトトランジスタの使い方は 【Raspberry Pi】照度センサ(フォトトランジスタ)と温度センサ(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で読み取ってみましょう。こちらがソースコードです。

cpp
#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つの光センサで光の方角を判定

ソースコード

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

cpp
#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つあるのかどうかはわかりませんが。

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

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

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

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

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

人気のArduino互換機
Arduinoで人気の周辺パーツ
あると便利な道具
Arduinoのオススメ参考書

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

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

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

関連記事