二足歩行ロボットコミュニティサイト

【サイトの使い方】  【サイトマップ】  【お問い合わせ】 
ロボット動画  |   ロボット写真  |   BBS  |   ダウンロード  |   イベント予定  |   スタッフ日記  |   リンク  |  
ログイン パスワード    新規登録   パスワード紛失  

 

第10回 ロボットをシリアル通信で動かす(前編)

 ネタ切れという1年以上の冬眠から覚め、久方ぶりに戻ってまいりました。今回は2010年2月に満を持して(?)公開された、シリアル通信対応の新ファーム・RobovieMaker2について解説していきたいと思います。また、次回は合わせてBluetoothなど外部の無線シリアルデバイスを利用した通信について説明したいと思います。

 シリアル通信で制御できれば、CPUボードを自作プログラムでより自由に動かしやすくなります。これまでCPUボードを自作プログラムから動かす場合は、VS-RC003SDKを使う必要がありました。VS-RC003SDKはWindows専用なので開発環境が制限されましたが、シリアル通信で制御する場合、使用するハード・OSがシリアル通信に対応していれば、Linuxやマイコンなどからでも制御できます。
 そして何より、市販のシリアル通信対応のBluetoothや赤外線デバイスなどを使って、簡単にゲームパッド以外の無線操縦が実現できる利点があります。
>もっとも、VS-RC003SDKにも、USBやシリアル通信に関する知識がなくとも通信が非常に簡単にでき、RobovieMakerのモーションデータも楽に取り扱えるという大きな魅力があります。

 ちなみに、CPUボードのシリアル通信は、標準のUSBポートではなく、別の端子から行ないます。具体的には、ゲームコントローラ端子、もしくは拡張基板端子のどちらかを選択して使用します。そのため、シリアル通信を行う場合は、これらのいずれかのポートが使えなくなります。
 多くの場合はゲームコントローラ端子を使うので、この講座でもゲームコントローラ端子を使って説明したいと思います。

 参考までに、シリアル通信自体の機能は両者のポートで違いはないため、ロボットの動作上使用しなくても問題ない端子、または現在使用していない方を選んでください。また、今回と同じ内容をまとめた資料もサポートページからダウンロードできます。この資料も交えて今回の内容を読み進めると、より分りやすいと思います。

●VS-RC003シリアル通信資料

まずはソフトの更新から

 シリアル通信を行なうためには、CPUボードのファームウェアとRobovieMaker2をアップデートする必要があります。最新版のRobovieMaker2とファームウェアは、おなじみのCPUボードサポートページからダウンロードできます。サポートページは最近見やすくなったと思うので、ぜひ有効に活用してください。

 ファームウェアはリビジョン13から、RobovieMaker2はRelease9から、それぞれシリアル通信に対応しています。とりあえず現在の最新版をダウンロードすれば問題ありません。
 ちなみに、ファームウェアは、メッセージの受信不良などを対策しているリビジョン14以降をなるべくお使いください。

 ファームウェアの更新方法は、こちらをご参照ください。

RobovieMaker2から設定を変更

 次にCPUボードの設定をRobovieMaker2から変更します。実は今回の内容では、RobovieMaker2を使うのはほぼここだけだったりします。

 CPUボードとPCを接続して通信を開始したら、メニューから「プロジェクトの設定」→「CPUの設定...」をクリックしてください。クリックすると、開いたダイアログの下に「シリアル設定」という新しい項目が増えているのがわかります。


 中には二つの設定項目があり、最初は両方とも「なし(標準)」に設定されています。
CN6はゲームコントローラ端子、CN7は拡張基板接続端子を、それぞれシリアル通信端子に変更します。冒頭にも説明した通り、シリアル通信端子として使用したいポートのみ、「コマンドポート」に設定してください。注意として、両方とも「コマンドポート」に設定しないでください(ソフトウェアの仕様上設定はできませんが)。

 ちなみに「V-SERVOプロトコル」は、シリアルサーボ「V-SERVO」を使うための設定です。これについては、また機会があれば説明したいとおもいます。
 設定を変更したら、いつものようにCPUボードへデータの書き込みを行い、設定をCPUボードに書き込んでください。

