### プロジェクト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シリアル通信と競合し、アップロードに失敗する可能性があります。)
```C
/*
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文のフォーマットは以下の通りです:

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シリアル通信と競合し、アップロードに失敗する可能性があります。)
```C
/*
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がよりゆっくりと点滅します。