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信号をモニターしたものです。
山になっている高さが電圧で、横軸が時間を表します。上の黄色い線はONの状態が80%で、下の緑の線では50%になっています。この場合、80%ONになっているほうがLEDは明るく見えます。
接続
回路の変更はLEDに接続するピンを変更するだけです。ポートBの0番ピンから、PWMに対応したポートBの5番ピンに変更します。
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の明るさが変更するようにコードを書き換えてみましょう。
~略~
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を制御しました。次回は人間の所在を検知する人感センサーを接続します。