とにかくつなぐべし

 ここまででソフトウェアの設定が完了したので、今度は実際にPCとCPUボードをつなぎます。
 最初に説明したとおり、シリアル通信の場合のPCとの接続は、USBポートではなくゲームコントローラ端子などになるため、通常であればPC側にシリアルポートが必要になったり接続ケーブルを作成するなどの手間がかかりますが、これらの問題を簡単に解決する拡張ボードとして「VS-IX003」(\7,350)が発売されています。


 こちらの「VS-IX003」は、CPUボードのシリアル端子をPCのUSBポートと接続するための拡張ボードです。これさえあれば、USB端子を備えたPCを用意するだけでCPUボードとシリアル通信できるようになります。

 VS-IX003とCPUボードの接続は、付属のフラットケーブルを使用します。
 フラットケーブルの作成については、以前の「第16回 LED拡張ボード「VS-IX004」を使う 」で紹介したので、詳しくはそちらを参照してください。圧着には万力、もしくはプライヤを使い、注意としては、10芯コネクタの「▲」印の側に茶色のケーブルが来るようにすることです。

 ケーブルを作成したら、下写真のようにCPUボードとVS-IX003をつなぎます。
 CPUボードとフラットケーブルの接続はゲームコントローラと同じ向き(ケーブルの▲印が基板の中心に近くなる方)です。VS-IX003とフラットケーブルの接続は、基板の接続端子にある「1」の数字とケーブルの▲印が近くなる向きです。


 また、忘れやすいことですが、基板上のディップスイッチを下記のように「1番だけON、後は全てOFF」に切り替えてください(オレンジのフィルムははがします)。


USBシリアルドライバのインストール

 続いてPCとVS-IX003との接続ですが、実際にケーブルをつなげる前にUSBシリアルドライバをインストールする必要があります。このドライバはBeautoChaserなどと同じものなので、既にそれらをPCから利用している場合は、ドライバをインストールしなくても使える場合があります。

 既にPCとVS-IX003を接続していたら、画面に「新しいハードウェアの検出ウィザード」と表示される場合がありますが、これが表示される場合はUSBシリアルドライバをインストールする必要があります(これが出なくてもインストールが必要な可能性もあります)。

 USBシリアルドライバは、こちらのサポートページからダウンロードしてインストールしてください。USBシリアルドライバは、Windows Vista以前とWindows 7以降でファイルが異なるので、お使いの環境に合わせて正しい方をダウンロードしてください。

 また、このUSBシリアルドライバは、インストール自体は一般的なソフトと同じく「次へ」や「同意」を選んでいけば完了しますが、その後のPCからデバイスを認識させてドライバを組み込むときに少し厄介な操作が必要になります。次にそれについて説明します。

 USBシリアルドライバをインストールしたら、PCとVS-IX003をCPUボードの通信ケーブルで接続してください。接続には通常のCPUボードと同じ通信USBケーブルを使用します。接続して「新しいハードウェアの検出ウィザード」が表示されたら、下の手順で認識作業を進めてください。

1.最初の画面で「次へ」をクリックしてください
2.次の画面で、「一覧または特定の場所からインストールする」をクリックして「次へ」をクリックしてください。
3.次の画面で、「次の場所を含める」をクリックして、更に「参照」をクリックしてください。
4.次の画面で、ドライバのファイルを探すフォルダを指定します。ここで画面に表示されているフォルダを「ローカルディスク(C:)」→「SiLabs」→「MCU」→「CP210x」→「Windows_2K_XP_S2K3(Windows7の場合はWindows_7)」の順番でクリックし、最後に「OK」をクリックしてください。
5.クリックすると一つ前の画面に再度戻ってくるので、今度は「次へ」をクリックしてください。

 あとは「次へ」「完了」等をクリックしていけばインストールは完了です。

