前回は、Arduinoを使ってシンプルなLチカをしてみたのですが、今回は一歩進んだ方法でLEDを制御してみたいと思います。今回やるのはLEDをゆっくり光らせたり消したりするという制御です。
目次
- 回路の組み方
- PWM制御とは何か?
- まずは原理を理解しよう
- PWMとは?
- プログラムして実行!
- プログラムコード
- コードの解説
- まとめ
1. 回路の組み方
まずは回路を組む必要がありますが、前回と全く一緒です。

具体的な組み方は前回の記事を参照してみてください。
2. PWM制御とは何か?
豆電球に電池を繋げたようなアナログ回路では、電池の寿命がなくなってくると電圧が下がるので、当然豆電球は暗くなりますよね?つまり「電圧を下げればLEDを暗くすることができるのではないか?」と想像できます。
2-1. まずは原理を理解しよう
しかし、Arduinoの回路はデジタル回路なので、電圧は常に一定に保たれています。ではどうやってLEDを明るくしたり、暗くしたりするのでしょうか?
その答えは、スイッチを高速で入れたり切ったりすることでそれを行なうのです。電球よりも電池とモーターで動く車のおもちゃを想像してもらうと分かりやすいです。
車のおもちゃのスイッチを素早く入れたり切ったりしているところを想像してみてください。スイッチを切ってもタイヤはしばらく惰性で回転し続けますよね?今度は、完全にタイヤが止まる前にまたスイッチを入れてみます。どうなりますか?またタイヤの回転に勢いが付きます。…このような制御を素早く正確にしたとすればどうなるでしょう?
例えば、正確に0.5秒間スイッチを入れて、0.5秒間スイッチを切る動作を繰り返した場合、結果として、スイッチを入れっぱなしのタイヤの回転速度に対して実質50%の回転速度を得られるはずです。では、正確に0.75秒間スイッチを入れて、0.25秒間スイッチを切る動作をすればどうなりますか?実質75%の回転速度を得られるはずですよね?
実際には、このような1/10秒程度の制御だと動きは当然スムーズにはならないのですが、人間にはできない速さで正確にこれを行なうと、もっとスムーズに速度を制御できるのです。
2-2. PWMとは?
つまり、今からやろうとする制御はまさにこの原理を使った制御です。デジタル回路でアナログ回路的な挙動を得るためにするこのようなこの制御方法をパルス幅変調(PWM : pulse width modulation)制御といいます。
ついでに、もう一つ覚えておきましょう。「デューティ比」という言葉です。スイッチを0.5秒:入、0.5秒:切の時、デューティ比は50%(or 0.5)、スイッチを0.75秒:入、0.25秒:切の時、デューティ比は75%(or 0.75)と覚えておきましょう。(※冒頭のグラフを参照)デューティ比はPWM制御の際に必ず出てくるキーワードです。
では、PWMについて基本的なことを理解したところで、早速プログラミングに移りましょう。
3. プログラムして実行!
このPWM制御のための出力を可能にする便利な関数があります。それは、analogWrite(pin, value)という関数です。
第一引数のpinにはピン番号を入れて、第二引数のvalueにはデューティー比を指定しますが、0〜255までの数値で指定します。
具体的にはこのようにプログラムを組みます。Arduino IDEを起動して、このように入力してみましょう。
3-1. プログラムコード
const int LED = 9; // LEDが接続されているピン
int i = 0; // カウントアップとダウンに使用
int val = 0; // 入力ピンの状態
int old_val; // valの前の値を保存しておく変数
int state = 0; // LEDの状態(0ならオフ、1ならオン)
void setup() {
pinMode(LED, OUTPUT); // ArduinoにLEDが出力であることを伝える
}
void loop() {
// フェードイン
for (i = 0; i < 255; i++) {
analogWrite(LED, i); // LEDの明るさをセット
delay(10);
}
delay(500);
// フェードアウト
for (i = 255; i > 0; i--) {
analogWrite(LED, i); // LEDの明るさをセット
delay(10);
}
delay(500);
}
※Arduinoの言語はC/C++に似ていますが、独自の言語ということになっています。
プログラム経験が全くない人にとってはまだまだ難しいと思いますが、現時点では難しく考えず、ひとまず、こんな風にやればいいのかという感じでいいと思います。ただ、コピペしてしまうと頭に残らないので、できれば正確に入力することから始めるとよいと思います。
組めたら、Ardudino IDEの書き込み実行ボタンをクリックして動作させてみてください。
3-2. コードの解説
forループの中に、先ほどのanalogWrite関数を入れるのですが、多少のタイムラグを入れておかないと瞬間的に動作が完了してしまうため、delay(10)を入れて1/100秒動作を遅延させてやります。最初の徐々に明るくさせるforループを抜けたら、delay(500)を使って動作を0.5秒間一休みさせ、今度は暗くなっていく二番目のforループが開始します。
さぁ、どうでしょう?LEDをゆっくり点滅させることができたでしょうか?
4. まとめ
今回は電流を流してLEDをつけたり消したりするだけでなく、PWMについて学びアナログ出力の基礎的な方法を学びました。PWMは電子工作をする上で、不可欠な制御方法で必ず覚えておく必要があります。
同じPWMの制御はDCモーターやサーボモーターの制御にも使われます。原理を理解して、analogWrite関数を使いこなせるようにしておきましょう!