光センサーを接続しよう
では、実際に光センサーをTessel 2と接続してみましょう。
回路図
CdSセルと20kΩの抵抗を直列に接続し、分圧した出力をアナログ入力に対応したGPIOの4番ピンに入力する回路図です。
Tessel 2から出力される電圧は3.3Vなので、明るい室内であれば分圧は3.3 × 2k / (20k + 2k)= 0.3V程度となります。また、暗くなるにしたがってCdSセルの抵抗が大きくなるため、3.3Vに近づくことになります。
Tessel 2の接続図は次のようになります。
アナログ入力を参照する
次に、分圧を入力した4番ピンの値を表示するコードを書いてみましょう。最初にt2 initコマンドで、ひな形を作成しておきます。そして作成されたindex.jsを次のように書き換えます。
const tessel = require('tessel');
const pin = tessel.port.A.pin[4]; // ポートAの4番ピンのオブジェクト
setInterval(() => {
// アナログ値を読み取る(1)
pin.analogRead(function(error, value) {
console.log(value);
});
}, 1000);
このサンプルは1秒ごとに4番ピンの値をコンソールに出力するコードです。アナログ入力の値を取得するには、ピンのオブジェクトのanalogReadメソッドを用います(1)。
t2 runコマンドで実行し、CdSセルに手をかざすと次のような結果になります。
0.077392578125 0.317138671875 0.213134765625 0.365966796875 0.19921875 0.092041015625
先ほど書いた0.3Vより、かなり小さい値が含まれています。実は、Tessel 2のアナログ入力で参照できる値の範囲は0~1の間です。これは3.3Vを1とした割合になっています。つまり、実際の電圧を表示するには3.3をかける必要があります。value*3.3として実行すると、0.3程度の出力となります。
LEDを点灯する
前回のLEDを点灯する回路を追加して、暗くなったらLEDを点灯するようにしてみましょう。
接続は次のようになります。
200Ωの抵抗とLEDを直列に接続し、GNDとポートBの0番ピンに接続します。
index2.js
const tessel = require('tessel');
const pin = tessel.port.A.pin[4];
const pin0 = tessel.port.B.pin[0]; // ポートBの0番ピンのオブジェクト
pin0.output(0);
// 1秒ごとに暗さを判定(1)
setInterval(() => {
pin.analogRead(function(error, value) {
// 暗さの判定
// 0.2より大きくなればONにする(2)
pin0.output( (0.2 < value) ? 1 : 0 );
});
}, 1000);
1秒ごとに(1)アナログ入力値を取得し、その値が0.2より大きくなればポートBの0番ピンをONにしています(2)。暗くなってCdSセルの抵抗が大きくなり、分圧が一定よりも高くなると、ポートBの0番ピンに3.3Vが出力されてLEDが点灯する回路です。
なお、暗さを判定するしきい値をこのサンプルでは0.2としていますが、環境に合わせて調整する必要があります。
一定時間点灯させる
先ほどのサンプルは暗くなったらずっと点灯している常夜灯のようなタイプです。今度は、暗くなったら一定時間だけ点灯するようにしましょう。次のサンプルは、暗くなったら15秒間だけLEDを点灯させます。
~略~
var status = 0; // 前回の状態の保存用(1)
setInterval(() => {
pin.analogRead(function(error, value) {
var tmp = (0.2 < value) ? 1 : 0;
// 前回判定と異なるかどうか(2)
if (tmp != status) {
status = tmp;
if ( 0 < status ) led_on(); // 暗い場合はLEDを点灯する(3)
}
});
}, 1000);
var led_st = 0; // 点灯の状態の保存用
function led_on() {
if (led_st == 1) return; // すでに点灯中は何もしない(4)
led_st = 1; // 点灯中は1にする
pin0.output(1);
setTimeout(() => {
led_st = 0;
pin0.output(0);
}, 1000*15); // 15秒後にLEDを消す(5)
}
1秒ごとに暗さを判定する部分は先ほどと同じですが、今度は明暗の状態が変化したときのみ処理を行うため、前回の状態を保存しています(1)。前回と状態が変化して(2)暗い場合のみ、LEDを点灯させる処理(led_on)を呼び出しています(3)。
led_onでは15秒間だけピンをONにするため、setTimeoutメソッドを利用しています(5)。setTimeoutメソッドでは、設定した時間の経過後に1度だけ処理が実行されます。
なお、点灯中にled_onが呼び出されて、重複してsetTimeoutメソッドが設定されないように、すでに点灯中の場合は何もしないようにしています(4)。
このような一定時間だけ点灯するといった仕組みは、実は電子回路だけでも実現可能です。しかし、プログラムで作成したほうが点灯する時間などをかんたん、かつ正確に設定できます。
