CdSセルとは
CdS=硫化カドミウムは当たる光の量に従って抵抗値が変化する。CdSセルはこのCdSの性質を利用した抵抗器である。セルに当たる光の強さに応じて抵抗値が低くなるため、光センサーとして利用される。
CdS=硫化カドミウムは当たる光の量に従って抵抗値が変化する。CdSセルはこのCdSの性質を利用した抵抗器である。セルに当たる光の強さに応じて抵抗値が低くなるため、光センサーとして利用される。
前回の講義ノート「Arduino+Switch」から続けて以下の部品を追加実装する。
・CdSセル5mmタイプ 1個
前の演習「Arduino+Switch」のタクトスイッチとCdSを差し替える。CdSセルは極性なし。
空のスケッチを作成して、以下のコードをコピー&ペースト後、スケッチを保存する。
//CdSによるLED制御 2017.12 nakayasu
const int analogInPin = 5; //CdSを接続するアナログ入力ピン
int sensorValue = 0;
void setup()
{
pinMode(3, OUTPUT); //D3を出力モード
}
void loop()
{
sensorValue = analogRead(analogInPin); //10bit入力 0〜1023
if(sensorValue>600) { //0〜1023で数値が大きいほどセンサー感度が上がる(明るさの感度が下がる)
digitalWrite(3, LOW); //LED消灯
} else {
digitalWrite(3, HIGH); //LED点灯
}
}
スケッチデータのダウンロード
コンパイル、書き込みを行う。
CdS上を手をかざして暗くするとLEDが光る。
室内が明るい場合はCdSを囲うように暗くしなければ反応しない。
感度を上げるにはスケッチ15行目の数値を大きくする。
CdSのアナログ値をシリアル通信を使ってProcessingに送信してグラフとして視覚化する。
ArduinoとProcessingのプログラムを同時に利用するので注意。
空のスケッチを作成して、以下のコードをコピー&ペースト後、スケッチを保存する。
// CdSの電圧変化をProcessingで視覚化(Arduino側)
// 2017.12 nakayasu
const int analogInPin = 5; // CdSを接続するアナログ入力ピン
const int ledPin = 3; // LEDを接続するピン
int sensorValue; // センサー値用
int outputValue; // 送信データ用
void setup()
{
Serial.begin(9600);
pinMode(3, OUTPUT);
}
void loop()
{
sensorValue = analogRead(analogInPin); // 10bit入力 0〜1023
if(sensorValue > 512) digitalWrite(ledPin, LOW); else digitalWrite(ledPin, HIGH); // 閾値でLEDのON/OFF
outputValue = map(sensorValue, 0, 1023, 0, 255); // シリアル通信用に10bitから8bit(0〜255)変換
Serial.write(outputValue); // センサー値をシリアル送信
}
スケッチデータのダウンロード
コンパイル、書き込みを行う。Arduinoにプログラムを書き込んだ時点ではシリアル通信がスタートしない。Processingを起動してはじめてシリアル通信がスタートする。
空のスケッチを作成して、以下のコードをコピー&ペースト後、スケッチを保存する。
// CdSの電圧変化をProcessingで視覚化(Processing側)
// 2017.12 nakayasu
import processing.serial.*; // シリアルライブラリの読み込み
Serial myPort; //シリアルポート
int[] cdsData; // グラフ用配列
int RxData; // 受信データ用変数
void setup()
{
size(600, 255);
cdsData = new int[width]; // ウィンドウ幅の配列初期化
printArray(Serial.list()); // コンソールにシリアルデバイスの表示
String portName = Serial.list()[3]; // シリアルデバイスナンバー
myPort = new Serial(this, portName, 9600);
}
void draw()
{
background(0); // 背景の更新
stroke(60); // 中心線の色
line(0, 127, width, 127); // 中心線の描画
fill(255, 255, 0); //文字の色
text("CdS Voltage(0-255): " + RxData, 10, 20); // 文字の描画
stroke(255, 255, 0); // 点の色
for(int i=1; i < width; i++) cdsData[i-1] = cdsData[i]; // 配列をずらしていく
cdsData[width-1] = RxData; // 配列の最後に受信データを代入
for(int i=1; i < width; i++) point(i, -1*cdsData[i]+255); // 配列(グラフ)の描画
}
void serialEvent(Serial myPort) {
RxData = myPort.read(); //シリアル通信受信
}
スケッチデータのダウンロード
CdS上で手をかざすと、明暗によって電圧値が変化することがわかる。
閾値を設定することでON/OFFのプログラムを作成できる。
環境により15行目のシリアルデバイスナンバー([]内の数字)を変更する必要がある。シリアルデバイスナンバーは下図のようにProcessingのコンソールウィンドウ上で確認できる。/dev/tty.usbmodem****の表記のものがArduino。
森脇裕之氏の「レイヨ=グラフィー」(下図)は、光センサーとLEDの回路を多数配置したメディアアート作品。光センサーが感知して影の部分が光る。影という人の痕跡を光の像として表出させた作品。(作者インタビュー)
CdSとLEDの回路はトランジスタを利用してシンプルに作ることができる(下図)。「レイヨ=グラフィー」ではこのような回路が利用されている。防犯ライトも同じ仕組み。防犯ライトの場合は焦電センサで人の動きも感知している。