今回はお約束のサーボをつなぐ回路です。
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つをつないでください。
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-FF購入ページへ |
RS303MR用バッテリー購入ページへ |