Arduino+CdS

CdSセルとは

CdS=硫化カドミウムは当たる光の量に従って抵抗値が変化する。CdSセルはこのCdSの性質を利用した抵抗器である。セルに当たる光の強さに応じて抵抗値が低くなるため、光センサーとして利用される。

Back To Top

CdSの実装

前回の講義ノート「Arduino+Switch」から続けて以下の部品を追加実装する。

 

使用部品

・CdSセル5mmタイプ 1個

 

回路図

 

実装図

前の演習「Arduino+Switch」のタクトスイッチとCdSを差し替える。CdSセルは極性なし。

Back To Top

明るさを感知してLEDを光らせる

①スケッチの準備

空のスケッチを作成して、以下のコードをコピー&ペースト後、スケッチを保存する。

//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行目の数値を大きくする。

Back To Top

CdSの電圧変化をProcessingで視覚化

CdSのアナログ値をシリアル通信を使ってProcessingに送信してグラフとして視覚化する。
ArduinoとProcessingのプログラムを同時に利用するので注意。

 

①Arduinoスケッチの準備

空のスケッチを作成して、以下のコードをコピー&ペースト後、スケッチを保存する。

// 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スケッチの書き込み

コンパイル、書き込みを行う。Arduinoにプログラムを書き込んだ時点ではシリアル通信がスタートしない。Processingを起動してはじめてシリアル通信がスタートする。

 

③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(); //シリアル通信受信
}

 

④ProcessingスケッチのRun

CdS上で手をかざすと、明暗によって電圧値が変化することがわかる。
閾値を設定することでON/OFFのプログラムを作成できる。

環境により15行目のシリアルデバイスナンバー([]内の数字)を変更する必要がある。シリアルデバイスナンバーは下図のようにProcessingのコンソールウィンドウ上で確認できる。/dev/tty.usbmodem****の表記のものがArduino。

Back To Top

レイヨ=グラフィー

森脇裕之氏の「レイヨ=グラフィー」(下図)は、光センサーとLEDの回路を多数配置したメディアアート作品。光センサーが感知して影の部分が光る。影という人の痕跡を光の像として表出させた作品。(作者インタビュー

CdSとLEDの回路はトランジスタを利用してシンプルに作ることができる(下図)。「レイヨ=グラフィー」ではこのような回路が利用されている。防犯ライトも同じ仕組み。防犯ライトの場合は焦電センサで人の動きも感知している。

Back To Top