ATtiny13Aでラジコン用サーボを動かす

ATtiny13Aを使ってラジコン用サーボを動かしてみた。
使用したデジタルサーボの仕様は1520μs/333Hzとなっていて、プロポから送信される各チャンネルへの送出周期よりずっと短い。
サーボの動作が本当に追従するのか試してみた。

パルスの幅は600μs~2400μsとし、パルスの周期は333Hzで時間は3ms(3000μs)である。
タクトスイッチによってパルスの幅を変えられるようにしてみた。ソースコードは次のとおり。

#define F_CPU 9600000UL

#include <avr/io.h>
#include <util/delay.h>

#define cls_bit(reg,bit)	reg &= ~(1<<bit)	// ビットクリア
#define set_bit(reg,bit)	reg |=  (1<<bit)	// ビットセット

int main(void)
{
	// ポート設定
	//        76543210
	DDRB  = 0b00001001;	// PB0:Buzzer(出力) PB1,PB2:Button(入力)
	PORTB = 0b00000110;	// PB1,PB2:プルアップ

	int sw;
	int pulse=150;
	while (1)
	{
		sw=0;
		if ( bit_is_clear(PINB,PB1) ){
			sw=1;
		}

		if ( bit_is_clear(PINB,PB2) ){
			sw=-1;
		}
		pulse = pulse+sw;
		if (pulse>240) pulse=240;
		if (pulse<60) pulse=60;

		set_bit(PORTB,PORTB3);
		for(int i=0;i<pulse;i++){
			_delay_us(8.5);
		}
		cls_bit(PORTB,PORTB3);
		for(int j=0;j<300-pulse;j++){
			_delay_us(8.5);
		}
	}
}

信号を計測した結果は次のとおり。

 パルス幅 600μs  パルス幅 1500μs  パルス幅 2400μs

タクトスイッチで変化するパルス幅に合わせ、サーボが動作することを確かめた。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする