PR

【Arduino】PWM制御でLEDの明るさを調整しよう!ゆっくり点灯させる方法も解説!

こんにちは、メカ旦那です!

先日ボタンを押してLEDを点灯させる回路について解説しました。今回は続きとして、LEDの明るさを調整してみましょう。

基礎編として「デューティ比を指定して明るさを調整しよう!」、応用編として「LEDをゆっくり点灯・消灯させよう!」を解説します。

Arduino、LEDを初めて扱う方はこちらを先に読むことをオススメします!

基礎編「デューティ比を指定して、明るさを調整しよう!」

使用部品

今回は、Arduino Uno、ブレッドボード、USBケーブル、ジャンプワイヤー×2、抵抗(330Ω)、LEDをご準備下さい。抵抗が330Ω以下だとLEDが眩しくて目に悪いので注意してくださいね。

ちなみに、私は下記の初心者キットを使用しています。

回路

回路図はfritzingを用いて作成しています

回路のポイントはこちらです!

PWM信号が出力できるピンに接続しよう!

LED編その①、その②ではピンからデジタル信号を出力していましたが、今回はPWM信号を出力します。

こちらでも解説しましたが、PWM信号が出力できるピンはデジタルピンの内、〜が付いています。つまり、3、5、6、9、10、11ピンが該当します。どれを使っても良いですが、今回は5ピンを使用します。

メカ坊や
メカ坊や

旦那~、PWM信号って何ですか?

メカ旦那
メカ旦那

PWM信号についてはこちらで詳しく解説していますが、一言で言うなら「擬似的なアナログ信号」になります

デジタル信号ではLEDの状態について点灯消灯の2種類しか実現できませんでした。しかし、PWM信号では少しだけ点灯も可能にします。つまり、LEDの明るさを自由に制御できる方法なのです!

このLEDの明るさ度合いをデューティ比と言います。「ソースコード」で詳しく解説しますね。

メカ坊や
メカ坊や

PWM信号って「擬似的なアナログ信号」なんですよね?「擬似的な」というのはどういう意味ですか?

メカ旦那
メカ旦那

LEDの明るさを自由に変えられるという点はアナログ信号の特徴ですが、デジタル信号を使ってアナログ信号っぽく見せてるだけなので「擬似的」という言葉を使っています!

LEDのアノードが5ピン側になるように接続しよう!

アノードはLEDの長い方のピンになります。アノードは必ず5ピン側(+極側)に接続してください。逆だと通電しません。

ソースコード

/* LED編その3 基礎編 */
/* デューティ比を指定する事でLEDの明るさを調整*/

int led = 5;
int duty = 255; 

void setup() {
    pinMode(led,OUTPUT);     //PWMで使えるピンはOUTPUTが前提である為省略可能
}

void loop() {
    analogWrite(led,duty);
}

変数の宣言

int led = 5;
int duty = 255;

まず冒頭で変数ledを宣言し、LEDに接続するピン番号を入力します。今回は5を代入しましょう。

次に変数dutyを宣言し、デューティ比を代入します。先ほども説明したようにデューティ比はザックリ言うなら「LEDの明るさ度合い」ですが、厳密には「周期に対するパルス幅の割合」になります。

割合なので単位は%ですが、そのままでは変数に代入できません。下図の式を参考に8ビット(0~255)に変換した値を代入してください。とりあえず、今は最大値の255を代入してみます。

void setup

void setup() {
    pinMode(led,OUTPUT);     
}

pinMode関数で先ほどのled(5ピン)を出力ピンに設定します。

void loop

void loop() {
    analogWrite(led,duty);
}
  • analogWrite(ピン番号、デューティ比)
    指定のピンから、デューティ比で設定したアナログ信号を出力します。

転送!

転送してみましょう!

int duty = 255;

dutyに255を代入したので、ledの明るさが最大になっています。

次にdutyに63を代入して再度転送してみましょう。(明るさ25%)

int duty = 63;

duty比の値を小さくしたので暗くなりました。

最後に0をdutyに代入してみましょう。(明るさ0%)

int duty = 0;

消灯しましたね。

メカ旦那
メカ旦那

