Lチカ、PWM、サーボモータ
LチカからPWM、サーボモータへ
Lチカプログラムをいじる
#include "mbed.h" DigitalOut myled(LED1); // ピンのモード設定/プログラム上での名前/ピンの呼び名 int main() { while (1) { myled = 1; // LEDを光らせる wait_ms(1000); // 1000ms停止 myled = 0; // LEDを消す wait_ms(1000); // 1000ms停止 } }
wait_ms()
は括弧の中の値/ミリ秒マイコンを停止させる関数です。LEDをONにしては停止、OFFにしては停止が while
文で繰り返されるのでLEDがチカチカするわけです。
引数をいじってみましょう。特に引数を十分小さくすると、面白いことが起こります。
PWM
引数を小さくしていくとある時点で点滅が感じられなくなります。(私は両方の引数を10msにすると感じられません)そして少し暗くなったように感じます。(分かりにくければ、ON時間を1ms, OFF時間を19msにしてみてください) これがPWMを理解するうえでとても大事なことです。
PWMは疑似的なアナログ値を作るツールです。
PWMを生成するには、Lチカのプログラムからもわかる通り、十分小さい時間で、ON時間とOFF時間を決めればよいですね。ON時間とOFF時間の和とON時間でも生成することができますね。ON時間とOFF時間の和を周期と呼び、ON時間をパルス幅と言ったり、ON時間/周期
をデューティー比といいます。
mbedにはPWMを生成するAPIが備わっているので、それを利用しましょう。
今後mbedでどうやってコードを書けばいいんだ?となったら mbed (機能名::今回はPWM)
でググりましょう。
初期化、周期、パルス幅をそれぞれどうやって書けばよいのかの説明が書いてあります。
サーボモータ
#include "mbed.h" PwmOut PWM(LED1); //初期化 int main() { PWM.period_us(20000); //周期設定 while (1) { PWM.pulsewidth_us(500); //パルス幅変更 wait(1); PWM.pulsewidth_us(1450); wait(1); PWM.pulsewidth_us(500); wait(1); PWM.pulsewidth_us(2400); wait(1); } }
PWMで制御する一般的なサーボモータは周期を20msに設定し、パルス幅(0.5→2.4ms)とサーボモータの角度(0度→180度)に一次関数的な関係があるので、上記のコードは0度→90度→0度→180度を繰り返します。