LEDの明るさを変えたりサーボモーターに角度の信号を送る時、PWMというものを使います。 Arduinoを使ってDIYをするときに避けては通れない道なので、簡単にまとめます。
PWMとは
PWMとはPulse Width Modulationの頭文字を省略した略語で、パルス幅変調という意味です。 平均電圧を変化させることで0Vと5Vしか出力できないコンピュータで1Vや2.5といった電圧を出すために使います。
仕組み
ArduinoでdigitalWrite()関数を使うとき、ピン番号を指定してHIGHやLOWと書きますが、これは電気的には5Vと0Vです。 よくコンピュータの世界は1と0でできていると言われますが、電気的に言えばコンピュータは1を5V、0を0Vとして動作しています。 逆に言うと、1Vや2.5Vのような中途半端な電圧を使うことはできません。
しかし、LEDの明るさを変えるためには電圧を変化させる必要があります。 昔、理科の実験で豆電球を光らせたことがあると思いますが、豆電球は電圧を高くするほど明るく、電圧を低くするほど暗く光ったはずです。 LEDにも同じことが言えます。
そこで必要になるのが平均電圧という考え方です。 時間あたりに5V(HIGH)になっている時間を1秒間5Vを出力すれば平均電圧は5Vとなり、0.5秒間5Vを出力して0.5秒間0Vを出力すれば平均電圧は2.5Vになります。 下の画像では1秒間うち0.5秒間5Vを出力したものと、1秒間のうち0.2秒間5Vを出力した場合のグラフを示しています。
LEDを点滅するスケッチを描いてみると、平均電圧が2.5Vになる方が平均電圧が1Vの時よりもLEDがよく光ることがわかります(時間を1秒にすると点滅してしまうので、5ミリ秒くらいに調整してください)。
つまり5Vと0Vを切り替えることで電圧が変わっているのと同等の効果を得ることができます。
そして、5Vになっている時間のことをパルス幅といい、この幅を変えることを変調と言っています。 これがPWMという名前の由来です。
つまり5Vと0Vを切り替えることで電圧が変わっているのと同等の効果を得ることができます。
そして、5Vになっている時間のことをパルス幅といい、この幅を変えることを変調と言っています。 これがPWMという名前の由来です。
デューティー比
先の画像の電圧のグラフでは、5Vにしている時間と0Vにしている時間が変わると平均電圧が変わることが分かったはずです。 この時間の比をデューティー比と言います。 平均電圧2.5Vであればデューティー比は50%、平均電圧1Vであればデューティー比は20%です。
ArduinoでPWMを使う
一定時間ごとに5Vと0Vを切り替えることで、電圧を変えるのと同等の効果が得られることが分かりましたが、loop()関数の中でいちいちdigital(10, HIGH)とかやるのは面倒です。 また、Arduinoに2つLEDを繋いで、別々の明るさにしたい時にはさらに面倒なことになります。 そこでArduinoにはPWMの機能を簡単に使えるようにした関数が用意されています。
analogWrite(10, 127)
これは10番ピンにデューティー比50%のPWM信号を出力するという意味です。 オシロスコープを使って波形を見るとArduinoが5Vと0Vを勝手に切り替えてくれているのが分かります。 この関数では、デューティー比0%から100%を0〜255の数字に割り当てています。つまり、数字が大きいほど平均電圧が高くなり、LEDを繋いでいればLEDがより明るく光ることになります。
PWM機能が使えないピンがある
便利なPWMですが、実は使えるピンの番号と数が決まっています。Arduino Nanoでは下の画像のPWMと書かれているD3、D5、D6、D9、D10、D11の6つのピンでしかPWMを使うことはできません。