SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

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を制御しました。次回は人間の所在を検知する人感センサーを接続します。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Tessel 2ではじめるセンサー電子工作入門連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10137 2017/05/11 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー