サーボを使う

サーボモータには,ギアやセンサー,制御回路などが組み込まれていて,マイコンから指定した角度に回転します.

サーボの使い方

詳しい説明は後日.

サーボはPWMで制御します.周期は16~20ms.Hになっている時間が1~2msくらい.

回路

サーボからはオレンジ,赤,茶,の三本の線が出ていると思います.

今回の基盤上では下方(AVRから遠い側)がGNDです.

プログラム例

ボタンを押すと,少しずつ回転します.

servo_test.c

////////////////////////////////////////////////////////////////////////////
//    サーボ サンプル
//
#include <avr/io.h>

#define SERVO_POS  OCR1B
#define SERVO_MIN  16 // 最小値
#define SERVO_MAX  37 // 最大値

// 指定された時間だけ待つ
void wait(uint16_t w){
    while(w--){
        volatile uint16_t i=200;
        while(i--);
    }
}

void servo_init(void){
    //サーボ設定
    TCNT1 = 0; // タイマカウンタ初期化
    OCR1B = 0; // おかしな位置に回転しないように
    TCCR1A = (1<<COM1B1);
    TCCR1B = (1<<CS12) | (1<<WGM13);
    ICR1 = 0x0110;
}

int main()
{
    int pos = SERVO_MIN; // 初期位置
    DDRB = 0xFF; // モータ
    DDRC = 0x00; // ボタン
    DDRD = 0xFF; // モータ,LED
    PORTC |= 3; // プルアップON

    servo_init();
    SERVO_POS = pos; // 初期位置に移動

    for(;;) {
        wait(100);
        if ((PINC&1)==0) {
            if (pos < SERVO_MAX) pos++;
            SERVO_POS = pos;
        }
        if ((PINC&2)==0) {
            if (pos > SERVO_MIN) pos--;
            SERVO_POS = pos;
        }
    }

}

解説

OCR1Bを変化させてサーボ用のPWMのデューティ比を変化させています.OCR1Bは使いやすいように,SERVO_POSという名前でdefineしています.

SERVO_POSに値を代入すると,それに応じた角度にサーボが回転します.SERVO_MINからSERVO_MAXの範囲で動かしてください.今回のサーボは,それ以上は回りません.

この文書の履歴

Copyright © binzume all rights reserved.