光センサを使ったロボットを作ろう|部屋が暗いと自動でライトがつく
みなさんは部屋が暗いときどうしますか?
自分でスイッチを入れて電気をつける人がほとんどでしょう。
ロボットが勝手に電気をつけてくれたらちょっと面白いと思いませんか?
部屋の天井についている電気をつけることはできないのですが、ロボットに取り付けたLEDライトなら可能です!
部屋の明るさ・暗さを判断できる光センサとLEDライトを用いて、光に反応するロボットを作ってみましょう!
- 光センサの種類
- CdSセル、フォトトランジスタ
- ・光センサの使い方
- ・光に反応するロボットの作り方
私のブログで登場するロボットはArduinoを搭載した車輪ロボット「NR-02」です。
下記記事のArduinoを始めるならこれを買えばOKの見出しで必要なパーツを紹介しています。
解説動画
今回の記事はこちらの動画をまとめたものです。
光センサを使うことでできるようになること
部屋が暗くなると勝手にLEDライトがついた!という仕掛けを作ることができます。
ライトをつけるのにスイッチを押して、ON/OFFをするのが一般的です。
しかし今回の光センサは、部屋の明るさ・暗さを感知してライトをつけることができるのです!
我が家の時計にも使われていました!
1時間ごとに音が鳴り、夜になってみんなが寝たら(部屋が暗くなったら)鳴らない時計があります。
光センサで部屋の暗さを感知して、音を鳴らすか鳴らさないか判断していたのです!
光センサの種類
光センサの種類としてCdSセルとフォトトランジスタを紹介します。
CdSセル(光導電セル)
CdSとは硫化カドミウムのことです。
光が当たると抵抗値が小さくなります。
つまり光の量によって抵抗値が変化する光センサです。
硫化カドミウムは有毒性のため、国によっては禁止されています。
フォトトランジスタ
フォトダイオードとトランジスタを合わせたものです。
フォトダイオード:光が当たると流れる電流の量が増える
トランジスタ:変化量を増幅させる
フォトダイオードだけでは変化量が小さいのでトランジスタで増幅させたのが、フォトトランジスタです。
つまりフォトトランジスタは光の量によって電流値が変化する光センサです。
CdSセルの使い方
Arduinoを使ってanalogReadの値を読む場合のCdSセルの使い方です。
上図のように、5V、CdSセル、10kΩ抵抗、グランドを順に繋ぎます。
この10kΩにかかる電圧をArduinoに取り込むので、10kΩの上位側(グランドと反対側)をA0に繋ぎましょう!
回路図では難しい…と言う方のために、配線図も用意しました。
難しい人は配線図通りに配線してみてくださいね!
この回路は一例であって、別の形でもCdSセルを使って光の量を判断することができます。
電気が得意な人は他の回路も自作してみてください!
CdSセルを使った場合のanalogReadの値
この配線図だとanalogReadの値、つまり10kΩにかかる電圧はどのように変化するでしょう。
CdSセルは光が当たると抵抗値が小さくなります。
抵抗が小さいということは、電流値が大きいということです。
そのため10kΩに流れる電流も大きくなります。
明るい場合 | 暗い場合 | ||
---|---|---|---|
光の量 | 多い | ← | 少ない |
CdSセルの抵抗値 | 小さい | → | 大きい |
CdSセルの電流値 | 大きい | ← | 小さい |
直列に繋がれた 10kΩ抵抗の電流値 | 大きい | ← | 小さい |
10kΩの電圧値 (電圧=抵抗×電流) | 大きい | ← | 小さい |
つまり、明るい場合はanalogReadの値が大きくなり、暗い場合はanalogReadの値が小さくなります。
「実際に入ってくる値はどんな値?」
そう思った方もいるでしょう。
シリアルプロッタで読み取ることで実際の値を確認することができます。
測距センサの記事にてシリアルプロッタの使い方を解説しています。
フォトトランジスタの使い方
Arduinoを使ってanalogReadの値を読む場合のフォトトランジスタの使い方です。
CdSセルをフォトトランジスタに変えただけです。
ただし!
フォトトランジスタには向きがあります!
足が短い方、つまりパーツが丸い部分でなく直線部分の方(上の写真だと右側)をグランド側にしてください!
フォトトランジスタを使った場合のanalogReadの値
この回路図だとanalogReadの値はどのように変化するでしょう。
フォトトランジスタは光の量が多いと電流値も大きくなります。
よって10kΩに流れる電流値も大きくなり、10kΩの電圧値も大きくなります。
明るい場合 | 暗い場合 | ||
---|---|---|---|
光の量 | 多い | ← | 少ない |
フォトトランジスタの電流値 | 大きい | → | 小さい |
直列に繋がれた 10kΩ抵抗の電流値 | 大きい | ← | 小さい |
10kΩの電圧値 (電圧=抵抗×電流) | 大きい | ← | 小さい |
つまり、明るい場合はanalogReadの値が大きくなり、暗い場合はanalogReadの値が小さくなります。
analogReadの値はCdSセルとフォトトランジスタとで違うので、ぜひシリアルプロッタで確認してみてください!
光に反応するロボットを作る
暗くなるとライトが光るロボットを作ってみましょう。
今回は青色LEDを使用します。
フォトトランジスタをブレッドボードに、青色LEDをロボットの先端に取り付けました。
青色LEDを含む全体の回路図は下記のとおりです。
青色LEDからブレッドボードの間はシールドクリップで繋ぎました。
ブレッドボードには挿せないので、ブレッドボードに挿す部分は導線を準備してください。
ロボットが動きまわる場合は、シールドクリップで配線するのも良いです。
はんだ付けするよりは外れやすいので、ロボットが動きまわる場合ははんだ付けしたほうが良いでしょう。
はんだ付けは4点のコツを掴むと簡単ですよ♪
ソースコード
ソースコードは以下の通りです。
1const int PIN_LIGHT = 11; //LEDライトのピン番号
2
3void setup() {
4 pinMode(PIN_LIGHT, OUTPUT); //LEDのピンを出力に設定
5}
6
7void loop() {
8 int sensor_value; //光センサの値
9
10 sensor_value = analogRead(A0); //光センサの値を取得する
11 if (sensor_value < 25) {
12 //光センサの値が25より小さい場合
13 digitalWrite(PIN_LIGHT, HIGH);
14 } else {
15 digitalWrite(PIN_LIGHT, LOW);
16 }
17}
プログラムのポイント
プログラムのポイントを解説します。
フォトトランジスタで部屋の暗さを感知して、青色LEDを光らせるプログラム
- analogRead→光センサの値を取り込む
- if→取り込んだ値によってライトをつけるか消すかを判断
- digitalWrite→ライトをON/OFFさせる
analogRead
光センサの値を入れる変数を作ります。
今回はsensor_valueとしました。
sensor_value = analogRead(A0);
A0から取り込んだ値(今回は10kΩ抵抗にかかる電圧)を、sensor_valueの中に入れることができます。
if
もし部屋が暗い(光センサの値が小さい)ならばLEDを点灯させるというプログラムなのでif文を使います。
光センサの値が25より小さい場合としていますが、この25という数字は使うセンサや動作環境によって変化します。
シリアルプロッタで読み取ってベストな数字を入れてみてください。
digitalWrite
LEDライトのON/OFFをさせます。
digitalWrite(PIN_LIGHT HIGH);
digitalWrite(PIN_LIGHT LOW);
HIGHがON、LOWがOFFの意味です。
このON/OFFさせる出力プログラムをif文の中に組み込みましょう。
光センサを使ったロボットの動作確認
プログラムまで完成したら動作確認をしてみましょう。
(↓動作確認部分から再生されます。)
青色LEDかっこいい!
まとめ
今回の記事では、光センサについて解説しました。
- 光センサの種類
- CdSセル、フォトトランジスタ
- 光センサの使い方
- 光に反応するロボットの作り方
光センサを使ったロボットが完成したら、CHAに(@CHAfreeschool )見せてくださいね!
私は青色のLEDを使いましたが、これから作ってみようって方は他の色も試してみてください。
さらにレベルアップしたい方は、前回紹介したスピーカーと組み合わせて部屋が暗くなったら鳴くロボットなんてのも面白いと思います!
LEDについてもう少しおさらいしたい方はこちらの記事がぴったりです。
間違えやすい向きについても分かりやすく解説しています。
ものづくりって面白い!
最後まで読んでいただき、ありがとうございました!
以上、CHAでした!