親子IoTワークショップ

マイコンとクラウドを使ってIoTとプログラミングを学ぼう

[ トップ | 開催予定・概要 | 2024-12開催 | お知らせ | Facebook ]

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を点灯させ、その後時間がたつにつれて徐々に光量を減らしていきます。

自習プロジェクトの目次に戻る