注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community(Facebook)へようこそ!Raspberry Pi、Arduino、ESP32の世界を仲間と一緒に深く掘り下げましょう。
参加する理由
専門サポート:コミュニティとチームの助けを借りて、販売後の問題や技術的な課題を解決します。
学びと共有:スキルを向上させるためのヒントやチュートリアルを交換しましょう。
限定プレビュー:新製品の発表やスニークピークをいち早く入手できます。
特別割引:最新の製品に対する限定割引を楽しめます。
フェスティブプロモーションとプレゼント:プレゼントやホリデープロモーションに参加できます。
👉 探索と創造の準備はできましたか?こちらをクリックして [ここ] 参加しましょう!
18. 光アラーム

映画のワンシーンを想像してみてください: 薄暗い博物館で、狡猾な泥棒が静かに貴重な絵画に近づきます。 彼は夜の闇に紛れて盗みを遂行しようとしています。 しかし、絵画に触れた瞬間、一連の高度なセンサーが作動し、 ギャラリー全体にアラームが鳴り響き、周囲が一気に明るくなります。 泥棒はすぐに現場の警備員に捕らえられ、絵画盗難を未然に防ぐことができました。 これは映画ではなく、現代のセキュリティシステムにおけるセンサー技術の実例です。
これはどのように達成されるのでしょうか?絵画のフレーム近くにフォトレジスタや高度な光センサーを配置します。絵画を動かしたり遮ったりすると、光の条件が変化し、アラームシステムが作動します。
では、フォトレジスタとブザーを使用して、光アラームシステムをシミュレートしてみましょう。
このレッスンで学ぶこと:
フォトレジスタの動作原理と特性を理解する。
簡単な光アラームシステムを構築する方法を学ぶ。
回路の構築
必要なコンポーネント
1 * Arduino Uno R3 |
1 * フォトレジスタ |
1 * 10KΩ抵抗 |
1 * アクティブブザー |
1 * USBケーブル |
1 * ブレッドボード |
ジャンパーワイヤー |
1 * マルチメーター |
ステップバイステップでの構築
フォトレジスタから始めましょう。

フォトレジスタ(またはフォトセル)は、光制御可変抵抗器です。フォトレジスタの抵抗は入射光の強度が増すと減少します。言い換えれば、光電導性を示します。
フォトレジスタは、光感知検出回路や光作動および暗作動スイッチング回路で抵抗性半導体として使用できます。暗闇では、フォトレジスタの抵抗は数メガオーム(MΩ)にも達し、光が当たると数百オームにまで低下することがあります。
このキットには、25°Cで10KΩの抵抗が含まれています。次に、マルチメーターを使用して、通常の光、明るい光、暗い条件下でのフォトレジスタの抵抗を測定します。
フォトレジスタの定格抵抗が10Kであるため、マルチメーターを20キロオーム(20K)範囲で抵抗を測定するように設定します。

フォトレジスタをブレッドボードの10Eと11Eの位置に挿入します。ピンには方向性がなく、自由に挿入できます。

次に、マルチメーターの赤と黒のテストリードでフォトレジスタの2つのピンに触れます。

現在の周囲光下での抵抗値を読み取り、以下の表に記録します。
環境 |
抵抗値(キロオーム) |
---|---|
通常の光 |
5.48 |
明るい光 |
|
暗闇 |
次に、友人に手伝ってもらい、懐中電灯や他の光源をフォトレジスタに直接当ててもらいます。抵抗値を記録し、数百オームになることがあります。そのため、マルチメーターを2Kまたは200オームに設定し、より正確な読み取りを行います。
注釈
表の抵抗単位はキロオームに設定しています。1キロオーム(kΩ)は1000オームです。
200オームの範囲を選び、164.5オームの読み取り値を得た場合、それを0.16キロオームに変換し(小数点以下2桁に丸めることを推奨)、変換した値を表に記入します。
環境 |
抵抗値(キロオーム) |
---|---|
通常の光 |
≈5.48 |
明るい光 |
≈0.16 |
暗闇 |
暗い条件では、フォトレジスタの抵抗が数メガオームに達することがあるため、マルチメーターを2メガオームの位置に設定します。

フォトレジスタを黒い物体で完全に覆い、測定した抵抗値を表に記録します。
注釈
表の抵抗単位はキロオームに設定しています。1メガオーム(MΩ)は1000キロオームです。
2メガオームの範囲を選び、1.954メガオームの読み取り値を得た場合、それを1954キロオームに変換し、この値を記入します。
読み取り値が直接2MΩを超える場合は「1」と表示され、この場合は2メガオームを直接入力するか、より正確なマルチメーターを使用して正確な値を測定することを検討してください。
環境 |
抵抗値(キロオーム) |
---|---|
通常の光 |
≈5.48 |
明るい光 |
≈0.16 |
暗闇 |
≈1954 |
これらの測定から、フォトレジスタの光電導特性を確認しました。光が強くなるほど抵抗が低くなり、光が弱くなるほど抵抗が高くなり、数メガオームに達することがわかります。
回路の構築を続けます。フォトレジスタの一方のピンをブレッドボードの負端子に、もう一方のピンをArduino Uno R3のA0ピンに接続します。

フォトレジスタの接続部分と同じ列に10KΩ抵抗を挿入します。

