PICで学ぶサーボモータ制御方法

「PICで学ぶサーボモータ制御方法」の編集履歴(バックアップ)一覧に戻る
PICで学ぶサーボモータ制御方法」を以下のとおり復元します。
RCサーボモータをPICで動かして見る企画

色々マイコンとか示されてるけど実際どうなのっていうのを書いていければな、とか思っています。
某酔っ払いはPIC使いなのでPICを例に書こうかなと。

今日はちょっと酔っ払いすぎているので、詳しくはまた今度になりそうですがH8やらAVRやらARMやらの使い手が居たら、そっちのマイコンではどうなるか書いてくれるとうれしいです。

とりあえずハードの用意とソースコード提示ぐらいかな。
ソフトのインストールなどは面倒なので書きません。



スレで張るって言って張っていない俺がいました、ごめんなさい。
(2012/04/07)

使用しているコンパイラはCCS-CのPCB(ベースライン用)
今やMPLABにひっそりと添付されているCCS社製の優秀なコンパイラです。
(サードパーティフォルダ内ccsc.exeをccscのコンパイラパスに指定してあげればよかったはず。)

ただしこのコンパイラはバグのタチの悪さやコード記述の癖が強いといわれています。その分UARTやI2Cはソフト処理、ハード処理問わず自動で書いてくれるのが強みです。
(実際一行入れ替えただけでエラー吐いてコンパイラ不能とかあります)
本来、国内で買うと9800円ぐらいするこのコンパイラを使って、とりあえずサーボモータ動かしましたのでその内容を記述します。
main.cでも何でも名前をつけてプロジェクトに関連つけてコンパイルすれば動くと思いますが、もし動かなかったらスレでご連絡を。

ここからコード

#include <16F57.h>
#Fuses XT,NOWDT,NOPROTECT	//8MHz以下のクリスタル、WDTなし、コードプロテクトなし
#use delay(clock=2500000)	//2.5MHz指定、2.5MHzとか書いてもダメかも。(このPICは確実に発信器必須です、クリスタルでもセラロックでもいいので付けてください。周波数はそれに合わせて記述すること、一応これ以上なら数MHzでも動くはずです。)

void main()
{
static int i;
SET_TRIS_A( 0b00000000 );
i=0;
	while(TRUE){

		if(i<=50){
			output_high(PIN_A2);	//1
			delay_us(10);
			output_high(PIN_A3);
			delay_ms(1);
			output_low(PIN_A2);
			delay_us(10);
			output_low(PIN_A3);
			delay_ms(18);
			i = i + 1;
		}
		
		else if(i>50 && i<=100){
			output_high(PIN_A2);	//2
			delay_us(10);
			output_high(PIN_A3);
			delay_us(1200);
			output_low(PIN_A2);
			delay_us(10);
			output_low(PIN_A3);
			delay_us(17800);
			i = i + 1;
		}

		else if(i>100 && i<=150){
			output_high(PIN_A2);	//3
			delay_us(10);
			output_high(PIN_A3);
			delay_us(1400);
			output_low(PIN_A2);
			delay_us(10);
			output_low(PIN_A3);
			delay_us(17600);
			i = i + 1;
		}

		else{
			i=0;
		}
	}
}
ここまでコード(このコードを示す文字は抜いてください)

とりあえずは無駄に(秋月ではサイズが大きい)16F57、直打ちコードですが出力ピンに470オームを接続して、それなりに3ピンヘッダを作ると無事サーボ(フタバのRS304MD)は動いてくれました。
(この辺はサーボのデータと他の作例をネットで見てください、シグナルピン以外は電源とGND直ですけど、電源系を逆接するとたぶんサーボが死にます。)
200usの動きは思った以上に大きいのか、結構首振りしていました。

注1:
xx.xxみたいな小数点指定はむりのようなので、細かい間隔指定はdelay_msではなくdelay_usで、クロックは長くなってもいいのでHz指定でという風に気をつけたほうがいいです。
これに気が付かず、結構時間食いました。
なお、1,2,3とコメントをつけたそれぞれのコードで位置が変化するという形です。
よく分からなければ色んなサイトにあるサーボモータへのシグナルの与え方のアニメーションでも見てください。
それぞれただ単にHIとLOWの時間を指定しているだけですので読み解けば分かるかと…。
と思うのですがどうでしょう。

注2:
…ソース見てここから、からここまでの文字の間をソースファイルに移してください。
頭のinclude文が消えてたりwikiのシステムよく分かりません、ごめんなさい。
とりあえず上げとくなっ。

復元してよろしいですか?

ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。