はじめに
ここではA33Fと浅草ギ研製Bluetooth無線モジュール「AG−BT20E」を使って、PCと無線で通信を行ってみます。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
※以下の情報は2008年4月現在のものです。ご注意ください。
※このページではC言語の基本的な部分を理解している方向けに書いてあります。また、何回かMPLABの操作を行った方を対象にしています。それ以外の方はまず基本編を読んで下さい。
A33Fについてはこちら、Bluetoorh無線モジュールAG−BT20Eについてはこちらを参照願います。
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とロボットを有線ケーブルでつないでモーションデータを転送したりすることがあると思います。このとき、通信エラーはほとんど発生しないかと思います。
無線と有線の一番の違いですが、無線の場合はいろいろな要因によって接続が途中で切れる可能性がある、ということです。無線システムの場合はこのようなエラーを考慮し、エラー発生の検知やエラー後の再接続の処理などを自分で構築する必要があります。
自宅でテストしたときには問題ないが、大会などで無線機が沢山使われているところだと上手く動かないということはよくありますのでこの辺りを念頭において開発する必要があります。
接続方法
A33FのUART2はdsPICのUART2がそのまま出ています。A33FもAG−BT20Eも3.3V動作なので直接接続することができます。A33Fは3.3V電源を外部に供給できますので、AG−BT20Eの電源はA33Fから供給します。
ということで接続図は次の通りとなります。
A33FのTX(送信)はBT20EのRX(受信)、A33FのRXはBT20EのTXに接続します。
実際の接続は次のようになります。実験なのでとりあえず手元にあったケーブルでてきとうに接続しています。ケーブルの長さはできるだけ短くした方がノイズがのらないのでよいでしょう。写真のA33Fは、オプションのA33F−EX2を装着しており、RCサーボの駆動もできるようになっています。
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アプリケーションソフトを作る場合は、MicrosoftのVisualstudio2008環境でC#での例を多数紹介していますが、ここでもVisualC#2008(以下VC#)で簡単にシリアル通信するソフトウェアを書いてみました。VC#はマイクロソフトのホームページからExpressEditionというバージョンが無償でダウンロードできます。
マイクロソフトはMSDNというページで開発のサポートを行っています。ここでダウンロードや、情報などが受けられます。質問がある場合はコミュニティのMSDNフォーラムという掲示板で質問できます。
ちなみに、現時点ではVisualstudio2008の各言語のExpressEditionのダウンロードはこちらのページのようです。時間がたつとリンク先が変わる可能性があるので注意してください。
冒頭でも書きましたが、ロボット用途ですとリモートブレインタイプの需要が多いのではないかと思います。私自身もリモートブレインロボットを作りたいということもあり開発したという経緯もあります。ということで、ここではとりあえず、PC側から何かデータを送って、それによってロボットが動くというアプリケーションを考えました。とりあえずは簡単にコントローラのようなものを作ってみます。ここでは行いませんが、AG-BT20Eは双方向なので、ロボットに搭載されたセンサのデータをPCへ送り、計算させ、それによりロボットへ指示を出す、という構成も可能です。
ということでとりあえず作ったアプリが次になります。
BTController.lzh (右クリックで対象を保存)
プロジェクトファイル全てを圧縮していますので解凍してください。起動すると下のような画面になります。
内容はいたって簡単で、各ボタンを押すとその値が送信されるというものです。使う前に、Openボタンを押してCOMポートをオープンします。0x30は十六進表記です。アスキーコードで0x30は数字の「0」ですので、事前にハイパーターミナルなどのWindowsのシリアル通信ソフトで送信されているかのテストをすることもできます。0x31は「1」...となります。詳しくは「ASCIIコード」でグーグルしてみてください。
プログラムを簡単に説明します。コンストラクタ部はこのようになっています。serialPort1.BaudRateの値を変えると通信速度を変更できます。ここではとりあえず、AG-BT20Eの初期設定である115200bpsに設定しています。ちなみにこの後、460800bpsで通信しても動きました(A33F側の設定もとうぜん変更する必要がある)。
各ボタンのクリックイベントは次のようになっています。今回は1バイトを送信すだけですが、配列の大きさを変えて、Writeメソッドの値を変更すれば沢山のデータを送信できます。実験では4000バイトぐらいを連続送信してみましたが問題ありませんでした。Writeの引数は 1つ目:配列名 2つ目:配列の開始位置 3つ目:送信数 となります。詳しくはVisualStudioについて勉強してみてください。
COMポートのクローズとオープンの部分です。VisualStudio2008のSerialPortコンポーネントは、オープンやクローズをしてもすぐには反映されませんので、Thread.Sleepメソッドで少しまってからオープン成功の判定をしています。Thread.Sleepを使う場合は using
System.Threading; を始めの方で宣言することにより使えるようになります。
A33F側のソフトウェア
今回は動作テスト程度にします。A33FにはLEDがついていますので、先ほどのPCアプリのボタンを押すことによりLEDをON/OFFさせてみます。
とりあえず作ったのが次になります。ここではソースファイルしか掲載しませんので、MPLABでのプロジェクト作成(A33Fのサンプルページを参照)を行ってからこのソースファイルをプロジェクトに追加してください。
RadioControll.c (右クリックで対象を保存)
解説するような部分は次のところです。その他は他のページを参照してください。
U2(UART2)は115200bpsに設定され、起動時にオープンされます。U2の受信割り込みが入ったらこの部分が実行されますが、0x34を受信でLEDをON、0x35でOFFにしています。
main部分はwhile(1)でずっとループしている記述になっていますが、本当にリモートブレインロボを作る場合はmain部には他の処理が入るかと思います。
一つ注意点ですが、私は始め、この割り込み部分の判定を
if ( U2RXREG ==0x34 )
のようにif分でレジスタの内容を直接判定する記述をしていましたが、上手く動かなかったりする場合がありました。SFRを直接判定してはいけないようなので注意して下さい。
動作テスト
通信を始めるにあたり、A33F側を通信可能状態にします。AG-BT20Eは電源を入れるだけで数秒で通信可能状態(赤LED点灯)になります。A33Fのプログラムはあらかじめ転送しておきます。ちょうど、個人的に小型ロボを作っていたのでそれに載せてみました。LiPoバッテリは実際に動作させるときの電源です。開発中はPCのUSBから電源を取っています。
ちなみに、フレームは浅草ギ研のRCサーボ、AA-RS25Dを使っています。結構小さいロボが作れますが、写真ので23cmぐらいです。サーボ自体がフレームになりますので組み立ては結構簡単で、配置換えなども簡単にできます。
つぎに、PC側のCOMの番号を調べます。今、PC側とマイコン側でBluetoothが起動していて接続が終了したとしますとPC側のユーティリティーが接続状態を表示しているかと思います。
BlueSoleilの場合は、接続されたAG-BT20Eのアイコンを右クリックし、「ステータス」を選択すると次の画面になります。
ここのCOMポートの部分に接続されたCOMポートの番号が表示されます。筆者の場合はCOM77に接続されました。
次にPC側アプリを起動してCOM77に接続します。「Open」ボタンを押すと、オープンが成功した場合はボタンの下にステータスが表示されます。エラーの場合は、Windowsの例外エラーの内容をそのままメッセージボックスで表示するようにしていますので内容を確認して対応してください。
0x34ボタンを押すとA33FのLEDが点灯しました。
0x35ボタンを押すと消灯します。
2008年4月26日
|