Ola Kae Tode Tai

すべてのエンジニアに、追い風を祈る。

Electric ImpでPWMを使ってLEDの明るさを制御する

この投稿は Electric Imp Advent Calendar 2015 の11日目の記事です。

f:id:kironono:20151201001226p:plain

PWM制御

PWMとはPulse Width Modulationの略で、日本語ではパルス幅変調といいます。

パルス幅変調 - Wikipedia

一定の周期でON/OFFを繰り返すパルス信号のONとOFFの幅の比を調節することで元の電圧から1/5の電圧とか4/5電圧を作ることができます。

ElectricImpのGPIOどのポートでもPWMを使うことができます。

今回はElectricImpのPWM出力を使ってLEDの明るさを変化させてみます。

回路

f:id:kironono:20151203234528p:plain

利用する回路は以前のLチカの回路とおなじです。PIN9にLEDを接続しています。

バイスのコードを書く

led <- hardware.pin9;
led.configure(PWM_OUT, 1.0 / 400, 0.0);

ledState <- 0.0;
ledChange <- 0.1;
 
function pulse() {
    led.write(ledState);
    
    ledState = ledState + ledChange;
    
    if (ledState >= 1.0 || ledState <= 0.0) {
        ledChange = ledChange * -1.0
    }
    
     imp.wakeup(0.05, pulse);
}

pulse();

WebIDEのデバイスパネルに上のコードを書きます。

led <- hardware.pin9;
led.configure(PWM_OUT, 1.0 / 400, 0.0);

PIN9の設定を行っています。PWM出力を使うので configurePWM_OUT と設定しています。2番目の引数は周期Tです。ここでは400Hzとしたいので 周期T = 1 / 周波数f を計算しています。3番目の引数はデューティー比Dの初期値です。最初はLEDをOFFの状態にしておきたいので 0 にしています。

led.write(ledState);

ここでPWM出力としたPIN9のデューティー比を設定しています。ここには 0.0 〜 1.0 までの値を設定します。仮に led.write(0.5) とするとデューティー比は0.5でLEDの明るさはだいたい半分になります。(LEDがONになっている時間が半分)

あとはLチカのときと同様に imp.wakeup を使って定期的に pulse 関数を実行するようにしています。

まとめ

PWM制御はモーターの制御や、今回のLEDのようにLCDモニターの輝度調整に使われていてとても身近なものです。いろいろ利用できそうですね! imp001はどのピンでもPWM出力が使えますが、ほかのImpの場合、どのピンがPWM出力に使えるかは以下から確認できます。

electricimp.com