サーボを使う

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

サーボの使い方

詳しい説明は後日.

サーボは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.