サーボモータ制御

サーボモータ(SG90)を制御するプログラムをエイヤッと書いてみた.マイコンは秋月で45円のPIC10F222.

写真は実験中のブレッドボード.タクティルスイッチは黄,白,赤の順に0,90,リセットのボタン.

最初クロック周波数を4000000と書いて動かしてみたら,パルス周期・パルス幅とも所定の値より一定割合で大きくなったので, その割合の逆数をXTAL_FREQのデフォルト値(PIC10F222の場合4000000)に乗じて調整した(本当はOSCCALを設定してクロックを本当に4MHzにもっていくのが正解なんだけど).

ポジション0の波形 ポジション90の波形

左の波形は電源投入直後,黄色スイッチを押した時,リセットを押した時のもの.右側が白スイッチを押した時の波形.

プログラムの主要部はこんな感じ:

servo = 0; // ポジション0
while(1){
    if(GP1 && (!GP0)){ // 白ボタンを押した
        servo = 1; // ポジション90
    };
    if((!GP1) && GP0){ // 黄ボタンを押した
        servo = 0; // ポジション0
    };
    if(servo){
        GP2 = 1;
        __delay_us(2400);
        GP2 = 0;
        __delay_us(17600);
    }
    else{
        GP2 = 1;
        __delay_us(1450);
        GP2 = 0;
        __delay_us(18550);
    };
};

パルス周期がクロックに比べて十分長いので,これで十分だと思う.実際にサーボモータが来たら,繋いで動作確認してみよう.