この回路では、10KΩ抵抗とフォトレジスタが直列に接続されており、これらを流れる電流は同じです。10KΩ抵抗は保護役割を果たし、A0ピンはフォトレジスタの電圧変換後の値を読み取ります。
光が強くなるとフォトレジスタの抵抗が減少し、その電圧も減少するため、A0ピンの値も減少します。光が十分に強ければフォトレジスタの抵抗はほぼ0になり、A0ピンの値もほぼ0になります。このとき、10KΩ抵抗が保護役割を果たし、5VとGNDが直接接続されて短絡するのを防ぎます。
フォトレジスタを暗い場所に置くと、A0ピンの値が増加します。十分に暗い場合、フォトレジスタの抵抗は無限大になり、その電圧は5Vに近づきます(10KΩ抵抗は無視できるほど小さくなります)。このとき、A0ピンの値は1023に近づきます。
10KΩ抵抗のもう一方のピンをArduino Uno R3の5Vピンに接続します。

前のレッスンと同様に、アクティブブザーをブレッドボードに挿入し、アノードをR3のピン9に、カソードをブレッドボードの負端子に接続します。

最後に、ジャンパーワイヤーを使ってブレッドボードの負端子をArduino Uno R3のGNDピンに接続します。

コード作成
Arduino IDEを開き、「ファイル」メニューから「新しいスケッチ」を選択して新しいプロジェクトを開始します。
スケッチを
Ctrl + S
を押すか「保存」をクリックしてLesson18_Light_Alarm
として保存します。void setup()
の前に、フォトレジスタとブザーの定数、およびフォトレジスタの読み取り値がこれを下回ったときにアラームを鳴らす閾値を設定します。
const int sensorPin = A0; // フォトレジスタ用の定数にピンA0を割り当て
const int buzzerPin = 9; // ブザー用の定数にピン9を割り当て
const int threshold = 300; // 閾値を設定
void setup() {
// 初期設定コードをここに記述します。一度だけ実行されます。
}
さらに、フォトレジスタから読み取った値を格納する変数を作成します。
const int sensorPin = A0; // フォトレジスタ用の定数にピンA0を割り当て
const int buzzerPin = 9; // ブザー用の定数にピン9を割り当て
const int threshold = 300; // 閾値を設定
int sensorValue = 0; // フォトレジスタの読み取り値を格納するための変数
void setup() {
// 初期設定コードをここに記述します。一度だけ実行されます。
}
void setup()
内で、ブザーを出力モードに設定し、フォトレジスタの読み取り値を監視するためにシリアル通信を開始します。
void setup() {
// 初期設定コードをここに記述します。一度だけ実行されます。
pinMode(buzzerPin, OUTPUT); // ブザーピンを出力モードに設定
Serial.begin(9600); // シリアル通信を9600ボーレートで初期化
}
void loop()``内で、 ``analogRead()
関数を使用してフォトレジスタから読み取り、その値をsensorValue
変数に格納します。次に、この値をシリアルモニタに表示します。各データ読み取りの間隔を設定することを忘れないでください。
void loop() {
// メインコードをここに記述します。繰り返し実行されます。
sensorValue = analogRead(sensorPin); // フォトレジスタからアナログ値を読み取る
Serial.println(sensorValue); // フォトレジスタの読み取り値をシリアルモニタに表示
delay(100); // 0.1秒待つ
}
環境が暗から明に変わると、フォトレジスタの抵抗が減少し、A0ピンの読み取り値も減少します。ここで
if
文を使用して、フォトレジスタの値がthreshold
を下回っているかどうかを確認します。下回っている場合はブザーをオンにし、そうでない場合はオフにします。
void loop() {
// メインコードをここに記述します。繰り返し実行されます。
sensorValue = analogRead(sensorPin); // フォトレジスタからアナログ値を読み取る
Serial.println(sensorValue); // フォトレジスタの読み取り値をシリアルモニタに表示
delay(100); // 0.1秒待つ
// 読み取り値が閾値を下回っているか確認
if (sensorValue < threshold) {
digitalWrite(buzzerPin, HIGH); // 閾値を下回っている場合、ブザーをオンにする
} else {
digitalWrite(buzzerPin, LOW); // 閾値を下回っていない場合、ブザーをオフにする
}
}
これが完全なコードです。これで「アップロード」をクリックしてコードをArduino Uno R3にアップロードできます。
const int sensorPin = A0; // フォトレジスタ用の定数にピンA0を割り当て
const int buzzerPin = 9; // ブザー用の定数にピン9を割り当て
const int threshold = 300; // 閾値を設定
int sensorValue = 0; // フォトレジスタの読み取り値を格納するための変数
void setup() {
// 初期設定コードをここに記述します。一度だけ実行されます。
pinMode(buzzerPin, OUTPUT); // ブザーピンを出力モードに設定
Serial.begin(9600); // シリアル通信を9600ボーレートで初期化
}
void loop() {
// メインコードをここに記述します。繰り返し実行されます。
sensorValue = analogRead(sensorPin); // フォトレジスタからアナログ値を読み取る
Serial.println(sensorValue); // フォトレジスタの読み取り値をシリアルモニタに表示
delay(100); // 0.1秒待つ
// 読み取り値が閾値を下回っているか確認
if (sensorValue < threshold) {
digitalWrite(buzzerPin, HIGH); // 閾値を下回っている場合、ブザーをオンにする
} else {
digitalWrite(buzzerPin, LOW); // 閾値を下回っていない場合、ブザーをオフにする
}
}
最後に、コードを保存し、作業スペースを整理することを忘れないでください。
質問
狡猾な泥棒は夜間に盗みを働くことを選ぶかもしれません。絵画が消えた場合、フォトレジスタは光の変化を検出できず、アラームが作動しない可能性があります。この欠陥を改善するにはどうすればよいでしょうか?