サーボを使う
サーボモータには,ギアやセンサー,制御回路などが組み込まれていて,マイコンから指定した角度に回転します.
サーボの使い方
詳しい説明は後日.
サーボはPWMで制御します.周期は16~20ms.Hになっている時間が1~2msくらい.
回路
サーボからはオレンジ,赤,茶,の三本の線が出ていると思います.
- 茶 GND
- 赤 Vcc(電源)
- 橙 制御用PWM
今回の基盤上では下方(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の範囲で動かしてください.今回のサーボは,それ以上は回りません.
この文書の履歴
- 2006-07-13 作成
- 2006-08-05 解説を少し追加・サンプル修正
Copyright © binzume all rights reserved.