コマンド方式サーボKRS-6003HVの制御 その3

概要

前回コマンド方式サーボKRS-6003HVの制御 その2に続いてメモ3つ目。今回はmbedではなくPICで制御するように変更しました。

PICへ変更と言っても単なるシリアル通信のためそんなに難しいことはありません。プログラムはmikroCを使いC言語で記述しました。しかしmikroCのライブラリだけではパリティビット付きの9bitのシリアル通信が利用できないため、インラインアセンブラを使って手動での設定を行っています。

ハードウェア

PICにはPIC16F88を使用、20MHzのセラロックで動作させています。
回路はTXピンに1kΩの抵抗を介してサーボの信号線へ、RXは10kΩの抵抗でプルアップし何も繋いでいません。TXピンの抵抗をはじめ10kΩにしていたところ全く動作せず、出力波形を見てみると振幅が異常に小さくなっており上手く伝送できていませんでした。そこで1kΩに変更したところ0〜5Vまでしっかり振れるようになり正常に伝送できるようになりました。

プログラム

void main() {
	ANSEL = 0x00;

	// initialization
	UART1_Init(115200);
	Delay_ms(100);
	asm {
	    bsf status, rp0
	    bsf TXSTA, TX9
	    bcf status, rp0
	}
	
	// data send
	UART1_Write(0x82);	// byte 1
	UART1_Write(0x3A);	// byte 2
	asm {			// byte 3
		bsf status, rp0
		bsf TXSTA, TX9D
		bcf status, rp0
	}
	UART1_Write(0x4C);
	
	while(1);
}

この動作はコマンド方式サーボKRS-6003HVの制御 その1でmbed向けに作ったプログラムをPIC用に移植したものです。動作としてはサーボをニュートラル位置(7500)に移動させますが、前述の記事のプログラムと違ってサーボからの信号の受信を省略しています。

プログラム詳細

mikroCではasm{〜}でインラインアセンブラで記述ができます。6〜10行目でTXSTAのあるバンク1へ移動、送信の9bit目を有効にするTXSTAのTX9のビットを1にしバンクを0に戻すという動作をアセンブリ言語で追加しました。
また、0x82と0x3Aのパリティビット(偶数)は0のため問題ありませんが、0x4Cだけはパリティビットを1にする必要があるため、14行目以降にインラインアセンブラで記述しています。9bit目のデータはバンク1のTXSTAのTX9Dに割り当てられています。今回は送るデータが予め分かっているため手動でパリティビットの設定を行いましたが、今後は自動的に付加するような処理を加える必要がありそうです。


以下は0x82の実際の送信時の波形です。

fig1:波形

まとめ

PICでもコマンド方式サーボKRS-6003HVに対してコマンドを送ることができました。今後はPICを用いてコントローラとの連携やフェイルセーフ機能の追加などを行っていきます。