シリアルポート番号(COM番号)の確認

 ドライバをインストールしたら、シリアルポート番号を確認します。シリアルポート番号は、CPUボードとのシリアル通信に必ず必要となる番号なので、ここで調べた番号は必ずメモしましょう。また、一度調べたシリアルポート番号は、使用するPCを変えたり、接続するUSBポートを変えた場合などに変更される場合があります。以前通信できたシリアルポート番号が使えなくなった場合は、改めて番号をかくにんしましょう。

 シリアルポート番号の確認も使用するOSによって異なるため、個別に説明します。

Windows2000,XPの場合

1.マウスカーソルを、デスクトップにある「マイコンピュータ」に合わせ右クリックします。クリックするとメニューを開くので、一番下の「プロパティ」をクリックします。

2.クリックすると「システムのプロパティ」という画面を開くので、画面上部の「ハードウェア」をクリックし、切り替わった画面にある「デバイスマネージャ」をクリックしてください。

3.一覧で並んだ項目より「ポート(COMとLPT)」を見つけてダブルクリックします。するとその下に詳細が表示されるので、その中から「Silicon Labs CP210x USB to UART Bridge(COM **)」という項目を探します。この項目の末尾「COM**」という部分がシリアルポート番号です。

Windows Vistaの場合

スタートメニューをクリックしてマウスカーソルを「マイコンピュータ」に合わせ右クリックします。クリックするとメニューを開くので、一番下の「プロパティ」をクリックします。クリックすると「システムとメンテナンス」という画面を開くので、左上の「デバイスマネージャ」をクリックします。

 あとはWindows2000,XPと同じです。

Windows 7の場合

 スタートメニューをクリックして「デバイスとプリンター」をクリックします。クリックして開いた画面より「未指定」の項目を確認して、「Silicon Labs CP210x USB to UART Bridge(COM **)」という項目を探します。この項目の末尾「COM**」という部分がシリアルポート番号です。

通信をしてみる

 それでは、いよいよCPUボードとシリアル通信をしてみましょう。
 テストで通信する場合は、Windowsに標準搭載されている「ハイパーターミナル」を使います。スタートメニューをクリックして「全てのプログラム」→「アクセサリ」→「通信」→「ハイパーターミナル」をクリックしてください。

 ハイパーターミナルを始めて立ち上げる人は、最初に「デフォルトの通信プログラムにするか」などを聞かれますが、全て「いいえ」「キャンセル」、もしくはそれらがなければ「OK」をクリックして、下図の画面を出してください。


 まず接続に使用する名前の入力を求められますが、ここは何でも問題ありません。'a'1文字でも問題ありません。名前を入力したら「OK」をクリックします。

 続いて「接続の設定」の画面では、「接続方法」だけを設定します。ここで、先ほど調べたシリアルポート番号を選んでください。


 続いて「ポートの設定」では、通信の詳細に関する設定を行ないます。VS-IX003で通信する場合は、必ず下図の通りに設定してください。


 全て設定が完了すると、下図の画面が表示さるので、キーボードから何か文字を打ち込んでください。文字を入力した瞬間CPUボードのオレンジのLEDが光り、打ち込んだ文字が画面に表示されたら、正しく通信できています。


 もし入力した文字が全て'#'になる場合は、一度エンターキーを押してみてください。それで直らない場合は、CPUボードのリセットボタンを押してください。

 '#'は、CPUボードが無効なメッセージを受信したときに返す文字で、改行コマンド(CR=\n)を送信するとメッセージが一旦クリアされて再度正常に通信できるようになります。ただ、ファームウェアのリビジョンが13の場合はこの機能がないため、なるべくファームウェアを14以上にしてお使いください。
 また、次に説明する命令を送信してCPUボードに実行させた場合も、'#'が1文字返ってきます。これは無効な文字などではないため、動作上まったく問題ありません。

通信メッセージの説明

 ここまでで通信ができるようになりましたが、正しいメッセージを送信しないとCPUボードを動かすことはできません。CPUボードの通信メッセージには、「指定の変数に数値を書き込む」及び「指定の変数から数値を読み込む」の二種類があります。これらはRobovieMaker2の演算ブロックや分岐ブロックと同じですね。

