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


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

RCサーボモータをPICで動かして見る企画

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

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

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



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

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

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

ハードに関して
PIC16F57(秋月でも買えます、ただしサイズが…)
セラロック、推奨振動子、その他クロック源(今回は2.5MHzのジャンクセラロック@4.5円)
/MCLR用の10k抵抗(精度は不問)
配線用線材
ピンヘッダ(一般的なQIコネクタに刺さる2.54mmピッチのもの、結果3ピン×サーボ数になる様に組み合わせる)
(固定のための基板、電源、電源コネクタ、その他ヒューズ、収縮チューブ等も必要に応じてどうぞ)

ここからコード

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

注2:
…ソース見てここから、からここまでの文字の間をソースファイルに移してください。
頭のinclude文が消えてたりwikiのシステムよく分かりません、ごめんなさい。
とりあえず上げとくなっ。
↑行頭に半角スペースを追加すると整形済みテキストになります。見にくかったら戻します…。
ツールボックス

下から選んでください:

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