CodeZine(コードジン)

特集ページ一覧

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

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

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

LEDを制御してみよう

 これまでの回路ではLEDの明るさが一定でした。同じ明るさだと暗闇でまぶしすぎる場合や、反対に明るい状況では暗すぎることがあります。このLEDの明るさを、周囲の環境に合わせて制御するようにしてみましょう。

PWM

 LEDの明るさを調整する方法はいくつかあります。LEDは流す電流量によって明るさが変わるので、電流を変更するのも1つの手段です。ただしその場合はLEDの色も多少変化してしまいます。

 そこで、Tessel 2のPWM(Pulse Width Modulation)機能を利用します。PWMとは加える電圧は一定にして、ONにする時間を変化させることで制御する方法です。

 Tessel 2における、通常のGPIOの出力は常に出力した状態のままですが、PWMに対応したピンでは一定の時間間隔(PWM周期)でONになる割合(デューティ比)を変更することができます。このONの割合を変更することで、LEDの明るさを制御することができます。

 次の図は実際のTessel 2のPWM信号をモニターしたものです。

PWM信号
PWM信号

 山になっている高さが電圧で、横軸が時間を表します。上の黄色い線はONの状態が80%で、下の緑の線では50%になっています。この場合、80%ONになっているほうがLEDは明るく見えます。

接続

 回路の変更はLEDに接続するピンを変更するだけです。ポートBの0番ピンから、PWMに対応したポートBの5番ピンに変更します。

CdSセルとLEDの接続図(PWM接続)
CdSセルとLEDの接続図(PWM接続)

PWMの設定

 Tessel 2ではPWMの設定もかんたんに行うことができます。次のように、PWM周期を設定するpwmFrequencyメソッドと、デューティ比を設定するpwmDutyCycleメソッドが用意されています。

 PWM対応のピンは、ポートA/Bの5番/6番ピンです。Tessel 2のライブラリでは、port.A.pwm/port.B.pwmのオブジェクトになっています。

const pwm = tessel.port.B.pwm[0]; // ポートBの5番ピン
tessel.pwmFrequency(1000);        // PWMの時間間隔の設定
pwm.pwmDutyCycle(0.8);            // デューティ比の設定

 pwmFrequencyメソッドの引数は1~5000まで設定できます。また、PWM周期は1/引数秒となります。つまりこの引数は1秒あたりのPWM周期で、言い換えるとPWM周波数(単位はHz、ヘルツ)の指定です。この例では1000Hzなので、1/1000秒のPWM周期でONになる割合を設定することになります。

 pwmDutyCycleメソッドはONになる割合を0~1で指定します。0.8なら、1/1000秒の間で80%だけONになります。

 なお、pwmFrequencyメソッドはPWM対応ピン共通の設定で、デューティ比はピンごとに設定可能です。

サンプルコード

 では、周りの明るさに応じてLEDの明るさが変更するようにコードを書き換えてみましょう。

リスト4 index4.js
~略~

const pwd = tessel.port.B.pwm[0]; // PWD対応ピンオブジェクト

tessel.pwmFrequency(1000);        // 1kHzに設定(1)

setInterval(() => {
    pin.analogRead(function(error, value) {
        var duty = 1 - value*2;           // アナログ値からデューティ比を設定する(2)
        duty = (duty <= 0 )? 0.01 : duty; // 0以下なら、0.01にする(3)
        pwd.pwmDutyCycle(duty);
    });
}, 10);                                   // 10ミリ秒ごと

 コード自体はシンプルです。pwmFrequencyで1kHzに設定した後、アナログ値からデューティ比を設定しています(2)。デューティ比は少々乱暴な決め方ですが、1からアナログ値を2倍した値をマイナスしています。ただし、負の値は設定できないので、もし求めた値が0以下になった場合は0.01にしています(3)。これでデューティ比は0.01~0.9程になります。

 サンプルコードを実行すると次の動画のように動作します。CdSセルを覆って暗くするとLEDの明るさも変化しています。

最後に

 今回はTessel 2に光センサーを接続してLEDを制御しました。次回は人間の所在を検知する人感センサーを接続します。

参考資料



  • 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