はじめに
ここでは浅草ギ研製Bluetooth無線モジュール「AG−BT20E」を使って、AGB65シリーズとPCを無線で接続して通信を行ってみます。
AGB65シリーズは、1つのシリアルラインで複数の機能を数珠つなぎにできるモジュール群ですが、無線と併用することによりリモートブレイン型ロボットの製作や、遠隔でのセンサー情報収集システムの構築が可能になるかと思います。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
※以下の情報は2008年4月現在のものです。ご注意ください。
Bluetoorh無線モジュールAG−BT20Eについてはこちらを参照願います。
ロボット神経システムAGB65シリーズについてはこちらを参照願います。
PCとマイコンの無線通信について
自作ロボットを動かす方法としては、自立型、ラジコンプロポなどで操縦、PCからリモートブレイン、などが考えられます。リモートブレイン型ロボットの場合はPCと無線で接続してデータのやりとりをする必要があります。その際に気になるのは到達距離、通信速度、複数chを同時通信できるか?などではないでしょうか。
到達距離と通信速度はシステム全体の性能にかかわりますし、複数ch同時通信は大会出場時には必須の条件となります。
無線の種類にはいろいろなものがありますが、ホビーや教育用としは以下が実際に入手可能なものだと思われます。
種類 |
距離 |
速度 |
周波数帯 |
最大出力 |
複数ch |
微弱無線 |
数メートル |
2400〜9600bps程度 |
規定なし |
500uV/m |
機種による |
特定小電力 |
数十〜100m |
2400〜9600bps程度 |
400MHz前後、1.2GHz |
10mW |
機種による |
Bluetooth |
数十〜100m |
3Mbps |
2.4GHz |
1〜100mW |
可 |
Zigbee |
1〜100m |
20K〜250Kbps |
2.4GHz |
10mW/MHz |
可 |
無線LAN |
数十〜数百m |
54Mbps |
2.4GHz |
10mW/MHz |
不可 |
データ通信用の微弱および特定小電力無線機は、電子工作関連のメーカーから発売されておりますが、速度の点でいまひとつです。浅草ギ研でも以前は、周波数を物理的にSW切り替えで40ch同時通信可能な微弱無線機を製造しておりましたが、速度を速くしたいという要望が多くありました。
スペックだけを見ると、複数ch同時通信しない場合、たとえば自作ロボを自宅でしか動かさない場合は無線LANが非常に高速だと見えますが、無線LANの場合は消費電力が非常に大きく、システムの大きさも大きくなるので、ロボットには向かないと考えられます。
BluetoothとZigbeeは携帯機器を意識しているものなので、ロボットに向いていると言えます。Zigbeeは消費電力が非常に小さいので、稼動部分が無く低消費電力なロボット(動かないのにロボットというかどうかは別として)に向いていると言えるでしょう。Bluetoothは年々速度が上がってきており、複数ch同時通信しても通信が可能(環境に依存します)なので一般的な自作ロボットに向いているかもしれません。
ということで浅草ギ研ではAG-BT20Eという無線モジュールを開発しました。これは、現時点で一番上位のバージョンであるBluetoothVer2.0+EDRという無線で、理論的には通信速度が3Mbpsという仕様になっています。実際にはそこまでは出ませんが、AG-BT20Eの場合は双方向で最高460800bps(双方向足して約1Mbps)で通信できます。出力はClass2というもので無線到達距離は約10m(環境に依存する)となっています。
有線と無線の通信
市販のロボットキットを作ったことがある方は経験があると思いますが、PCとロボットを有線ケーブルでつないでモーションデータを転送したりすることがあると思います。このとき、通信エラーはほとんど発生しないかと思います。
無線と有線の一番の違いですが、無線の場合はいろいろな要因によって接続が途中で切れる可能性がある、ということです。無線システムの場合はこのようなエラーを考慮し、エラー発生の検知やエラー後の再接続の処理などを自分で構築する必要があります。
自宅でテストしたときには問題ないが、大会などで無線機が沢山使われているところだと上手く動かないということはよくありますのでこの辺りを念頭において開発する必要があります。
接続
AGB65シリーズは、上位(今回はPC)からの命令を受けるのが中心なものと、上位へデータを出すのが中心なものがあります。各モジュールの使い方はコマンド内容が違うだけで接続方法などほとんど同じ方法で使うことができます。ここでは、PCから命令を受けるものの代表としてAGB65−RSC(RCサーボコントローラ)と、PCへデータを返す代表としてAGB65−ADC(センサーボード)の2つを無線接続してみます。AGB65シリーズは数珠つなぎにどんどん増設していけますので、この例を参考に他のモジュールもほとんど同じようにして使うことができます。
今回、テストとして作成した接続は次の通りになります。
AGB65シリーズは5V駆動、AG-BT20Eは3.3V駆動なので、インターフェイスの電圧をあわせる必要があります。オプションのAGB65−BTはこの電圧変換を行うもので、AG−BT20EとAGB65シリーズの間に挿入します。AG−BT20EとAGB65−BTの接続はなるべく短い線で結線するか、2.54mmピッチのピンヘッダを使ってはんだ付けします。その他の接続はAGB65シリーズに添付のケーブルで行えます。
実際の配線の様子はこんな感じでテストしました。
ちょうど、個人的に小型ロボットを作っていたので、ためしにそれに搭載してみました。AGB65シリーズを初め、浅草ギ研製品はロボット搭載を考慮して極力小さく作っていますので基板とバッテリ部は頭部におさまります。サーボは浅草ギ研製のRCサーボAA-RS25Dを使っています。これはサーボケース自体がフレームになるのでとても小さいロボットが作れます。写真の構成で約24cm、重量500g(バッテリ込み)です。
リモートブレインなので、ロボット側のシステムはそんなに大掛かりになりません。増設も簡単にできます。
上から見るとこのような感じ
PCとの無線接続
BT20EはBluetooth無線なので、PC側にもBluetooth無線が必要になります。最近のNOTEパソコンにはBluetoothが標準装備されているものもあります。デスクトップの場合は、USBコネクタにさすタイプのBluetooth無線が非常に安い価格で入手できます。Bluetoothは年々規格が変わっていますが、現在は「Ver2.0+EDR」というのが最速で、BT20EもこのタイプになりますのでPC側も同じタイプを用意してください。
Bluetoothは、物理的な仕様とともに、通信プロトコルなどが細かく規定されています。たとえば、コードレス電話ならコードレス電話用の通信規格、ファイル転送ならファイル転送用の、などアプリケーションごとに最適な通信ができるような規格が設定されてもいます。BT20Eはその中で、仮想シリアルポートを構成するRFCOMM及びSPP(Serial
Port Profile)というものを使っており、Bluetooth同士で一旦つながってしまえはその後は両方の機器同士をあたかもシリアルポートでつないでいるように使うことができます。
実際に送受信するデータは規定されたパケット(HCIパケットというもの)に変換されますので、実際のデータはBluetoothの仕様よりは低い速度でしか送ることができません。Ver2.0+EDRは最高3Mbpsですが、AG-BT20Eの最高速度は460800bpsなのはこのような理由からです。
Bluetoothは実際にデータを送る前に、特定の無線同士を関連づける「ペアリング」という作業が必要です。また、この際にお互いにID登録をする場合もあります。このIDはPIN番号又はパスキーと呼ばれています。AG-BT20EもPIN番号を事前にお互いに登録する方式を取っており、IDは「0000」で固定となっていますのでPC側のBluetooth無線機のPIN番号を0000に設定する必要があります。
Bluetoothはマスターとスレーブに分かれます。AG-BT20Eはスレーブに設定されていますのでPC側のBluetooth無線機をマスターとして使います。マスターは通信する相手を探したり、接続要求をするものです。
無線の接続はおおむね次の手順で行われます。
1)スレーブ側(AG-BT20E)を検索可能状態にする。AG-BT20Eは電源を入れるだけでこの状態になります。
2)PCからBluetoothのスレーブ、つまりAG−BT20Eを検索する(PC側のソフトで行う。)。
3)お互いにペアリングする(PC側のソフトで行う。)。
4)接続する。(PC側のソフトで行う。)PC側のソフトによっては接続要求した後、COMポートを開いた段階で接続されるものもある。
となります。
接続はこのようにPC側の操作で行われますが、PC側Bluetooth無線機の種類によって接続に使うユーティリティーソフトの作法が違う場合があります。安価なPC用Bluetooth無線で一般的に手に入るものには下記があります。それぞれの接続手順はリンクをクリックしてください。詳細の操作方法を記載しています。
■BlueSoleil系の接続手順
■TOSHIBA Bluetooth
Stack系の接続手順
■WIDCOMM系の接続手順
筆者の環境では、TOSHIBA...のユーティリティーソフトを使うと、仮想COMポートではない機能が動きっぱなしになってPCの速度が非常に遅くなるという現象がおきました。ということで、以後、BlueSoleil系の無線機、ELECOM製BT-UD1を使った場合の例を掲載します。
接続
上記のリンクの例の通りにインストール及び接続確認すると、PCとAG-BT20Eが接続され、PCの画面は次のようになります。
接続が成功すると、検索されたAG-BT20Eのアイコンが点線でつながり、データ通信を表す赤い点が移動します。電波の状態は、アイコン横のゲージで表示されています。
PC側のアプリケーションプログラム
今回のシステムでは、ロボット側はプログラムが入っている基板だけですので、プログラム作成はPC上でのみ、ということになります。逆に言えば、プログラムはPC上だけでロボット作成ができるということです。
浅草ギ研ではPCアプリケーションソフトを作る場合は、MicrosoftのVisualstudio2008環境でC#での例を多数紹介していますが、ここでもVisualC#2008(以下VC#)で簡単にシリアル通信するソフトウェアを書いてみました。VC#はマイクロソフトのホームページからExpressEditionというバージョンが無償でダウンロードできます。
マイクロソフトはMSDNというページで開発のサポートを行っています。ここでダウンロードや、情報などが受けられます。質問がある場合はコミュニティのMSDNフォーラムという掲示板で質問できます。
ちなみに、現時点ではVisualstudio2008の各言語のExpressEditionのダウンロードはこちらのページのようです。時間がたつとリンク先が変わる可能性があるので注意してください。
ということで今回作ったアプリケーションソフトは次になります。
AGB65_BT.lzh (右クリックで対象を保存)
画面はこんな感じになります。
プログラムの説明をします。
おおきくわけて3つの部分になります。1つ目はPCのCOMポートのオープン/クローズ、2つ目はAGB65−RSCの駆動、3つ目はAGB65ADCでセンサーから何か読み取ってみるです。
COMポートの通信設定は、ハード側が115200bpsなのでソフトウェアでも115200bpsにします。ポート番号はPC側Bluetooth無線機のユーティリティーソフトで接続時に割り当てられます。この番号については次の節で確認方法を紹介します。上の例からみてもわかるように、割り当てられる番号がユーティリティによってさまざまですので番号を手打ちできるようにテキストボックスに番号を入れて「オープン」ボタンを押すとCOMポートがオープンされるようにしています。
AG-BT20Eは接続状態になると緑LEDが点灯しますが、PC側Bluetooth無線機のアプリケーションによってはCOMポートをオープンした時に接続状態になるものなどいろいろありますので注意してください。つまりユーティリティー上で接続と出ていても緑LEDが点灯しないが、このソフトでオープンボタンを押したときに点灯する、というものもあります。(今回の例の機種ではユーティリティーで接続とでる瞬間に緑LEDが点灯するパターン)
AGB65-RSC駆動部は簡単で、SerialPortコンポーネントに、AGB65-RSCのコマンドを送るだけです。急にサーボが動かないようにチェックボックスにチェックが入っているときだけ送信するようにしてます。簡単なエラー処理も入れてますが、エラー時にはWindowsの発行するエラー内容がメッセージボックスに表示されるだけです。
AGB65-ADCの操作ですが、とりあえずPCからコマンドを送るとデータが帰ってくるというパターンですのでボタンを押すとコマンド発行、というプログラムになります。内容的には上と同じです。コマンド様式については各RSCとADCのページを参照してください。ここでは指定した番号の値を12bitで読み取る、という命令を発行します。
ADCでは命令を受け取った後すぐにセンサー値(電圧値)を読み取って返信します。SerialPortコンポーネントではマイコンで言うところのUART受信割り込みのようなイベントがあります。このイベントは初めの一バイトを受信した直後に発生しますので、冒頭で少しまってから処理を開始しています。Thread.Sleep()メソッドは引数xmSの間、このスレッド(プログラム)を停止します。使うには
using System.Threading; を宣言することにより使えるようになります。
このプログラムでは受信イベント後10mS待っていますが、実際の受信は115200bpsで数バイトなので1mS以内に終了します。処理中ではとりあえず先頭のシンクロバイトが255か?だけを判定しています。ADCの命令12の場合は最後の2バイトが値になりますので合体させてからテキストボックスに結果を表示させています。
この表示部ですが、少々コツがあります。Invoke(...の部分です。
VisualStudio2008(以下VS2008)のSerialPortコンポーネントは、呼び出されたコンポーネント(今回はForm1)とは別スレッドで動きます。VS2008ではスレッドセーフで書かないとデバックできないようになってしまったので、SerilPortで受信した値をForm1内のコンポーネント(今回はTextBox)に直接は渡せません。ということでデリゲートを使って間接的に渡す仕組みを作っておきます。とりあえず、普通のTextBoxクラスを継承して値をセットするメソッドを追加したものを作ります。
(このクラスはForm1の外に作り、Form1のコンストラクタで宣言します)
データセット用にデリゲートを宣言しておけばこれをInvokeして値を渡すことができます。
(この記述はForm1内に書きます)
詳しくはソースを見てください。この2パターンが使えれば、全てのAGB65シリーズも同様に制御することができます。
動作テスト
さて、実際に通信テストをしてみます。
通信を始めるにあたり、ロボット側を通信可能状態にします。AG-BT20Eは電源を入れるだけで数秒で通信可能状態(赤LED点灯)になります。
つぎに、PC側のCOMの番号を調べます。今、PC側とマイコン側でBluetoothが起動していて接続が終了したとしますとPC側のユーティリティーが接続状態を表示しているかと思います。
BlueSoleilの場合は、接続されたAG-BT20Eのアイコンを右クリックし、「ステータス」を選択すると次の画面になります。
ここのCOMポートの部分に接続されたCOMポートの番号が表示されます。筆者の場合はCOM77に接続されました。
次に、PC側で先に作成したアプリケーションソフトを起動します。
COMの横に確認した番号を半角数字で入れます。ここはエラー処理入れていないので間違った記述をする(全角とか)とエラーで終了してしまいますので気をつけてください。「オープンボタン」を押して接続されると「COM状態」の表示が変わります。ここで試しにサーボ駆動のトラックバーを動かしてみてください。下の例ではID3番のRSC上の0番のサーボがトラックバーで動きます。
センサー読み取りを押すと、ADCにつながっているセンサーの値を読みます。今回の例ではAS-FORCEをつないでみました。AS-FORCEは無加重時に電源電圧の半分の値が出力されます。12bit読み取りですので最大値は4095ですので下の例では約半分の値になり、正常に読み取れていることになります。
ためしにAS−FORCEに加重をかけて読み取りボタンを押すと、加重に比例して値が低くなっていきます。
このようにして、マイコンのプログラムをしなくてもPCのプログラミングだけでリモートブレインロボットを構成することができます。
尚、実際の作成時にはPC側の例外エラー処理を入れたり、無線が切れたときの制御を考えたり、ということが必要になってくるかと思います。無線ですが、弊社実験では3システム同時に無線でやりとりしても室内程度でしたら問題なく動作しました。また、他社実験データですが、20システム同時通信でもほとんど無線エラーはおきなかったそうですのでロボット競技会などへの参加も可能と思われます。(ロボワンは現時点では予選で自立動作する必要があるのでこの構成だけでは難しいが、マイコンを追加すると可能かと思われます。)
2008年5月1日
|