Arduino IDE でプログラミングを行い、作成したプログラムと Arduino で LED を点灯/消灯/点滅させることができるようになりました。この記事では、LED を点灯させるところまで少し戻って、PWM 制御で LED を明るく点灯させたり、薄暗く点灯させたりしてみます。LED の光り方を上手く制御すると、蛍の光のようにぼんやり光るオモチャを作れます。
Arduino 単体では、いくら頑張っても ON (5V)か OFF (0V)のデジタル量しか出力できません。つまり、全力(5V)で LED を点灯させるか、または全力で(0V)で LED を消灯させることしかできないので、例えば 3.75V のような中途半端な電圧(アナログ値)で、LED をぼんやりと点灯させることはできないのです。
そこで、Arduino で LED の明暗を制御するには、パルス幅変調と呼ばれる仕組みを利用します。LED のオンとオフを人間の目には判らないくらい高速に切り替えると、一見して LED は点灯しているように見えるのですが、高速にオン/オフを切り替える中で、より長い時間オンが続けば LED は明るく見えますし、反対に、より長い時間オフが続けば LED は暗く見えるように錯覚してしまいます。このように、電圧をパルス(Pulse)状に出力し、このパルスの通電時間(=幅; Width)を変える(Modulate)ことで、LED の見た目の明るさを制御する方法が PWM と呼ばれる仕組みです。実際に出力されているのはデジタル値ですが、疑似的にアナログ値が出力されているように見せているわけです。
百聞は一見にしかず、とりあえず、パルス幅変調で LED を点灯させている例を見てみましょう。
画面左半分に、LED の電源電圧をオシロスコープで測定したグラフが表示されています。グラフで、太ったり細ったりしている長方形が 5V の電圧がオンになっているパルスで、パルスとパルスの間はオフの状態です。ここで、PWM の 1 周期の時間に対するオン時間の比率を デューティー比; duty ratio と言い、デューティー比が 100% では、常にオン、デューティー比が 0% では、常にオフになります。
このデューティー比の変化と、右側のブレッドボード上の LED の明るさの変化に注意してみると、デューティー比が高くなると LED は明るくなり、反対にデューティー比が低くなると LED が暗くなることが判ります。ここでは、1 秒間に約 2,000 回*1のスピードでオン/オフを繰り返しているのですが、あまりにも高速でオン/オフするため、人間の目には点滅しているようには全く見えません。
Arduino で PWM を使うには、オン/オフをデジタル量で制御する digitalWrite
の替わりに、analogWrite
を使います。analogWrite
を利用すれば、PWM 出力のデューティー比を 256 段階で制御できます。Fig.1 は、この analogWrite
を使って、11番ポートと 9 番ポートに出力された PWM の電圧波形を測定したところです。
11 番ポートのデューティー比はおおよそ 50%(=128/256) ですので、オン時間とオフ時間がおおよそ同じになっています。また、9 番ポートのデューティー比はおおよそ 25%(=64/256) であることが判ります。
先の動画にある蛍の光のようにぼんやりと光る LED を作ってみます。電子回路は以前に組んだものをそのまま使うことができます(Fig.2 )。11 番ポートを LED に接続してください。
また、スケッチは次のようになります。
void setup() { // put your setup code here, to run once: pinMode( 11, OUTPUT ); } int val = 0; // 現在の明るさ int dir = 1; // 明るさの変化方向 void loop() { // put your main code here, to run repeatedly: analogWrite( 11, val ); val = val + dir; if( val == 0 ) dir = 1; if( val == 255 ) dir = -1; delay( 5 ); }