フォトセルチュートリアル!

フォトセル、別名CdSセル、フォトレジスタ、LDR(光依存抵抗器)...

フォトセルとは何ですか?

フォトセルは、光を検出できるセンサーです。 それらは小さく、安価で、低電力で、使いやすく、摩耗しません。 そのため、玩具、ガジェット、家電製品によく登場します。 多くの場合、CdSセル(硫化カドミウム製)、光依存抵抗(LDR)、およびフォトレジスターと呼ばれます。

フォトセルは基本的に抵抗器であり、波打つ光がどれだけ光っているかに応じて抵抗値(オーム単位)が変化します。 それらは非常に低コストで、多くのサイズと仕様で簡単に入手できますが、非常に不正確です。 各フォトセルセンサーは、同じバッチからのものであっても、他とは少し異なる動作をします。 バリエーションは50%以上と非常に大きくなる可能性があります! このため、ルクスまたはミリカンデラの正確な光レベルを決定するために使用すべきではありません。 代わりに、基本的なライトの変更のみを決定できると期待できます。

「明るいか暗いか」、「センサーの前に何かがある(光を遮る)」、「レーザー光線を遮る何かがある」(ブレイクビームセンサー)、または「複数のセンサーのどれに最も光が当たるか」、フォトセルは良い選択です!

いくつかの基本的な統計

これらの統計は、PDV-P8001と非常によく似たAdafruitショップのフォトセルに関するものです。 ほとんどすべてのフォトセルの仕様はわずかに異なりますが、ほとんど同じように機能します。 データシートがある場合は、参照することをお勧めします

  • サイズ:円形、直径5mm(0.2 ")(他のフォトセルは直径11mm / 0.4"まで可能です!)
  • Adafruitショップで価格 $ 1.50
  • 抵抗範囲: 200Kオーム(暗い)から10Kオーム(10ルクスの輝度)
  • 感度範囲: CdS細胞は400nm(紫)から600nm(オレンジ)の波長の光に反応し、約520nm(緑)でピークに達します。
  • 電源: 100Vまでのほとんど何でも、平均で1mA未満の電流を使用します(電源電圧に依存)
  • データシートと別のデータシート
  • これらのグラフのほぼすべてが取得されるフォトセルの使用と選択に関する2つのアプリケーションノート

ステップ1:フォトセルを使用して光を測定する方法


前述したように、フォトセルの抵抗は、顔がより多くの光にさらされると変化します。 暗くなると、センサーは最大10Mオームの大きな抵抗器のように見えます。光のレベルが上がると、抵抗は下がります。 このグラフは、さまざまな光レベルでのセンサーの抵抗をほぼ示しています。 各フォトセルは少し異なるため、これはガイドとしてのみ使用してください。

(以下の抵抗対照明グラフを参照)
グラフは線形ではなく、対数グラフです!

フォトセル、特にあなたが見つけそうな一般的なCdSセルは、すべての光に敏感ではありません。 特に、700nm(赤)から500nm(緑)までの光に敏感です。

基本的に、青色光はセンサーをトリガーする際に緑色/黄色光​​ほど効果的ではありません!

一体何がルクスですか?

ほとんどのデータシートは、特定の光レベルでの抵抗を示すためにルクスを使用しています。 しかし、ルクスとは何ですか? これは、明るさを記述するために使用する傾向がある方法ではないため、測定するのは困難です。 このトピックに関するウィキペディアの記事から引用した表を次に示します。
(下の照明表を参照)

ステップ2:フォトセルのテストと接続


フォトセルをテストする

フォトセルの動作を判断する最も簡単な方法は、抵抗測定モードのマルチメーターを2本のリード線に接続し、手でセンサーを遮光したり、ライトをオフにしたりしたときに抵抗がどのように変化するかを確認することです。抵抗は大きく変化するため、ここではオートレンジメーターがうまく機能します。 そうでない場合は、「あきらめる」前に、1Mオームと1Kオームの間で異なる範囲を試してください。

フォトセルへの接続

フォトセルは基本的に抵抗であるため、非極性です。 つまり、「どちらの方法でも」それらを接続することができ、うまく機能します!

フォトセルは非常に丈夫で、はんだ付け、リード線のクリップ、ブレッドボードへの接続、ワニ口クリップの使用などが簡単にできます。あまりにも頻繁に曲げた場合。

ステップ3:プロジェクトの例



光のレベルに基づいて周波数を変更するノイズメーカー。


フォトレジスターとマイクロコントローラーによるモーター値と方向制御


フォトセルを使用して白/黒のストライプから跳ね返る光を検出するラインフォローイングロボット

