このドキュメンテーションは、MicroPython の最新開発ブランチのためのものです。 リリースバージョンでは利用できない機能に言及することがあります。

特定のリリースのドキュメントをお探しの場合は、左側のドロップダウンメニューを使って、 望みのバージョンを選択します。

2. LED のフェーディング

LED をオン/オフすることに加えて、 パルス幅変調(PWM) を使って LED の輝度を制御することもできます。パルス幅変調はデジタルピンから可変出力を得るための一般的な技術です。これにより LED のフェーディングを実現できます:

http://upload.wikimedia.org/wikipedia/commons/a/a9/Fade.gif

2.1. 部品

次のものを用意してください。

  • 標準的な 5mm または 3mm の LED

  • 100Ωの抵抗

  • 配線のためのワイヤー

  • ブレッドボード (オプションですが、作業が楽になります)

2.2. 配線

このチュートリアルでは X1 ピンを使います。抵抗の一端を X1 に、もう一端を LEDの長い方 アノード に接続します。LED のカソードはグランドに接続します。

../../_images/fading_leds_breadboard_fritzing.png

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 では駆動電流と輝度との間に必ずしも線形関係を示すわけではないので、輝度をより良好に制御することを可能にします。