はじめに
ここでは、PCからAGB65SSC/Pを駆動してシリアルサーボを動かす方法について説明します。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。
※以下の情報は2009年11月現在のものです。ご注意ください。
AGB65-SSC/Pついてはこちらを参照願います。
プログラムについて
とりあえずSSC/Pにたいする命令の送信と、命令の受け取り方を簡単に書いたプログラムを作りました。プログラムはこちらです。VisualC#2008のプロジェクトをまるごと圧縮してます。
AGB65-SSC-Ptest.lzh
右クリックで対象を保存し、解凍してください。
基本的にこのような操作で全ての命令が使えますので、このソースを参考にオリジナルを作ってみてください。尚、SSC/Pのほとんどの機能が使えるサンプルプログラムもあります。RemoMortionEditorというものです。そちらも参考してみてください(ソースが長いので、とりあえずこちらを見てからにすると分かりやすい)。
シリアルポートの設定
VisualC#2008を含む、VisualStudio2008の標準ライブラリには、シリアル通信を簡単に行うことができるSerialPortコンポーネントがあります。WidowsのFormでプロジェクトを作り、フォームにコンポーネントを貼り付けるだけで実装できます。
上のソフトのプログラム部はForm1に入っています。そこのコンストラクタ部で設定を行っています。
行21:COMポートの番号を設定しています。SSC/Pと接続しているポート番号を確認してその番号を設定してください。デスクトップのCOMポートなどの場合は大抵COM1です。上の例ではBluetooth無線と接続したSSC/Pの例で、無線をペアリングしたときにCOM47を割り当てられたのでその番号を指定しています。
行22:通信する速度を設定しています。上の例ではロボットキットRemoHKPとの接続の例で、通信速度は460800になっています。普通のPCやマイコンと有線接続している場合は460800も出ない場合が多いので、接続している先の通信速度と合わせて115200又は9600bpsに設定してください。
行23:ここでCOMポートをオープンしています。オープンした後はそのSerialPortコンポーネントの機能を使って通信ができるようになります。ここではサンプルプログラムとして簡単に書いているのでエラーチェックなどは入れていません。RemoMortionEditorの方は若干エラーチェックを入れていますので、実用的なソフトを書く場合はそちらも参照ねがいます。
EXEC系命令の送信
SSC/Pはピルクス系シリアルサーボを駆動できます。ピルクス系シリアルサーボは大きく
EXEC系命令
1バイト系命令
2バイト系命令
にわけられます。EXEC系命令はサーボのON/OFF、サーボIDの変更、リバースチェンジなどがあります。
シリアルサーボは電源を入れても、サーボON命令を受けるまではモータを動かしません。よってまず初めにサーボをONにします。
サーボONのコマンドは命令1になります。SSC/Pのページの表を見ると、送信フォーマットは
[255] [ID(129-130)] [LEN(2)] [CMD(1)] [sID]
になります。この5バイトを送信するとsIDで設定された番号のサーボがONになります。 では実際にデータを送信するところを説明します。
SerialPortコンポーネントはWriteメソッドを使ってデータを送信します。行36のところです。このメソッドにはバイトサイズの配列データを渡し、配列の開始位置と長さを指定します。詳しくは書籍やMSDNのサイトを参照願います。
行28〜33で送信するバイトサイズのデータ配列を作っています。
行34,35はPCのCOMポートのバッファをクリアしています。この程度のプログラムではバッファクリアしなくても問題ありませんが、複雑なプログラムを組んでいるとバッファクリアの必要があるので一応のせました。
ONボタンを押すと、このイベントが実行されます。
同じように、サーボOFFは命令2なので、上のプログラムの命令部分を書き換えるとサーボOFF命令になります。
2バイト系書き込み命令
2バイト系には、なにかの値を2バイトで設定する書き込み命令と、何かの値を2バイトで読み取る命令があります。まずは書き込みの方から。
1バイトでは0〜255までしか数値を表現できないので、0〜1800まで指定できるサーボ位置などは2バイトで値を指定します。2バイト系書き込みには他に、デッドバンドを設定する、ポジションリミットを設定する、などがあります。
実際のプログラムは次のようになります。
これはボタンを押すとテキストボックスで指定した場所にサーボが移動するプログラムです。単に命令16を送っているだけなので簡単です。位置は2バイトで表します。
行55:テキストボックスの文字を数値に変換してtemp変数に入れています。temp変数はintで宣言しているので32ビット長になります。
行56:tempのビット8−15を抜き出しています。これが送信するデータの上位バイトになります。
行57:tempのビット0−7を抜き出しています。これがデータの下位バイトになります。
その他はEXEC命令のところと同じです。
2バイト系読み込み命令
読み込みの場合は次のようになります。これはサーボ位置を読み取る命令です。位置データも2バイト必要です。
〜行82までは今までと同じで、単に命令を送っているだけですので割愛します。
返信フォーマットは、SSC/Pの命令一覧の表を見ると
[255] [ID(129-130)] [LEN(4)] [CMD(17)] [sID] [PosH] [PosL]
のようになっています。正常に返信された場合は[255]を先頭に7バイトのデータが帰ってきます。よって、行83ではSerialPortコンポーネントのByteToRead(リードバッファに入っているデータ数)プロパティの値をチェックして7バイト来るまで待っています。この部分ですが、なんらかの通信エラーなどで7バイト以下しか値が帰ってこなかった場合はフリーズしますので上手いやり方ではありません。実用的なプログラミングについてはRemoMortionEditorを参照してみてください(こちらも完全ではありませ)。
行84でデータを受け取っています。結果はあらかじめ用意しておいた、バイトサイズの配列rbufに格納されます。
返信フォーマットを見ると、最後の2つに値が格納されていますので、この2バイトを合成して結果値を得ます。それが行87のところです。
行88で結果を文字になおして、テキストボックスに表示させています。
プログラムを動作させてみる
F5キーを押してプログラムを動作させます。
今回の例ではBluetooth無線経由で接続しています(実際にはRemoHKPを動かした)。シリアルポートのオープンはコンストラクタ(プログラム起動時に実行される)内で記述していますので、F5でプログラムを起動すると接続が完了するまでウィンドウが開きません。環境にもよりますが、大体1〜3秒待つと下の画面が出ます。
尚、有線接続の場合は瞬時にオープンされますので下の画面も瞬時に出ます。
各ボタンをクリックするとは上で説明したイベントが実行されます。「ON」ボタンを押すとServoID横のテキストボックスで指定したサーボIDのサーボがONになります。
とりあえずサーボ#1を1200に指定して動かせ、位置を読み取ってみました。デッドバンドがあるので指定した位置と同じ値は読み取れませんでしたが大体同じです。
2009年11月28日
|