前回はdigitalWrite()
を使ってモーターを回しました。しかしこのやり方では電源オンと電源オフの2つしかできません。でもスピードを変えたいときもありますよね。そんなときに役立つのがPWM制御です。
PWM制御(パルス幅変調)
まずはPWM制御について超簡単に説明します。PWM(Pulse Width Modulation)はモーターの回転制御やインバータ(直流を交流に変換するような電源回路)に使われている仕組みです。日本語ではパルス幅変調といいます。PWM制御はオンとオフを高速で入れ替えながら、オンにする時間とオフにする時間の幅を変えることでモーターの回転速度などを変化させることができます。ある一定時間(1周期)内で、オンにする時間を長くすればスピードは速くなるし短くすれば遅くなるというわけです。図解↓
Arduinoでは490Hzまたは980HzのPWM制御ができます。490Hz(ヘルツ)のときは1秒間に490回もオンオフの操作を行っています。オンオフを1回(1周期)として490回です。そろそろ頭が痛くなってきたと思うので理屈はそっちのけで実際に使ってみましょう。
ArduinoでPWM制御を使ってみる(LED)
PWMを使うとモーターの回転速度やLEDの明るさを変えることができます。Arduino UNOでは波線マーク「~」がついているデジタル入出力ピン(6本)でPWMが使えます。※7本以上でPWM制御する場合はArduino MEGAを使いましょう。
~PWMが使えるのは 3,5,6,9,10,11番ピン
(Arduino UNO, Arduino NANO)
いきなりモーターで試すのはちょっと怖いのでLEDを使ってみます。配線はLチカのときとほぼ同じですがデジタル入出力ピン11番を使います。配線図↓
プログラムですがdigitalWrite()
の代わりにanalogWrite()
を使います。
analogWrite(pin, value)
pin : ピン番号
value : 整数値 0~255
スピードや明るさを変化させるには「value」の値を変えます。まとめると次の表のようになります。超絶に分かりにくいよね!
value | 割合 |
---|---|
255 | 100% |
191 | 約75% |
128 | 約50% |
64 | 約25% |
0 | 0% |
今回は
100%の明るさを2秒間、50%の明るさを2秒間、0%の明るさ(つまり消す)を2秒間
をくりかえすプログラムを作ってみましょう。
void setup() {
pinMode(11, OUTPUT); //11番ピンを出力に設定
}
void loop() {
analogWrite(11, 255); //LEDを光らせる100%
delay(2000); //2秒待つ
analogWrite(11, 128); //LEDを光らせる50%
delay(2000); //2秒待つ
analogWrite(11, 0); //LEDを消す
delay(2000); //2秒待つ
}
では書き込みして光らせてみましょう。
ちょっと分かりにくいですが明るさを変化させることができました。
ArduinoでPWM制御を使ってみる(モーター)
LEDで上手くいったのでモーターに挑戦です。配線は前回Arduino講座06(DCモーターを回そう)と同じで5番、6番ピンを使います。では
モーターを50%のパワーで2秒間回転し、75%のパワーで2秒間逆回転して、2秒間停止する
をくりかえすプログラムを作ってみましょう。
void setup() {
pinMode(5, OUTPUT); //5番ピンを出力に設定
pinMode(6, OUTPUT); //6番ピンを出力に設定
}
void loop() {
analogWrite(5, 128); //モーター回転50%
analogWrite(6, 0); //モーター回転50%
delay(2000); //2秒待つ
analogWrite(5, 0); //モーター逆回転75%
analogWrite(6, 191); //モーター逆回転75%
delay(2000); //2秒待つ
analogWrite(5, 0); //モーター停止
analogWrite(6, 0); //モーター停止
delay(2000); //2秒待つ
}
ではArduinoに書き込んで試してみましょう。書き込み終了後すぐにモーターが回転するので気をつけて。
こちらも大成功!最初に25%のパワーでやったら回らなかったので50%に上げました。またキーンという音がすると思いますがこれは「周波数490Hz」でPWM制御しているのでその音が雑音として聞こえています。故障ではありません。
まとめ
今回の内容でDCモーターを速く回したりおそく回したりするなどの制御方法が分かりました。またArduinoでの出力(モーターやLED)はdigitalWrite()
とanalogWrite()
の2つでプログラミングもそんなに難しくありません。これでもうArduinoで鉄道模型やロボットカーなどを走らせることができます!ぜひ挑戦してみてください。