はじめに
ここではAVRマイコンと浅草ギ研製Bluetooth無線モジュール「AG−BT20E」を使って、PCと無線で通信を行ってみます。浅草ギ研で教育用ロボット「AT-WALKER」を販売していますが、これがAVRのATmega32を搭載しているのでこれを使ってみます。つまりAT-WALKERを無線化してみます。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
※以下の情報は2008年5月現在のものです。ご注意ください。
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とロボットを有線ケーブルでつないでモーションデータを転送したりすることがあると思います。このとき、通信エラーはほとんど発生しないかと思います。
無線と有線の一番の違いですが、無線の場合はいろいろな要因によって接続が途中で切れる可能性がある、ということです。無線システムの場合はこのようなエラーを考慮し、エラー発生の検知やエラー後の再接続の処理などを自分で構築する必要があります。
自宅でテストしたときには問題ないが、大会などで無線機が沢山使われているところだと上手く動かないということはよくありますのでこの辺りを念頭において開発する必要があります。
BTC067の改造
今回無線化するAT-WALKERにはベストテクノロジー社製のAVRマイコンボード「BTC067」がベースになっています。無線部分はマイコンのシリアル通信機能を使いますが、シリアルポートはプログラムを書き込むときにも使うので若干の改造の必要があります。
BTC067はシリアル通信でPCからプログラムを転送しますが、PCと直接接続できるようにシリアル通信部分に電圧変換ICが入っています。上の接続ではこのICが接続されている状態なので、無線機から出た受信データをそのまま入れようとすると波形が変わってしまいます。(旧版の無線機R80の図を使っています。R80の記述はAG-BT20Eに置き換えて読んで下さい。)
JP1は出荷時にはつながっており、PCからプログラムが受けられるようになってます。
BTC067ではJP1の接続を切れますので、MAX3313の影響が出ないようにするために、JP1を外して実験してみます。
基板中央右に四角に囲まれた JP1 というところがあり、ハンダが盛られています。このハンダを取り去ると接続を切ることができます。
ハンダ吸い取り線でハンダをとりました。(実際にはこの上からハンダゴテをあてます)
JP1のハンダが取れて、接続が切られているのがわかります。
(なんか、裏側にニコチャンマークがありますね。ベステクさんの遊び心でしょうか)
波形を観測すると、今度はきちんとLOWが0Vまで下がり、データを受け取ることができました。
が、しかし、今度はMAX3313の接続が切られているので、新しいプロウグラムを入れようとするとAVDUDE(*1)を起動してもプログラムが転送されません。
(*1)GDLで作ったプログラムをATmega32に転送するプログラム。詳しくは浅草ギ研の書籍「二足歩行ロボット製作超入門」かBTC067のマニュアルを参照。
この対策として、ここではJP1にプッシュスイッチを取り付けて、「プログラムを転送している間はスイッチを押す」ということにしました。
こんな感じになりました。
これでハード的には無線通信可能となりました。
AG-BT20Eの接続
AT-WALKERのシリアル端子はこの部分についています。
ATmega32のTX(送信)はBT20EのRX(受信)、ATmega32のRXはBT20EのTXに接続します。
また、ATmega32のTX(出力)は5Vですのでそのまま無線機(3.3V動作)には接続できません。接続には抵抗2本で分圧して接続します。
※今回、青線の部分はつないでいません。
実際の接続は次のようになりました。実験なのでとりあえず手元にあったケーブルでてきとうに接続しています。ケーブルの長さはできるだけ短くした方がノイズがのらないのでよいでしょう。
3.3V電源を入れるとAG-BT20Eに通電され、自働的に「Bluetoothの検索」がされる状態にまで移行し、赤LED(RADY)が点灯します。この状態でPC側のBluetooth無線から検索をかけると接続できる状態になります。詳しくは次の節にて説明します。
PCとの無線接続
BT20EはBluetooth無線なので、PC側にもBluetooth無線が必要になります。最近のNOTEパソコンにはBluetoothが標準装備されているものもあります。デスクトップの場合は、USBコネクタにさすタイプのBluetooth無線が非常に安い価格で入手できます。Bluetoothは年々規格が変わっていますが、現在(2008.5)は「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のアイコンが点線でつながり、データ通信を表す赤い点が移動します。電波の状態は、アイコン横のゲージで表示されています。
AT-WALKERからの送信実験
では実際にBluetoothでAT-WALKERとPCを通信させてみましょう。まずはAT-WALKER側からの送信を考えてみます。
無線はBluetooth間で接続された状態になっているので、単純にAG-BT20Eにシリアル通信でデータを送るだけで通信することができます。では実際にデータを送るプログラムを作ってみます。AT-mega32のプログラミングや書込み詳細については浅草ギ研から出ている書籍「二足歩行ロボット製作超入門」に詳しく書いてありますのでそちらを参照願います。
実際に作ったプログラムが次になります。
AG-BT20E_avr1.c (右クリックで対象を保存)
中身は次のようになっています。単純にUSARTからデータを出しているだけです。
ほとんどの部分はいままで他のAT-WALKERのページで説明してきたことですのでプログラム説明は割愛します。
通信速度はあまり速い設定にはできないので9600bpsにしています。AG-BT20E側はDIPスイッチで通信速度を設定するので注意してください。BT20E側も同じ速度設定にしていないと当然通信はできません。
F9を押すとコンパイルされ、転送するファイルが生成されます。
<送信したデータの確認>
PC側のOSがXPよりも古い場合はハイパーターミナルで受信したデータを表示させることができます。XPの場合は適当な通信ソフトを使ってください(フリーのものが沢山ある)。
通信を始めるにあたり、マイコン側を通信可能状態にします。AG-BT20Eは接続状態(赤LEDと緑LEDが両方点灯)になっている状態とします。(詳細は上のリンクをクリック)
つぎに、PC側のCOMの番号を調べます。今、PC側とマイコン側でBluetoothが起動していて接続が終了したとしますとPC側のユーティリティーが接続状態を表示しているかと思います。
BlueSoleilの場合は、接続されたAG-BT20Eのアイコンを右クリックし、「ステータス」を選択すると次の画面になります。
ここのCOMポートの部分に接続されたCOMポートの番号が表示されます。筆者の場合はCOM77に接続されました。
次に、PC側でハイパーターミナル(もしくは適当な通信ソフト)を起動します。
「接続方法」のところで、先に確認したCOM77(各自環境で番号は違う)を選択します。
通信設定は次の通りです。「ビット/秒」は9600で、「フロー制御」は”なし”です。
Bluetoothでつながった状態で、そのポートをハイパーターミナルで開くとPCのCOMポートとAT-WALKER(ATmega32)のUARTがソフト的にも接続されたことになります。この状態で、AT-WALKERのマイコンボードをRUN(スイッチをWriteと逆側にする))するとPCへデータが送られます。
下はその様子です。'0'から順番にアスキーコードを表示しているのがわかります。'0'はASCIIコードで0x30です。
ということでPCに対して無線でデータを送信することができました。
受信実験
PC側のソフトウェア
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の値を変えると通信速度を変更できます。ここでは115200bps(**)に設定しています。
(**)このソフトは他のマイコンの実験で作ったものなので115200bps設定になっています。今回AT-WALKERは9600bps設定なので通信速度が違いますが、この違いはBluetooth無線機同士で変換されますので問題なく通信できます。ここを9600bpsに設定しても当然問題なく動きます。
各ボタンのクリックイベントは次のようになっています。今回は1バイトを送信するだけですが、配列の大きさを変えて、Writeメソッドの値を変更すれば沢山のデータを送信できます。実験では4000バイトぐらいを連続送信してみましたが問題ありませんでした。Writeの引数は 1つ目:配列名 2つ目:配列の開始位置 3つ目:送信数 となります。詳しくはVisualStudio(か、.NETか、VisualC#)について勉強してみてください。
COMポートのクローズとオープンの部分です。VisualStudio2008のSerialPortコンポーネントは、オープンやクローズをしてもすぐには反映されませんので、Thread.Sleepメソッドで少しまってからオープン成功の判定をしています。Thread.Sleepを使う場合は using
System.Threading; を始めの方で宣言することにより使えるようになります。
ATmega32側のソフトウェア
今回は動作テスト程度にします。、先ほどのPCアプリのボタンを押すことによりLED(PB4が緑LEDに接続されている)をON/OFFさせてみます。
とりあえず作ったのが次になります。
AG-BT20E_avr2.c (右クリックで対象を保存)
0x34を受信でLEDをON、0x35でOFFにしています。
動作テスト
送信実験のところと同じようにしてSH2とPC側をBluetooth無線で接続します。C#で作ったアプリケーションプログラムを起動し、接続されているCOM番号(この例ではCOM77)を入れて「Open」ボタンを押すとCOM77がオープンされます。この後、各ボタンを押すと、ボタンに書いてある数値がCOM77経由で無線で送信されます。
実際に押してみましょう。
0x34ボタンを押すとA33FのLEDが点灯しました。(緑LED)
0x35ボタンを押すと消灯します。
ということで、無事、無線通信できました。
AT-WALKERは性能があまり高くない(しかし安価な)マイコンを使っていますが、無線システムにすることによりPC側で高度な計算をさせるリモートブレインロボットがつくれるでしょう。
2008年5月8日
|