SG90サーボモータ-モドキを制御する

ebayサーボモーターが安かったので一つ買ってみました.
SG90を自称していますが検品シールなどないのでニセモノです.というかセラーのサイトによると3V駆動もできるらしいです(マジか
いつもはチェックなどせずに工作箱に投げ込む自分ですが流石に今回はテストする気になりました.

今回使うのはmbed LPC1114 と 適当なN MOSFET, 外部5V電源です.
SG90のデータシートによると電源もPWM信号も5Vである必要があるので,mbedのPWM端子をN MOSに繋いでPWM信号の電圧を5Vにします.

以下のプログラムではシリアル通信で'+'を送るとパルス幅を増加,'-'を送ると減少します.
サーボのパルス幅制限を無視して上げ続けると多分ストッパーか何かが壊れます.(サーボ一つしか持ってないので未検証)

#include "mbed.h"

/*
パルス幅制限注意
SG90モドキ 0.5~1.45~2.4 [ms]
MOSFET駆動で論理反転するためパルス幅は周期から目標幅を引いてある
mbedに直結しないこと!
*/

PwmOut servo(dp24);
Serial pc(USBTX, USBRX); // tx, rx

char op;
float pulsew = 0.00145;
float unit = 0.0001;
float period = 0.020;

int main() {
    servo.period(period);
    servo.pulsewidth(period-pulsew);
    
    pc.printf("hello\n");
    pc.printf("%f\n", pulsew*1000);
    while(1) {
        if(pc.readable() ){
            op = pc.getc();
            pc.putc(op);
            
            if(op == '+'){
                pulsew += unit;
            }
            else if(op == '-'){
                pulsew -= unit;
            }
            pc.printf("%f\n", pulsew*1000);
            servo.pulsewidth(period-pulsew);
        }
        
        wait(0.01);
    }
}

やっとSG90モドキの動作検証ですが,バッチリ180度動いてくれました.3.3V駆動の検証もしましたがこちらはダメでした.一応動くには動くんですがかなり遅れたり,トルク不足感がありますこれは実用できないと思います.
しかし,今回は安いサーボが欲しかっただけなので必要十分です. また,mbedはLチカ以来でしたがこういう機能が簡単に使えるのは便利ですね.
最初はmbedのSG90ライブラリーを使わせてもらおうと思ったのですがC++がわからず断念.自分で書くことになりました.最初のプログラムとしては良い題材だったと思います.
C++わかるとすごく便利っぽいのでいつかやらないとと思いつつ... いつやろうかな...