### プロジェクト2:LED輝度の調整 #### **(1)概要:** 前のレッスンでは、LEDのオン・オフを制御し、点滅させました。 このプロジェクトでは、PWMを通じてLEDの輝度を制御し、呼吸エフェクトをシミュレートします。同様に、コード内のステップ長と遅延時間を変更することで、異なる呼吸エフェクトを演出できます。 PWMとは、デジタル手段によってアナログ出力を制御する方法です。デジタル制御を使用して、異なるデューティサイクルの矩形波(常にHighレベルとLowレベルを切り替える信号)を生成し、アナログ出力を制御します。 一般的に、ポートの入力電圧は0Vと5Vです。3Vが必要な場合はどうすればよいでしょうか?または1V、3V、3.5Vの切り替えが必要な場合は?抵抗を常に変更することはできません。そのため、PWMを利用します。 ![](media/bbcfcb9ae56abb7e80ee587246fc4be9.GIF) 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)パラメータ:** ![](./media/image-20250709104949184.png) 制御インターフェース:デジタルポート3 動作電圧:DC 3.3-5V ピン間隔:2.54mm LED表示色:黄色 #### **(3)接続図:** ArduinoのPWMピンは3、5、6、9、10、11に接続されています。ピン9はそのままにしてください。 ![](media/8ad54723c1d6149952c730217a1861cd.png) #### **(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文のフォーマットは以下の通りです: ![図1(1)](media/65da124bdd0ea488291c71c6b879fe95.jpeg) 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についてさらに理解を深めましょう。 ![](media/553f3d1b6ca04e1aa0479841dd075fa2.png) 上の図において、緑の線は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がよりゆっくりと点滅します。