部屋を暗くすると何も見えなくなって少し不便だなあ。。。お化け出るし。
部屋の明るさを感知して、自動で手元を光らせることができたらいいのになあ。。。お化け出ないし。
と思うときはありませんか。
今日は明るさを感知して、自動でLEDを光らせる電子工作をやってみましょう!
作るもの
センサが暗くなったことを検知したら、LEDを光らせます!
電圧・電流・抵抗の振り返り
microbit Lチカ(電子工作)でもやりましたが、いちどふりかえってみましょう。
電圧と電流、抵抗は下の式で表すことができます。
オームの法則
電圧 = 電流 × 抵抗
これを何の法則というか覚えてますか?オームの法則ですよ。中学2年で習うはずです。
ただ、あなたが小学5年生以上だったら心配いりません!
距離 = 速さ × 時間と同じような使い方です(意味は全然違うけど)。
microbitは3V(ボルト)の電圧を出します。これは決まりです。
また、LEDを光らせるには10mA(ミリアンペア)の電流が必要です。
1ミリアンペアは0.001アンペアなので、10ミリアンペアは0.001 × 10 = 0.01 Aとなりますね。
これをオームの法則の式に入れてやります。
電圧 = 電流 × 抵抗
3 = 0.01 × 抵抗
ですね。つまり、この式を変形して、
抵抗 = 3 / 0.01
ですから、300Ω(オーム)ですね。
もう一度振り返りますが、
microbitは3Vを出すので、LEDに10mAを流したい場合はオームの法則から300Ωだと計算できた。
ということです。
だから、いつもLEDを光らせるときには220Ωの抵抗をLEDと一緒につなげています。
(本当は300Ωちょうどがあればよいのですが、それがないので300Ωに近い220Ωを使ってます)
練習問題
この問題を解いてみてください!
フォトレジスタ
さて、なぜ最初にオームの法則を復習したかというと、この新しい部品のためです。
これはフォトレジスタと言われる抵抗です。フォト=photo=光、レジスタ=resistor=抵抗。
今までの抵抗は大きさが一定でしたが、フォトレジスタは周囲の明るさによって抵抗の大きさが変わる特殊な部品です。
周囲が明るいと抵抗値は小さくなり、周囲が暗いと抵抗値は大きくなります。
配線
下図のように接続しましょう。
LEDにつなぐ抵抗は220Ω、フォトレジスタにつなぐ抵抗は10kΩにします。
動作イメージ(フォトレジスタ部)
以下のように流れることを確認しましょう。
3V -> ジャンパ線(赤) -> 10kΩ抵抗 -> フォトレジスタ -> ジャンパ線(黒) -> GND
10kΩ抵抗とフォトレジスタの間にあるジャンパ線(緑)がピンP.2に入ってますね。
このジャンパ線(緑)はフォトレジスタの抵抗値を監視するためです。
フォトレジスタの周囲の明るさによって抵抗が常に変わるアナログ値なので、それを見ています。
くりかえしになりますが、明るいほど抵抗値は小さくなりますよ!
10kΩはなぜ必要なのでしょう?これはフォトレジスタの特性を考えると分かります。
フォトレジスタの抵抗値は、周囲が明るくなるほど0Ωに近づきます。
もし10kΩが無かったら、ものすごく明るいときにフォトレジスタが0Ωになり、3VとGNDがショートしてmicrobitが壊れます。
これを防ぐために必要となるのが10kΩ抵抗です。フォトレジスタが0Ωになっても10kΩがショートを防いでくれます!
アナログ値の変化によって、LEDにつながるピンP.4をONにしたり、OFFにしたりします。
プログラム
フォトレジスタの抵抗を監視するP.2部分を作っていきましょう。
まずは”レジスタ”という変数を作って、フォトレジスタの抵抗値を入れてやります。
フォトレジスタの抵抗値はアナログ値を読み取る、でP2を指定してやればよいですよ。
※入出力端子 -> アナログ値を読み取る
ずっと
変数 レジスタ を アナログ値を読み取る 端子P2 にする
これでフォトレジスタの抵抗をmicrobitで読み取って、変数”レジスタ”に格納できました!
つづいて、変数”レジスタ”の大きさによって、LEDをON/OFF制御できるようにします。
ずっと
変数 レジスタ を アナログ値を読み取る 端子P2 にする
もし レジスタ > 800 なら
デジタルで出力する 端子 P4 値 1
そうでなければ
デジタルで出力する 端子 P4 値 0
もしレジスタが800より大きかったら、P4を1(=ON)にして、LEDが光ります。
そうでなかったらP4を0(=OFF)にして、LEDが消灯します。
ためしにフォトレジスタを手でおおって、暗くしてみてください。LEDは光りましたか?
シリアル通信
さっきのコードでは、レジスタが800より大きかったら、という分岐条件でしたが、実は800はテキトーです。
実際いくらかになるか、周りの環境によって人それぞれ違います。
どれくらいの値になるか見てみましょう!シリアル通信という新機能を使います!
※ シリアル通信 -> シリアル通信 1行書きだす “”
シリアル通信は、変数の中身がどうなっているか、パソコン上で確認することができる機能です!
1行書きだす処理をアナログ値を読み取った後に追加します。
ずっと
変数 レジスタ を アナログ値を読み取る 端子P2 にする
シリアル通信 1行書きだす レジスタ
もし レジスタ > 800 なら
デジタルで出力する 端子 P4 値 1
そうでなければ
デジタルで出力する 端子 P4 値 0
これで一度実行してみてください。
画面上のmicrobitの下に、データを表示 デバイス が新たに表示されたらクリックします。
すると、変数レジスタの中身がどうなっているか見ることができます!
上の図だとレジスタは400くらいです。
この状態から暗くするとレジスタがどう変化しますか?
たとえば600になったとしたら、レジスタが600より大きくなったらLEDを光らせるようにすればよいでしょう。
応用
①明/暗をmicrobitに保存させて、どこでも使えるようにする
シリアル通信でしきい値を決めましたが、時間や場所が変わると明るさが変わるので、しきい値も変わってきます。
そこで、明/暗の値をそれぞれmicrobitに保存させて、しきい値を自動計算して動作させてみます。
これができるとどういう場所でも使えるプログラムに早変わりしますよ!
②周囲の明るさに連動してLEDの明るさを変える
ON/OFFではなくて、周りの明るさに連動した光り方をするようにプログラムを改良してみましょう!
コメント