FutabaサーボをRaspberry Piにつなぐ

Raspberry Pi

今回はお約束のサーボをつなぐ回路です。

RPiのCPU周りの電源は、3.3V系です。
しかし、Futabaのサーボシリーズの電源は5V系です。
RPiへの入力は、本来なら、5Vと3.3Vを信号レベルで変換しないとなりません。

3.3Vのピンに5Vを入れてもいいピンのことを5Vトレラントと言ったりします。

Futabaのロボットサーボシリーズは、双方向通信のため、RX,TXを取ろうとすると、RX側は5V→3.3V、TX側は3.3V→5Vとなります。
基本操作として、3.3Vを5Vを使えるようにするためにはレベルコンバータというICを使います。
ただ、1本の信号線をどうやってトレラントにするのか、ちょっと悩み中です。

とはいえ、サーボ側は3.3Vでも信号をとってくれるので、今回はサーボを動かすだけにして、コンバータICを使わずにやってみましょう。

回路図としては次のとおりです。
TxをRS303MRのコネクタの白線につなぎ(図の青線)、GNDを黒につないでください。
また、7.4V電源の+をRS303MRの赤線に接続、-を黒につないでください。
この電源の-とRPiのGNDをつなぐことは、グランドレベルを合わせると言って、信号線のON/OFFをはっきりさせる上でとても大事です。
デジタル信号の0、1は電圧差で決まります。
ここでグランドレベルがあっていないと、信号線の電圧がどこを基準にしたらいいかわからず不安定になってしまいます。
そのためにも必ず黒はRPi、サーボ、外部電源の3つをつないでください。

20130911Servo

FutabaサーボとRPiをつなぐのはブレッドボード用のコンタクトピンを使ってもよいでしょう。

さて、準備ができたところで、楽しいプログラミングのお時間です。
まずは例によって、チェックサムモジュールを作ります。
ここはもうお約束のようにアルゴリズムは一緒です。

//Check sum generate
char get_check_sum(char *com, int buf_size)
{
    char check_sum;
    int i;
 
    check_sum = com[2];
	
    for (i = 3; i < buf_size - 1; i++)
    {
        check_sum = (char)(check_sum ^ com[i]);
    }
    return check_sum;
}

次は、トルクをオン/オフするモジュールを作ります。

#define ON 1
#define OFF 0
//Torque on
Void servo_torque_set(int fd, int servo_id, int mode)
{
    	int i;
	char com[9];
    	i = 0;


	com[i++] = (char)0xFA; 			//Header
	com[i++] = (char)0xAF; 			//Header
	com[i++] = (char)servo_id; 		//ID
	com[i++] = (char)0;	  			//Flag 
	com[i++] = (char)0x24; 			//Torque map address
	com[i++] = (char)0x01; 			//length
	com[i++] = (char)0x01; 			//count

	//Torque on
	if(mode == ON)
	{
     	   	com[i++] = (char)0x01; 
	}
	else // OFF
	{ 
		com[i++] = (char)0; 
	}

	com[i++] = get_check_sum(com, i+1);

	if(com !=NULL)	
	{
		write(fd, com, sizeof(com)*9);      /* デバイスへコマンド書き込み */
	}
}

さらにサーボを動かすモジュールを作ります。

//target degree set and move
void move_target_degree(int fd, int servo_id, float degree)
{
	char com[10];
	char l_bit;
	char h_bit;
	int target; // target degree

    //data calculation
    target =(int)degree*10;
    h_bit = (char)((target & 0xFF00) >> 8);
    l_bit = (char)(target & 0xFF);

	// packet set 
    com[0] = 0xFA; //Header
    com[1] = 0xAF; //Header
    com[2] = (char)servo_id; //ID
    com[3] = 0x00; //Flag
    com[4] = 0x1E; //map address
    com[5] = 0x02; //length
    com[6] = 0x01; //count
    com[7] = l_bit; //data lower
    com[8] = h_bit; //data higher
    com[9] = get_check_sum(com, 10);

if(fd){
	write(fd, com, sizeof(com)*10);
    }
}

これでfutabaサーボを動かすモジュールができました。
来週は、いよいよサーボを動かします。

RS303MR-H1
RS303MR-H1購入ページへ

RS303MR-FF購入ページへ

RS303MR用バッテリー購入ページへ

タイトルとURLをコピーしました