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) でググりましょう。

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度を繰り返します。

koke688.hatenablog.com