別のロボット、これは2つのセンサーを持ち、光に向かって移動します(それらはBraitenberg車と呼ばれます)


フォトセルとポケットレーザーポインターを使用してブレークビームセンサーを作成する

ステップ4:アナログ電圧読み取り方法


抵抗センサーを測定する最も簡単な方法は、一方の端を電源に接続し、もう一方の端をプルダウン抵抗に接続してグランドに接続することです。 次に、固定プルダウン抵抗器と可変フォトセル抵抗器の間のポイントを、Arduinoなどのマイクロコントローラーのアナログ入力に接続します(図を参照)
(下の回路図を参照)

この例では、5V電源で示していますが、3.3V電源でも同じように簡単に使用できることに注意してください。 この構成では、アナログ電圧の読み取り範囲は0V(グランド)から約5V(または電源電圧とほぼ同じ)までです。

これが機能する方法は、フォトセルの抵抗が減少すると、フォトセルとプルダウン抵抗の合計抵抗が600Kオームから10Kオームに減少することです。 つまり、両方の抵抗を流れる電流が増加し、固定10Kオームの抵抗両端の電圧が増加します。 それはかなりのトリックです!

(下の最初の表を参照)
この表は、5V電源と10Kオームのプルダウン抵抗を備えたセンサーの光/抵抗に基づいたおおよそのアナログ電圧を示しています

明るい場所にセンサーを配置し、10Kオームのプルダウンを使用する場合、すぐに飽和します。 これは、5Vの「天井」にぶつかり、少し明るいものと本当に明るいものを区別できないことを意味します。 その場合、10Kオームプルダウンを1Kオームプルダウンに交換する必要があります。 その場合、暗いレベルの差も検出できませんが、明るい光の差をよりよく検出できます。 これはトレードオフであり、決定する必要があります!

(下の2番目の表を参照)
この表は、5V電源と1Kプルダウン抵抗を備えたセンサーの光/抵抗に基づいたおおよそのアナログ電圧を示しています

私たちの方法は、明るさに関して線形電圧を提供しないことに注意してください! また、各センサーは異なります。 光レベルが増加すると、抵抗が低下してもアナログ電圧が上昇します。

Vo = Vcc(R /(R +フォトセル))

つまり、電圧は光電池抵抗の逆数に比例し、光電池抵抗は光レベルに逆比例します

ステップ5:使用の簡単なデモンストレーション


このスケッチでは、アナログ電圧の読み取り値を取得し、それを使用して赤色LEDの明るさを判断します。 暗いほど、LEDは明るくなります! これを機能させるにはLEDをPWMピンに接続する必要があることに注意してください。この例ではピン11を使用しています。

これらの例は、基本的なArduinoプログラミングを知っていることを前提としています。 そうでない場合は、Arduinoチュートリアルで基本を復習するのに時間をかけるかもしれませんか?

/ *フォトセルの簡単なテストスケッチ。

フォトセルの一方の端を5Vに、もう一方の端をアナログ0に接続します。
次に、10K抵抗の一端をアナログ0からグランドに接続します
LEDをピン11から抵抗を介してグランドに接続します
詳細については、www.ladyada.net / learn / sensors / cds.htmlをご覧ください* /

int photocellPin = 0; //セルと10Kプルダウンはa0に接続されます
int photocellReading; //センサー分周器からのアナログ読み取り値
int LEDpin = 11; //赤色LEDをピン11(PWMピン)に接続します
int LEDbrightness; //
void setup(void){
//シリアルモニター経由でデバッグ情報を送信します
Serial.begin(9600);
}

void loop(void){
photocellReading = analogRead(photocellPin);

Serial.print( "Analog reading =");
Serial.println(photocellReading); //生のアナログ読み取り値

// LEDはセンサーで暗くなるほど明るくなります
//これは、0-1023から1023-0に読み取り値を反転する必要があることを意味します
photocellReading = 1023-photocellReading;
// analogWriteが使用する範囲であるため、0-1023を0-255にマッピングする必要があります
LEDbrightness = map(photocellReading、0、1023、0、255);
analogWrite(LEDpin、LEDbrightness);

delay(100);
}

検出したい光レベルの範囲に応じて、異なるプルダウン抵抗器を試してみてください!

ステップ6:アナログ光測定用の簡単なコード:


このコードは計算を行わず、定性的に光の量として解釈するものを出力します。 ほとんどのプロジェクトでは、これがほとんどすべてです;必要です!

/ *フォトセルの簡単なテストスケッチ。

フォトセルの一方の端を5Vに、もう一方の端をアナログ0に接続します。
次に、10K抵抗の一端をアナログ0からグランドに接続します

