2. LED のフェーディング¶
LED をオン/オフすることに加えて、 パルス幅変調(PWM) を使って LED の輝度を制御することもできます。パルス幅変調はデジタルピンから可変出力を得るための一般的な技術です。これにより LED のフェーディングを実現できます:
2.2. 配線¶
このチュートリアルでは X1
ピンを使います。抵抗の一端を X1
に、もう一端を LEDの長い方 アノード に接続します。LED のカソードはグランドに接続します。
2.3. コード¶
pyboard 用クイックリファレンス を調べると、 X1
がタイマー5のチャンネル1 (TIM5 CH1
) に接続されていることがわかります。したがって、最初にタイマー5の Timer
オブジェクトを作成してから、チャネル1の TimerChannel
オブジェクトを作成します:
from pyb import Timer
from time import sleep
# タイマー5を 100Hz の周波数で作成
tim = pyb.Timer(5, freq=100)
tchannel = tim.channel(1, Timer.PWM, pin=pyb.Pin.board.X1, pulse_width=0)
PWM による LED の輝度は、パルス幅、すなわち LED が各サイクルにかかる時間の量を制御することによって制御されます。100Hz のタイマー周波数では、各サイクルに0.01秒(つまり10ミリ秒)かかります。
このチュートリアルの冒頭に示したフェーディング効果を得るには、パルス幅を小さな値に設定してから徐々にパルス幅を広げてLEDを明るくし、最大輝度に達すると再び開始するようにします。
# 最大と最小のパルス幅:それぞれ最大と最小の輝度に相当
max_width = 200000
min_width = 20000
# 各ステップで上げていくパルス幅の大きさ
wstep = 1500
cur_width = min_width
while True:
tchannel.pulse_width(cur_width)
# パルスは幅を変更する頻度を決めます。これは
# 動画のフレームレートに似ています
sleep(0.01)
cur_width += wstep
if cur_width > max_width:
cur_width = min_width
2.4. 呼吸効果¶
呼吸効果、すなわち LED が暗い状態から明るい状態に変化し、明るい状態から暗い状態にフェードするようにしたい場合、最大輝度に達っしたら wstep
の符号を反転し、最小輝度で再度反転する必要があるだけです。これを行うには while
ループを次のように変更します:
while True:
tchannel.pulse_width(cur_width)
sleep(0.01)
cur_width += wstep
if cur_width > max_width:
cur_width = max_width
wstep *= -1
elif cur_width < min_width:
cur_width = min_width
wstep *= -1
2.5. 上級問題¶
LED の輝度が暗くなるときはゆっくり、明るくなるときは早く見えるかもしれません。これは、私たちの目が輝度を対数的に解釈するため(ウェーバーの法則 )、LED の輝度は毎回同じ量だけ直線的に変化していても、そのように感じてしまいます。この問題をどうやって解決しますか? (ヒント:対数関数の逆は何ですか?)
2.6. 追録¶
同じ効果を達成するためにデジタル/アナログコンバータ(DAC)を使用することもできました。PWM 方式には、時間の長さを変えるだけで毎度同じ電流で LED を駆動するという利点があります。LED では駆動電流と輝度との間に必ずしも線形関係を示すわけではないので、輝度をより良好に制御することを可能にします。