プロジェクト2:LED輝度の調整

(1)概要:

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

このプロジェクトでは、PWMを通じてLEDの輝度を制御し、呼吸エフェクトをシミュレートします。同様に、コード内のステップ長と遅延時間を変更することで、異なる呼吸エフェクトを演出できます。

PWMとは、デジタル手段によってアナログ出力を制御する方法です。デジタル制御を使用して、異なるデューティサイクルの矩形波(常にHighレベルとLowレベルを切り替える信号)を生成し、アナログ出力を制御します。

一般的に、ポートの入力電圧は0Vと5Vです。3Vが必要な場合はどうすればよいでしょうか?または1V、3V、3.5Vの切り替えが必要な場合は?抵抗を常に変更することはできません。そのため、PWMを利用します。

Arduinoのデジタルポートの電圧出力には、LOWとHIGHレベルのみがあり、それぞれ0Vと5Vの電圧出力に対応します。LOWを「0」、HIGHを「1」と定義し、Arduinoに1秒間に500個の「0」または「1」を出力させることができます。500個の「1」を出力すると5V、すべて「0」なら0V、250個の「01」パターンを出力すると2.5Vになります。

このプロセスは映画の上映に例えることができます。私たちが見ている映画は完全に連続しているわけではありません。実際には1秒間に25枚の画像が生成されており、人間の目ではそれを判別できません。そのため、連続したプロセスと錯覚してしまいます。PWMも同様の仕組みで動作します。異なる電圧を出力するには、0と1の比率を制御する必要があります。単位時間あたりに出力される「0」または「1」が多いほど、制御の精度が高まります。

(2)パラメータ:

制御インターフェース:デジタルポート3

動作電圧:DC 3.3-5V

ピン間隔:2.54mm

LED表示色:黄色

(3)接続図:

ArduinoのPWMピンは3、5、6、9、10、11に接続されています。ピン9はそのままにしてください。

(4)テストコード:

(注意: コードをアップロードする前にBluetoothモジュールを接続しないでください。コードのアップロードにもシリアル通信を使用するため、Bluetoothシリアル通信と競合し、アップロードに失敗する可能性があります。)

/*

Keyestudio Mini Tank Robot V3 (Popular Edition)

lesson 2.1

pwm

http://www.keyestudio.com

*/

int LED = 9; //LEDのピンを9として定義する

void setup () 
{
	pinMode(LED, OUTPUT); //LEDのピンをOUTPUTに設定する
}

void loop () 
{
	for (int value = 0; value < 255; value = value + 1) 
    {
		analogWrite(LED, value); // LED点灯
		delay(5); //5msの遅延
	}
	for (int value = 255; value > 0; value = value - 1) 
    {
		analogWrite(LED, value); //LEDが暗くなる
		delay(5); //5msの遅延
	}
}

(5)テスト結果:

テストコードのアップロードが成功すると、LEDは徐々に明るくなったり暗くなったりし、人間の呼吸のような動作をします。即座にオン・オフするのではありません。

(6)コードの説明:

特定の文を繰り返すには、FOR文を使用できます。FOR文のフォーマットは以下の通りです:

図1(1)

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機能を持つデジタルピン(ピン3、5、6、9、10、11など)にのみ書き込めることに注意してください。

PWMは、デジタル方式でアナログ量を取得する技術です。デジタル制御により矩形波が形成され、矩形波信号はオンとオフ(つまりHighレベルまたはLowレベル)の2つの状態しか持ちません。オンとオフの持続時間の比率を制御することで、0Vから5Vの間で変化する電圧をシミュレートできます。オンの時間(学術的にはHighレベルと呼ばれます)はパルス幅と呼ばれるため、PWMはパルス幅変調とも呼ばれます。

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

上の図において、緑の線は1周期を表し、analogWrite()の値はデューティサイクルと呼ばれる割合に対応します。

デューティサイクルとは、1サイクルにおけるHighレベルの持続時間をLowレベルの持続時間で割った値を指します。上から下に向かって、最初の矩形波のデューティサイクルは0%で、対応する値は0です。LEDの輝度は最も低く、つまり消灯しています。Highレベルの持続時間が長いほど、LEDは明るくなります。したがって、最後のデューティサイクルは100%で255に対応し、LEDは最も明るくなります。25%は暗い状態を意味します。

PWMは主にLEDの輝度調整やモーターの回転速度調整に使用されます。

スマートロボットカーの制御において非常に重要な役割を果たします。次のプロジェクトが待ち遠しいことと思います。

(7)応用練習:

遅延の値を変更し、ピンはそのままにして、LEDがどのように変化するかを観察してみましょう。

テストコード

(注意: コードをアップロードする前にBluetoothモジュールを接続しないでください。コードのアップロードにもシリアル通信を使用するため、Bluetoothシリアル通信と競合し、アップロードに失敗する可能性があります。)

/*

Keyestudio Mini Tank Robot V3 (Popular Edition)

lesson 2.2

pwm-slow

http://www.keyestudio.com

*/

int LED = 9; //LEDのピンを9として定義する

void setup() 
{
	pinMode(LED, OUTPUT); //LEDのピンをOUTPUTに設定する
}

void loop () 
{
	for (int value = 0; value < 255; value = value + 1) 
    {
		analogWrite(LED, value); // LED点灯
		delay(30); // 30msの遅延
	}
	for (int value = 255; value > 0; value = value - 1) 
    {
		analogWrite(LED, value); //LEDが暗くなる
		delay (30); // 30msの遅延
	}
}

コードを開発ボードにアップロードすると、LEDがよりゆっくりと点滅します。