はじめに
ここでは市販のSH2マイコンボードとと浅草ギ研製Bluetooth無線モジュール「AG−BT20E」を使って、PCと無線で通信を行ってみます。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
※以下の情報は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とロボットを有線ケーブルでつないでモーションデータを転送したりすることがあると思います。このとき、通信エラーはほとんど発生しないかと思います。
無線と有線の一番の違いですが、無線の場合はいろいろな要因によって接続が途中で切れる可能性がある、ということです。無線システムの場合はこのようなエラーを考慮し、エラー発生の検知やエラー後の再接続の処理などを自分で構築する必要があります。
自宅でテストしたときには問題ないが、大会などで無線機が沢山使われているところだと上手く動かないということはよくありますのでこの辺りを念頭において開発する必要があります。
SH2について
浅草ギ研のホームページでは何回か、SH2を使った製作事例を紹介しており、今まではインターフェイス誌(2006年6月号)の付録を使ってきました。今回はインターフェイスのバックナンバーの入手製も悪くなってきたと思いますので市販のSH2マイコンボードを使ってみます。
今回使用するのはベストテクノロジー社製のBTC080マイコンボードでSH7145Fに拡張RAMを搭載したものです。ベストテクノロジー社では自社のマイコンボードを開発するためのC言語の簡易開発環境(GDL)を無償で配布していますので初心者の方がちょっと勉強してみようか、というのに非常に向いているかと思います。本格的に開発しようとおもったらメーカー(ルネサス)の開発環境やデバックツールを買えばよいということになります。
BTC080はあらかじめROM領域にブートローダを書き込んでありますのでGDLで作成したソフトはケーブル一本でマイコンボードに転送することができます。
SH2の使い方などについてはここでは詳しくは説明しませんので書籍やメーカーのドキュメント(メーカーのホームページなどで入手可能)を参照してください。
接続
SH7145はシリアル通信機能(SCI)を4つ持っています。そのうちSCI1はマイコンボードにプログラムを転送するために使われますのでSCI0,SCI2,SCI3の3つが自由に使えることになります。今回はSCI0をBluetooth無線機(AG-BT20E)につなぐことにします。
BTC080マイコンボードの概観は次のようになっています。この中で、SCIの端子はCN2のコネクタに集中しています。また、CN2には3.3Vの電源入力端子もあります。詳しくはマイコンボードに添付の資料を参照願います。
BTC080はそれ自体では電源回路を持っていません。SH7145は3.3V動作ですので3.3V電源が必要になります。AG−BT20Eも3.3V動作なので信号線は直結することができます。
ということで接続は次の通りとなります。
SH2のTX(送信)はBT20EのRX(受信)、SH2のRXはBT20EのTXに接続します。
実際の接続は次のようになります。実験なのでとりあえず手元にあったケーブルでてきとうに接続しています。ケーブルの長さはできるだけ短くした方がノイズがのらないのでよいでしょう。
3.3V電源を入れるとSH2マイコンボードとAG-BT20Eに通電され、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のアイコンが点線でつながり、データ通信を表す赤い点が移動します。電波の状態は、アイコン横のゲージで表示されています。
送信実験
では実際にBluetoothでSH2とPCを通信させてみましょう。まずはSH2からの送信を考えて見ます。
無線はBluetooth間で接続された状態になっているので、単純にAG-BT20Eにシリアル通信でデータを送るだけで通信することができます。では実際にデータを送るプログラムを作ってみます。
まず、GDLはSH2以外のマイコンも開発できますのでGDL環境をSH2にします。BT080はプログラムをROMかRAMに書き込めます(選択が可能)が、今回は一般的なマイコンと同じようにマイコンのROMにプログラムを書き込んでみます。GDLのメニューの「ツール」−>「GCCオプション」を選択すると次の画面になりますので、設定リストを「SH7145内臓フラッシュROM」にして「OK」を押します。
実際に作ったプログラムが次になります。
SH2_BT20E.c (右クリックで対象を保存)
中身は次のようになっています。単純にSCIからデータを出しているだけです。
以下、プログラムを説明します。
7行目:7145.hにIOやレジスタの定義があります。このファイルはベストテクノロジーから提供されており、実は簡単なシリアル通信関数なども入っていますが、今回は環境(GDL)に依存しないようにライブラリ関数は使っていません。
行12〜17:1文字を送信する関数です。SH2の場合、送信レジスタ(TDR)に値を書き込むと自働的に送信されます。
行28〜行38:LED用のIO設定とSCI0の設定をしています。詳しくは「SH7145グループハードウェアマニュアル」に書いてあります。これはメーカー(ルネサス社)のホームページで入手できます。また、BT080を購入するとサンプルプログラムのCD-ROMが付いてくるのでそれも参考になります。
BTC080の場合、周辺のクロックは24.576MHzですがこれで生成できる最高の通信速度は115200bpsなので、通信は115200bpsで行うことにします。AG-BT20E側は通信速度をDIPスイッチで設定するので注意してください(但し115200bpsは出荷時設定です)。
行42〜47:メイン部。約1秒おきにアスキーコードの'0'から順番に送信しています。for文のウェイト文で約1秒を作っていますが、時計を見ながら適当に数値を入れて調整して作りました。正確な1秒を作りたい場合はタイマー機能を使ってください。
F9を押すとコンパイルされ、転送するファイル「SH2_BT20E.mot」が生成されます。
<コンパイル〜書込み>
マイコン開発ビギナーの場合はBTC080に付属の資料だけではどのように書き込むか悩むと思いますのでここで簡単に手順を紹介します。(尚、マイナーチェンジなどにより方法が変わる可能性がありますがこれはあくまでも例なので各自よく確認してください)
1)コンパイルする
2)フラッシュライタを立ち上げる(最近のバージョンでは1)をすると自働的に立ち上がったりする)
3)フラッシュライタの設定が次のようになっているか確認する。フラッシュライタのwindow左上のアイコン(黒いところ)を押すと設定確認のメニューなどが現れますのでそこで確認します。
PORT:ケーブルがつながっているポートを設定する
BaudRate:38400
TimeOut:9999
CPU TYPE:7045
4)BTC080のDIPスイッチを全てON側にした後、プッシュボタンを押してリセットする。これによりROMへの書込みモード(ブートモード)になります。
5)フラッシュライタの「かきこみ」ボタンを押す。スムーズにゲージが表示されたら転送されている状態です。ゲージがかなりゆっくりの場合は通信がうまくいってない可能性がありますので接続やモードを確認します。
6)DIPスイッチのまんなか2個をOFF側にした後、プッシュボタンを押すと転送したプログラムが動きます。この後は電源を入れるたびに動きます。
先のプログラムはデータ送信時にLEDの点灯を変えているので、ぱっとみて一秒ごとにLEDがON/OFFしていれば正常にプログラムが動いているのがわかります。このとき、SH2側からはデータも送信されます。
<送信したデータの確認>
PC側のOSがXPよりも古い場合はハイパーターミナルで受信したデータを表示させることができます。XPの場合は適当な通信ソフトを使ってください(フリーのものが沢山ある)。
通信を始めるにあたり、マイコン側を通信可能状態にします。AG-BT20Eは接続状態(赤LEDと緑LEDが両方点灯)になっている状態とします。(詳細は上のリンクをクリック)
つぎに、PC側のCOMの番号を調べます。今、PC側とマイコン側でBluetoothが起動していて接続が終了したとしますとPC側のユーティリティーが接続状態を表示しているかと思います。
BlueSoleilの場合は、接続されたAG-BT20Eのアイコンを右クリックし、「ステータス」を選択すると次の画面になります。
ここのCOMポートの部分に接続されたCOMポートの番号が表示されます。筆者の場合はCOM77に接続されました。
次に、PC側でハイパーターミナル(もしくは適当な通信ソフト)を起動します。
「接続方法」のところで、先に確認したCOM77(各自環境で番号は違う)を選択します。
通信設定は次の通りです。「ビット/秒」は115200で、「フロー制御」は”なし”です。
ということで、Bluetoothでつながった状態で、そのポートをハイパーターミナルで開くとSH2から送信されたデータが見れます。下はSH2(BTC080)をリセットした直後の表示です。'0'から順番にアスキーコードを表示しているのがわかります。
1文字を送信しているときの波形です。1バイトは約100uSで送信されます。
ということでSH2から115200bpsでデータを送信することができました。
受信実験
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に設定しています。
各ボタンのクリックイベントは次のようになっています。今回は1バイトを送信するだけですが、配列の大きさを変えて、Writeメソッドの値を変更すれば沢山のデータを送信できます。実験では4000バイトぐらいを連続送信してみましたが問題ありませんでした。Writeの引数は 1つ目:配列名 2つ目:配列の開始位置 3つ目:送信数 となります。詳しくはVisualStudio(か、.NETか、VisualC#)について勉強してみてください。
COMポートのクローズとオープンの部分です。VisualStudio2008のSerialPortコンポーネントは、オープンやクローズをしてもすぐには反映されませんので、Thread.Sleepメソッドで少しまってからオープン成功の判定をしています。Thread.Sleepを使う場合は using
System.Threading; を始めの方で宣言することにより使えるようになります。
SH2側のソフトウェア
今回は動作テスト程度にします。SH2マイコンボードにLEDをつけましたので、先ほどのPCアプリのボタンを押すことによりLEDをON/OFFさせてみます。
とりあえず作ったのが次になります。
SH2_BT20E_2.c (右クリックで対象を保存)
SCI0は115200bpsに設定され、0x34を受信でLEDをON、0x35でOFFにしています。
動作テスト
送信実験のところと同じようにしてSH2とPC側をBluetooth無線で接続します。C#で作ったアプリケーションプログラムを起動し、接続されているCOM番号(この例ではCOM77)を入れて「Open」ボタンを押すとCOM77がオープンされます。この後、各ボタンを押すと、ボタンに書いてある数値がCOM77経由で無線で送信されます。
実際に押してみましょう。
0x34ボタンを押すとA33FのLEDが点灯しました。(LEDを指でつまんでます)
0x35ボタンを押すと消灯します。
ということで、無事、115200bpsで無線通信できました。
SH2ぐらいになると高度な計算もできますので、ある程度自立性をもたせたリモートブレインロボットがつくれるでしょう。
2008年5月8日
|