指定の変数の数値を読み込む場合

 指定の変数から数値を読み込む場合は、「r 読み込む変数番号 読み込むデータのサイズ」をそれぞれ入力してエンターキーを押します。このとき、「r」「読み込む変数番号」「読み込むデータのサイズ」の間には必ず空白を入れて、数値は16進数で表記します。また、読み込む変数番号は、必ず6桁で記述します(ちなみに、本項目ではこれから数値を16進数で表すときは、数字の先頭に「0x」をつけて記述します)。
 このコマンドを送信すると、指定した番号の変数から順番に、指定したデータサイズだけ数値を読み込んでPCに返します。

 それでは、とりあえず「モード切替スイッチの値」と「バッテリ電圧」を読み込んでみたいとおもいます。前述の操作でCPUボードと通信できるようにして、一度エンターキーを押してコマンドをリセットし、'r 2009dc 04'と入力してエンターキーを押してください。

 すると、'#2009dc 02 00 ad 15'というような文字列が返ってくると思います。各自の環境で数字が若干異なると思いますが、最初の#2009dcまでは同じ数字(これは数値を読み込む変数の番号です)、その次に現在のモード切替スイッチの番号、現在のバッテリ電圧が返ってきます。それぞれの数値は16進数で、変数番号は6桁、変数の数値は2桁区切りで合計4桁です。
 モード切替スイッチの番号を変えてもう一度同じコマンドを送信すると、ちゃんと返ってくる数値も変わっているはずです。

アドレスとエンディアンの話

 今打ち込んだメッセージの数値に、何か違和感を覚える人が多いと思います。例えば読み込み先の変数番号が明らかに大きすぎる番号です。実は、他にも送受信で使う数値は、色々とややこしい変換をしないとうまく制御できないようになっています。

 資料の変数表では、CPUボードの変数番号は、10進数で0〜255、16進数なら0x00〜0xffまでの範囲です。例えばモード切替スイッチとバッテリ電圧の変数番号は、それぞれ238(0xee)、239(0xef)のはずですが(VS-RC003変数表を参照)、今回入力した0x2009dcは余りにもかけ離れています。

 これは、通信メッセージでは「CPUボードの本来のメモリアドレスを指定する」必要があるためです。実は、CPUボード上ではメモリマップの数値は0x200800から始まっているので、この数値を基準として読み込む変数番号を指定する必要があります。
 しかし、その通りに「0x200800 + 0xee」と計算しても0x2008eeなので、先ほどの2009dcとは誤差があります。ここでのもう一つのポイントは「CPUボードの変数は1つのデータサイズが2(byte)である」という点です。つまり、実際のアドレスは変数の番号の2倍にする必要があります。0xeeを2倍すると0x1dcとなり、改めて「0x200800 + 0x1dc」と計算すると0x2009dcになります。

 なお、この変数のサイズについては読み込むデータサイズにも影響があります。先ほどのメッセージで読み込むデータサイズの数値を確認してみると、2個の変数を読み込むのにサイズはその2倍の「4」を指定しています。これを「2」にしてしまうと変数一つ分のサイズになるため、モード切替スイッチの値しか読み取れません。

 これで任意の番号の変数を取得できるようになりましたが、もう一つ、取得したデータ自体にも実は重要なポイントがあります。先ほど読み込んだモード切替スイッチの値を見ると、前述の例の「02 00」(スイッチが2番の場合)のように、数値が問題なく受信できているように思えます。しかし、先ほどの説明のように「読み込んだデータは4桁の16進数である」とみなすと、このスイッチの値は「0x0200」であり、それを10進数に直すと「2」ではなく「512」となります。
 これは、いわゆる「エンディアン」の仕様による問題で、CPUボードは「リトルエンディアン」に従い、送受信されるデータは16進数の上下2桁がひっくり返っています。そのため、前述のモード切替スイッチの正しい値は「0x0002」であり、これなら実際のCPUボードの状態と一致します。

 長々と説明してきましたが、おそらくこの内容がまったく分らない方も多いと思います。そのような場合のために、とりあえずどうすれば良いかの対策を下記にまとめました。