詳細については、www.ladyada.net / learn / sensors / cds.htmlをご覧ください* /

int photocellPin = 0; //セルと10Kプルダウンはa0に接続されます
int photocellReading; //アナログ抵抗分圧器からのアナログ読み取り値

void setup(void){
//シリアルモニター経由でデバッグ情報を送信します
Serial.begin(9600);
}

void loop(void){
photocellReading = analogRead(photocellPin);

Serial.print( "Analog reading =");
Serial.print(photocellReading); //生のアナログ読み取り値

//定性的に決定されたいくつかのしきい値があります
if(photocellReading <10){
Serial.println( "-Dark");
} else if(photocellReading <200){
Serial.println( "-Dim");
} else if(photocellReading <500){
Serial.println( "-Light");
} else if(photocellReading <800){
Serial.println( "-Bright");
} そうしないと {
Serial.println( "-非常に明るい");
}
delay(1000);
}

それをテストするために、私は日当たりの良い(しかし日陰の)部屋で始め、センサーを手で覆い、それから一枚の遮光布で覆いました。

ステップ7:ボーナス! アナログピンなしのフォトセルの読み取り


フォトセルは基本的に抵抗であるため、マイクロコントローラーにアナログピンがない場合でも(または、アナログ入力ピンよりも多く接続したい場合でも)使用できます。 これを行う方法は、抵抗とコンデンサの基本的な電子特性を利用することです。 最初は電圧を保存していないコンデンサを使用し、それを抵抗を介して電源(5Vなど)に接続すると、電源電圧までゆっくり充電されます。 抵抗が大きいほど遅くなります。

オシロスコープからのこのキャプチャは、デジタルピンで起こっていることを示しています(黄色)。 青い線は、約1.2ミリ秒後にスケッチがカウントを開始し、カウントが完了したことを示します。

これは、コンデンサがバケツのように機能し、抵抗器が細いパイプのようなものだからです。 バケツを非常に細いパイプで埋めるには十分な時間がかかり、バケツを半分まで埋めるのにかかる時間を計ることでパイプの幅を把握できます。

この場合、「バケット」は0.1uFセラミックコンデンサです。 コンデンサはほぼ任意の方法で変更できますが、タイミング値も変わります。 0.1uFは、これらのフォトセルを開始するのに適した場所のようです。 より明るい範囲を測定する場合は、1uFコンデンサを使用します。 より暗い範囲を測定する場合は、0.01uFまで下げます。

/ *フォトセルの簡単なテストスケッチ。
フォトセルの一端を電源に接続し、他端をピン2に接続します。
次に、ピン2からグランドに0.1uFコンデンサの一端を接続します
詳細については、www.ladyada.net / learn / sensors / cds.htmlをご覧ください* /

int photocellPin = 2; // LDRとキャップはpin2に接続されます
int photocellReading; //デジタル読み取り
int ledPin = 13; //「組み込み」LEDを使用できます

void setup(void){
//シリアルモニター経由でデバッグ情報を送信します
Serial.begin(9600);
pinMode(ledPin、OUTPUT); //出力用のLEDがあります
}

void loop(void){
// RCtimeテクニックを使用して抵抗を読み取ります
photocellReading = RCtime(photocellPin);

if(photocellReading == 30000){
// 30000を取得した場合、「タイムアウト」を意味します
Serial.println( "Nothing connected!");
} そうしないと {
Serial.print( "RCtime reading =");
Serial.println(photocellReading); //生のアナログ読み取り値

//明るいほど、速く点滅します!
digitalWrite(ledPin、HIGH);
delay(photocellReading);
digitalWrite(ledPin、LOW);
delay(photocellReading);
}
delay(100);
}

//デジタルピンを使用して抵抗を測定します(FSRやフォトセルなど!)
//これを行うには、抵抗器からコンデンサに電流を供給し、
// Vcc / 2に到達するまでにかかる時間をカウントします(ほとんどのArduinosでは、2.5Vです)
int RCtime(int RCpin){
int reading = 0; // 0から始まります

//ピンを出力に設定し、LOW(グランド)に引きます
pinMode(RCpin、OUTPUT);
digitalWrite(RCpin、LOW);

//ここで、ピンを入力に設定して...
pinMode(RCpin、INPUT);
while(digitalRead(RCpin)== LOW){// HIGHに達するまでにかかる時間をカウントする
reading ++; //時間を追跡するためにインクリメント

if(reading == 30000){
//ここまで来たら、抵抗はとても高い
//接続されていない可能性があります!
ブレーク; //ループを抜けます
}
}
// 30000で上限に達するか、できれば読み取り値を取得して、カウントを返します

読み返し;
}

関連記事