明るさ100%と25%の違いはわかりやすいですが、75%と50%は目視ではわかりませんでした(笑)。ただ確実に明るさは変化しています。

基礎編まとめ

このようにPWM制御を使う事で、LEDの明るさを自由に変えることができました!

今回は手入力でデューティ比を指定しましたが、応用編では時間が経つにつれてデューティ比を増減させて、ゆっくり点灯、消灯させてみましょう!

応用編

使用部品、回路は基礎編と同じです!

ソースコード

/* LEDをゆっくり点灯・消灯 */

int led = 5;
int wait =10;
int jump =1;

void setup() {
}

void loop() {
  
    int i = 0;                // iをここで宣言し、0を代入
    while(i <= 255) {
      analogWrite(led, i);
      delay(wait);
      i = i + jump;           // iをjump分加算
    }
    
    i =255;
    while(i >= 0){
      analogWrite(led, i);
      delay(wait);
      i = i - jump;           // iをjump分減算
    }
    
    delay(1000);              //消灯→点灯を自然なタイミングにする
}

上から順に解説します。

変数の宣言

int led = 5;
int wait =10;
int jump =1;
  • led
    ledに繋がるピン番号を代入します。今回は5を代入します。
  • wait
    LEDの明るさを切り替える時間間隔を代入します。値を小さくすれば、LEDの明るさが高速で切り替わります。今回は10 ms毎に切り替えたいので10を代入します。
  • jump
    デューティ比の増減量を代入します。1を代入すればデューティ比が0→1→2→…と変化しますが、10を代入すれば0→10→20→…と変わります。つまり、jumpを大きくすると明るさの種類は減りますが、消灯から点灯までの時間が短くなります。今回は1を代入してみました。

void setup

void setup() {
}
メカ坊や
メカ坊や

あれ、何も書いてないですね。基礎編ではpinMode(led,OUTPUT)と書いて5ピンを出力ピンにしましたが、今回はいらないんですか?

メカ旦那
メカ旦那

次のvoid loopでanalogWriteの引数をledとしています。この場合、pinModeを省略することができます。analogWriteはアナログ出力にするための関数なので、ledが出力ピンである事は明らかだからです。なので、基礎編でも省略はできますよ。

void loop

void loop() {
  
    int i = 0;               
    while(i <= 255) {
      analogWrite(led, i);
      delay(wait);
      i = i + jump;          
    }
    

まずデューティ比を変数iとして宣言し0を代入します。基礎編ではdutyにしましたが、Arduinoでは1ずつ増える関数にはよくiが使われるのでこのようにしました。

次にwhile関数を使ってiが0〜255の時は{}内の処理を繰り返します。

まず、analogWriteで5ピンからデューティ比iのアナログ信号を出力します。次にdelayで10ms間アナログ信号を出力し続けます。そしてiに1を加えて、またanalogWriteに戻ります。コレをiが255になるまで繰り返します。この一連の流れでLEDがゆっくり点灯します。

iが256になったら、whileの外に出て次のwhile文を実行します。

    i =255;
    while(i >= 0){
      analogWrite(led, i);
      delay(wait);
      i = i - jump;          
    }
    
    delay(1000);              
}

まず一旦iを255に戻し、0になるまでwhile関数を実行します。
先ほどと違うのがi = i – jumpの所で、iを1ずつ減少させます。
この一連の流れでLEDをゆっくり消灯させます。

最後のdelay(1000)は完全に消灯した時を分かりやすくするために時間を置いています。

転送!

コードの流れがザックリ理解できたら転送してみましょう。ゆっくり点灯、消灯すれば成功です!

応用編まとめ

いかがでしたでしょうか。
while関数を使ってデューティ比をゆっくり増減させることで、LEDもゆっくり点灯、消灯しました。

PWM信号はLEDの調光だけでなく、モーターの回転速度を制御するためにも使われます。気になる方はこちらのブログもチェックしてみてくださいね!

メカ旦那

旧帝大工学部を卒業後、FA業界で会社員をしています。
電子工作の面白さを伝えるべく、ザックリ解説します!

メカ旦那をフォローする
Arduino
ザックリ解説Web

コメント

スポンサーリンク