・読み込む変数番号は、変数番号を2倍して16進数に直した数値に、0x200800を加算して求める
・読み込むデータサイズは、読み込む変数の数の2倍にする
・返ってきた数値は、16進数の状態で上位2桁・下位2桁を入れ替えて換算する

指定の変数に数値を書き込む場合

 続いて、逆に指定の変数に数値を書き込む方法を説明します。
 任意の変数の数値を書き換える場合は、「w 書き込む変数番号 書き込む数値」をそれぞれ入力してエンターキーを押します。
 「書き込む変数番号」は読み込みの時と同様6桁の16進数で表記し、書き込む数値は、読み込みの際に数値が16進数で2桁区切りになっていたのと同じく、2桁ごとに空白を入れて記述します。
また、読み込みの際に説明した「アドレス(変数番号)の指定」「エンディアン(数値の上下2桁を反転)」という点は、書き込みの際もまったく同じです。

 例えば、100番の変数(0xc8)に12345(0x3039)という数値を書き込む場合は、「w 2008c8 39 30」、101番から103番まで連続して、10(0x000a),100(0x0064),1000(0x3e8)という数値を書き込む場合は、「w 2008ca 0a 00 64 00 e8 3e」と記述します。

 また、書き込むデータは、必ず4桁の16進数にしてください。例えば「w 2008ca 0a」のように、下2桁部分だけで区切ると、変数には変なデータが書き込まれる可能性があります。

シリアル通信でゲームパッド入力をエミュレートする

 ここまでの説明の実践として、シリアル通信でCPUボードをゲームコントローラで操作するように動かしてみたいと思います。VS-RC003変数表では、240〜251の変数がゲームコントローラに関係していますが、これらの数値をシリアル通信で書き換えると、ゲームコントローラを接続したりボタンを押したときと同じ効果が得られます。

 早速実践してみたいと思います。
 まずはCPUボードを「コントローラが接続されていない状態」に切り替える必要があります。これを切り替えるときは、「現在接続されているコントローラの種類(240)」に「0x0000」を書き込みます。具体的に書き込むコマンドは「w 2009e0 00 00」です(入力後エンターキーを忘れない)。

 続いて、シリアル通信で制御できるようになっているか確認するため、サーボモータをONにして見ます。ここで、バッテリなど外部電源を接続するのを忘れないようにしてください。 サーボモータのON/OFFをコントローラで切り替える場合は「ゲームパッド:SELECT+STARTの入力状態(251)」を書き換えます(ONなら1、OFFなら0)。具体的に書き込むコマンドは「w 2009f6 01 00」です。

 CPUボードをシリアル通信で制御できていれば、これでサーボモータがONになります。サーボモータをOFFにする場合は、「w 2009f6 00 00」と送信します。

 コントローラのボタン入力を変更する場合は「ゲームパッド:SELECT+△□○×ボタンの入力状態(248)」を書き換えます。
この変数には、コントローラの全てのボタンのON/OFFが割り当てられています。数値を2進数に書き直した場合の各桁(ビット)がボタン一つに相当します。注意として、一度この数値を書き換えてボタンをONにしたら、0などボタンをOFFにする数値を書き込むまでずっとボタンを押し続けたことになります。

 各ビットに割り当てられたボタンは、下の表の通りです。


主な記述例は下記の通りです。実際に数値を書き込む際には、上下2桁が逆転していることにご注意ください。
「w 2009e2 10 00」(△ボタンをON)
「w 2009e2 04 10」(L1ボタンと十字ボタンの↑をON)
「w 2009e2 00 00」(全てのボタン入力をOFF)

シリアル通信での制御が終わったら、必ずボタン入力の変数を0に戻し、また、接続されたコントローラの種類も1に直しておきましょう。


前のページ
第9回 MP3プレイヤーボード「VS-IX009」を使う
コンテンツのトップ 次のページ
第11回 ロボットをシリアル通信で動かす(後編)


検索
Loading
メインメニュー