レッスン 2.1: LEDの明るさを調整する

このレッスンに必要なハードウェア、Arduino IDEの設定、およびLEDモジュールと制御ボード間の配線は、レッスン 1.1 と同様です。

(1).説明:

前回のレッスンでは、LEDの点灯・消灯を制御し、点滅させました。

このプロジェクトでは、PWMを使ってLEDの明るさを制御し、呼吸効果をシミュレートします。同様に、コード内のステップ長や遅延時間を変更することで、異なる呼吸効果を表現できます。

PWMは、デジタル手段でアナログ出力を制御する方法です。デジタル制御を用いて、異なるデューティサイクルの矩形波(高レベルと低レベルを絶えず切り替える信号)を生成し、アナログ出力を制御します。一般的に、ポートの入力電圧は0Vと5Vです。もし3Vが必要なら?または1V、3V、3.5Vの間を切り替えたい場合は?抵抗を常に変えることはできません。このような場合にPWM制御が必要です。

Arduinoのデジタルポートの電圧出力はLOWとHIGHの2つだけで、それぞれ0Vと5Vに対応します。LOWを0、HIGHを1と定義し、Arduinoが1秒間に500回の0または1の信号を出力するとします。

もし500回すべて1を出力すれば5V、すべて0なら0Vです。010101010101のように出力すると、出力ポートは2.5Vとなり、これは映画の表示に似ています。私たちが見る映画は完全に連続しているわけではなく、実際には1秒間に25枚の画像を出力しています。この場合、人間はそれを区別できませんし、PWMも同様です。異なる電圧を得たい場合は、0と1の比率を制御する必要があります。単位時間あたりに出力される0と1の信号が多いほど、より正確に制御できます。

(2).コードの説明:

繰り返し処理が必要な場合、FOR文を使うことができます。

FOR文の形式は以下の通りです:

FORの繰り返し順序:

1回目:1 → 2 → 3 → 4

2回目:2 → 3 → 4

2が成立しなくなるまで、「for」ループは終了します。

この順序を理解した上で、コードに戻ります:

for (int value = 0; value < 255; value=value+1){

…}

for (int value = 255; value >0; value=value-1){

…}

この2つの“for”文は、valueを0から255まで増加させ、その後255から0まで減少させ、また255まで増加させる…という無限ループを作ります。

次に新しい関数が登場します —– analogWrite()

デジタルポートは0と1の2状態しか持たないことは知っています。では、どうやってアナログ値をデジタル値として送るのでしょうか?ここでこの関数が必要になります。Arduinoボードを観察し、“~”マークのある6つのピンを見つけてください。これらはPWM信号を出力できます。

関数の形式は以下の通りです:

analogWrite(pin,value)

analogWrite()はPWMポートに0〜255の範囲でアナログ値を書き込むための関数です。値は0〜255の範囲内で指定します。PWM機能を持つデジタルピン(例えばピン2、3、4、5、6、7、8、9、10、11、12、13、44、45、46)にのみ書き込み可能です。

PWMはデジタル方式でアナログ量を得る技術です。デジタル制御は矩形波を形成し、この矩形波信号はオンとオフ(高レベルまたは低レベル)の2状態のみを持ちます。オンとオフの時間比率を制御することで、0〜5Vの電圧をシミュレートできます。オンの時間(学術的には高レベルと呼ばれる)はパルス幅と呼ばれ、PWMはパルス幅変調とも呼ばれます。

以下の5つの矩形波を通じて、PWMについてさらに理解しましょう。

上図では、緑の線が1周期を表し、analogWrite()の値はデューティサイクル(Duty Cycle)と呼ばれる割合に対応します。デューティサイクルは1周期内の高レベル時間を低レベル時間で割ったものです。上から順に、最初の矩形波のデューティサイクルは0%で対応する値は0です。LEDの明るさは最も低く、つまり消灯状態です。高レベルの時間が長いほどLEDは明るくなります。したがって、最後のデューティサイクルは100%で255に対応し、LEDは最も明るくなります。25%は暗めを意味します。

PWMは主にLEDの明るさ調整やモーターの回転速度制御に使われます。

スマートロボットカーの制御において重要な役割を果たします。