CodeZine(コードジン)

特集ページ一覧

Tessel 2に光センサーを接続してLEDを制御してみよう

Tessel 2ではじめるセンサー電子工作入門 第2回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2017/05/11 14:00
目次

光センサーを接続しよう

 では、実際に光センサーをTessel 2と接続してみましょう。

回路図

 CdSセルと20kΩの抵抗を直列に接続し、分圧した出力をアナログ入力に対応したGPIOの4番ピンに入力する回路図です。

Tessel 2とCdSセルの分圧回路
Tessel 2とCdSセルの分圧回路

 Tessel 2から出力される電圧は3.3Vなので、明るい室内であれば分圧は3.3 × 2k / (20k + 2k)= 0.3V程度となります。また、暗くなるにしたがってCdSセルの抵抗が大きくなるため、3.3Vに近づくことになります。

 Tessel 2の接続図は次のようになります。

CdSセルの接続図
CdSセルの接続図

アナログ入力を参照する

 次に、分圧を入力した4番ピンの値を表示するコードを書いてみましょう。最初にt2 initコマンドで、ひな形を作成しておきます。そして作成されたindex.jsを次のように書き換えます。

リスト1 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を点灯するようにしてみましょう。

 接続は次のようになります。

CdSセルとLEDの接続図
CdSセルとLEDの接続図

 200Ωの抵抗とLEDを直列に接続し、GNDとポートBの0番ピンに接続します。

リスト2 index2.js
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を点灯させます。

リスト3 index3.js
~略~

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)。

 このような一定時間だけ点灯するといった仕組みは、実は電子回路だけでも実現可能です。しかし、プログラムで作成したほうが点灯する時間などをかんたん、かつ正確に設定できます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Tessel 2ではじめるセンサー電子工作入門

著者プロフィール

  • WINGSプロジェクト 高江 賢(タカエ ケン)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5