この投稿は Electric Imp Advent Calendar 2015 の11日目の記事です。
PWM制御
PWMとはPulse Width Modulationの略で、日本語ではパルス幅変調といいます。
一定の周期でON/OFFを繰り返すパルス信号のONとOFFの幅の比を調節することで元の電圧から1/5の電圧とか4/5電圧を作ることができます。
ElectricImpのGPIOどのポートでもPWMを使うことができます。
今回はElectricImpのPWM出力を使ってLEDの明るさを変化させてみます。
回路
利用する回路は以前の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出力を使うので configure
で PWM_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出力に使えるかは以下から確認できます。