inはじめにソフト編では、ICSコマンドをマイコンからサーボモーターに送るためのC言語のプログラムについて説明します。())ができあがっていることにします。この2つの関数を元にして、シリアルサーボモーターのコマンドの仕組みと通信プログラムの作り方について説明します。ポジション設定コマンドだけ扱いますので、他のコマンドについてはこれを参考にして作成してみてください。プログラムは弊社製マイコンボード、KCB-1に付属しているSDK準拠で作成します。KCB-1ではICSコマンドはほとんど関数化されていますので、簡単にシリアルサーボモーターの制御ができます。KCB-1の詳しい情報についてはこちらをご覧ください。ポジションコマンドの作成ここではポジション設定コマンドを実行する関数としてset_posというC言語関数を作ってみます。必要なデータをまとめるまずICSの規格に沿って、ポジションコマンドを作成しましょう。ポジションコマンドの基本命令は次のようになっています。ICS編」で確認してください。POS_LCMD=メインコマンド0b100XXXXXとID=0b000XXXXXを合わせたものです。この2つのデータを1バイトに合わせるには、論理和(C言語では「|」と書く)を使います。POS_Hは3500~11500で指定できるポジションデータの上位7ビットで、POS_Lは下位7ビットデータです。関数の引数と返値を決定するset_pos関数に必要なデータは、ID番号とポジションデータです。char型で指定します。ポジションデータ範囲は3500~11500ですので、int型で指定します。ポジションコマンドを送ると、現在位置データが返ってきますので、この関数の返値は現在位置データとします。関数の基本構造は次のようになります。ここから中身を記述していきます。これから関数の中身を記述}送信コマンドを作成する送信コマンドを作成するには3バイトのデータが必要です。char型の3バイト配列「tx」として宣言します。送信するポジションデータの変数名(仮引数名)をposとします。0x7F);}CMDを作成するには、0x80=0b10000000でID番号idと論理和を取ることにより(この場合は単に足し合わせてかまいません)、CMD=0x100XXXXX(XはID番号)ができあがります。実際はid番号が0以上31以下であることを確認してからコマンドを作成した方がよいのですが、ここでは割愛しています。6行のtx[1]はPOS_Hです。引数のposの下位7ビットを捨てるため、右向きに7ビットシフトしています。データを7ビットに限定するために、0x7F(0b01111111)で下位7ビットのみ論理積で取り出しています。tx[2]はPOS_Lですので、下位7ビットのみ論理積で取り出しています。tx[]に型変換(キャスト)してから代入しています。これで送信コマンドは完成です。コマンドを送信して、返値を受け取る上記でできたコマンドを3バイト繰り返して送信します。その後すぐにサーボモーターから返ってくる3バイトのデータを受け取ります。モーターからの返値を受け取り、rxに代入する}}マイコンのクロック数やサーボモーターの種類によっては、送信後にサーボモーターからデータが返ってくるまで少しタイミングをおいた方がよい場合がありますので注意してください。この例ではマイコンとのデータ通信を想定していますので、受け取るデータは3バイトになりますが、PCで同じような関数を作成した場合は6バイト受け取るようにしてください(詳しくは次回)。サーボから返ってきたデータから現在値を取り出す最後にサーボから受け取ったデータから現在位置に変換します。dat;}16ビットマイコンのCコンパイラでは計算時に32ビット拡張を行わないものがあります。そのような場合8ビットデータを7ビットシフトした時点で8ビット以上の桁は全て0となってしまいますので、上記プログラムのように2段階に分けて、いったんint型変数に代入してからシフト演算をした方がよいでしょう。計算結果はreturn命令で呼び出し元へ返します。これで関数の完成です。set_pos関数を使うときには下のプログラムはID番号が0~8までのシリアルサーボモーターをデイジーチェーン接続して、5000と10000のポジションを10往復する例です。細かい説明はしませんが、参考にしてください。set_pos関数を繰り返して使う場合は、繰り返し間隔を適当に空ける必要があります。r_pos);}}}次回は次回はいよいよPCからサーボモーターを動かすプログラムをつくります。USBアダプターHSが必要です。準備してお待ちください。注意ICS通信は半二重通信ですので、送信・受信のどちらかしか有効にならないようなプログラムを作成する必要があります。マイコンプログラミングでは、送信前に必ず受信禁止状態にしてください。送信後はすぐに受信可能状態に戻すようにしてください。受信コマンド(getchar)では、仮に何らかのエラーでICSデバイスから返事が来なかったり、またはデータを受け取り損ねたりした場合の処理が必要となります。できれば受信時に適当なカウンター変数を用意して、ある程度カウントしてもデータが来なかった場合には受信エラー処理を行う用に作成すると、受信に失敗した時点でプログラム全体が停止してしまうのを防ぐことができます。