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の配線
CdS光センサと10kΩの抵抗を直列につないで、その両端に5Vの電圧をかけます。CdS光センサと抵抗で分圧した点を、Arduinoのアナログ入力へつなぎます。
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につなぎます。
ソースコード
光源が左右のどちらにあるか判定させるだけの、簡単なプログラムを書いてみました。
#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つあるのかどうかはわかりませんが。
ところで、ひとつだけのセンサでも、方角を判定できるのをご存知でしたでしょうか。
こちらの映像のように、センサ自身が首を振ることで可能です。レーダーや潜水艦のソナーと同じような発想ですね。
この映像の詳細はこちらの記事をご覧ください。