LEDの光の強弱を調節する(PWMを使う)
ワークショップの1日目に、LEDを点滅させました。LEDの光り方はデジタルで、ONとOFFの状態しかありません。ただ、プログラムを工夫するとONとOFFの間の状態を作れます(例えばONの半分の光量で光る、1/3の光量で光るなど)。ここでは、PWM(Pulse Width Modulation)という仕掛けを使います。
まずは、ワークショップの1日目に作ったLED点滅用の回路を作ってください。GPIO 21番からLEDに給電する回路です。以下、この回路を使ってLEDの光量を調節をします。
光量を調節する
LEDを使って光量を調節するプログラムがpwmled-on-off.pyです。まずプログラムの先頭部分で以下のようにします。
from gpiozero import PWMLED
そして、以下のようにしてLEDを使う準備をします。ここで数字の「21」は、LEDへ電気を流すのに使うGPIOピンの番号です。
led = PWMLED(21)
続いて以下のようにすると、LEDが点灯します。この時の光量は100%です(LEDが発光できる最大の光量)。
led.on()
time.sleep(2)
100%の光量でLEDが点灯し、その後time.sleep(2)
で、プログラムの実行が2秒間止まります。つまり、LEDが100%の光量で光る状態が2秒間続きます。
光量を変えるには、led.value
という変数に値を代入します。この値は0と1の間の数字です(小数や分数も可)。1が100%の光量、0が0%の光量(つまり消灯)、0.5が50%の光量です。
led.value = 0.75
time.sleep(2)
ここでは0.75を代入しているので75%の光量でLEDが光ります。その後time.sleep(2)
で、プログラムの実行が2秒間止まります。つまり、LEDが75%の光量で光る状態が2秒間続きます。このプログラムはその後光量を50%、25%と減らして、最後に消灯します。
ロウソクのようにチカチカ光らせる
これまでのプログラムをもう少し改良してLEDをロウソクのようにチカチカ光らせるのがflicker.pyです。このために、LEDの光量と点灯時間を毎回ランダムに変えることにします。
Pythonにはランダムに数を生成する機能があります。この機能を使うには、プログラムの最初の部分に以下の行を追加します。
from random import random
そして、ランダムな数をrandom()という関数で生成します。ランダムに作られた数のことを乱数(random number)といいます。
led.value = random()
この関数は、0以上1未満の乱数を返します。この乱数は小数です。これをled.value
に代入して、光量をランダムにしています。
点灯時間は以下のようにランダムにしています。
time.sleep(random() * 0.2)
random()が0以上1未満の乱数を返すので、random() * 0.2
の部分は0以上0.2未満の乱数になります。「*」は、かけ算の記号です。
このプログラムは無限ループで永遠にLEDをチカチカ点滅させ続けます。プログラムの実行を止めるにはControl-Cしてください。
フェードイン、フェードアウトさせる
LEDをフェードインさせるプログラムがfade-in.pyです。フェードインとは、最初は消灯していて、その後時間がたつにつれて徐々に光量を増やしていくことです。これまで通り
led = PWMLED(21)
としてLEDをセットアップします。このとき光量はゼロです(led.value
は0)。その後
newIntensity = led.value + ledValueDelta
として光量を増やします。現在の光量がled.value
で、それにledValueDelta
を足して増やしています。ledValueDelta
は0.01となっているので、現在の光量を0.01だけ増やし、
led.value = newIntensity
として少しだけ強くLEDを点灯させます。これをループで繰り返し、led.value
が1を超えたらプログラムの実行を止めます。
フェードインと逆のフェードアウトをさせるプログラムがfade-out.pyです。最初は100%の光量でLEDを点灯させ、その後時間がたつにつれて徐々に光量を減らしていきます。