インターフェース2013年5月号に載っているPIC回路(全く同じもの)を2つ用意してください(PIC-PIC間接続の場合は、使用するドングルはPLANEX社のBT-Micro4でもかまいません)。その間をBluetooth Ver. 4.0 LEモードで無線接続します。1つはmaster(主人)、他方はslave(奴隷)と呼ばれます。masterはslaveに対して接続を要求し、slaveはmasterに接続許可を発行します。master用のファームウェアはHCImasterLE.zipで、slave用のファームウェアはHCIslaveLE.zipです。
まず、masterのPIC回路にRS232C回路(デバッグ・モニター用)を接続し、パーソナル・コンピュータ(PC)上で(ハイパーターミナルやTela Termなどのモニター用アプリケーション・プログラムを用います)デバッグログをモニターできるようにします。そして、slaveのPIC回路とmasterのPIC回路の電源を入れます。接続されれば、LEDが点灯します。モニターログは、例えばloghostLE.txtのようになります。このログの中で、注目すべき所は、
2A 00 09 00 05 00 40 00 01 02 03 04 05
(masterのPIC回路からslaveのPIC回路へデータ「0x01 0x02 0x03 0x04 0x05の5バイト」を送っているということを意味しています)と、
HCI_ACL_READ_DATA:
2A 20 09 00 05 00 40 00 02 03 04 05 06
(slaveのPIC回路からmasterのPIC回路へ送られた来たデータ「0x02 0x03 0x04 0x05 0x06の5バイト」をmasterのPIC回路が受信していることを意味しています)とです。
つまり、masterのPIC回路からslaveのPIC回路へデータを送ると、slaveのPIC回路では、5バイトのデータそれぞれに1を加えて、masterのPIC回路に送り返していることが分かります。ところで、今回作成したファームウェアでは、データの送信・受信が終わると無限ループに入りそれ以上のことは何もしていません(両ファームウェアのmain.cのcase PROG_END:のところで無限ループに入ります)。ファームウェアにはコメント文を入れておきましたので、それを参照して、好みに合うように書き換えてください。書き換えるのは両ファームウェアのmain.cだけです。また、デバッグが終了しましたら、両ファームウェアのmain.cの中の
#define DEBUG_MODE
をコメント文にしてください。
注意:このファームウェアでは、masterから発見可能な状態(アドドバタイズしている状態)になっているBluetoothLE機器が1つ(作成したslaveのPIC回路のみ)だけである条件でしか使用できません。他にbluetoothLE機器があり、それがmasterから発見可能な状態にあるときは、HCImasterLEフォルダーのmain.cの中のcase HCI_CMD_SCAN_ENABLE_END:文とcase HCI_CMD_SCAN_ENABLE_END1:文を適当な回数(接続すべきものが見つかるまで)くりかえして、その時見つかったbluetoothLE機器を1つ選び出し、case HCI_CMD_WRITE_LIST:文のところで、ホワイトリスト(接続許可するbluetoothLE機器をリストアップする。ブラックリストとは逆の意味。)にそのbluetoothアドレス(6バイト)とアドレス型(通常は1バイトのゼロ)を書き込む必要があります。
さて、PIC-PIC間接続の場合、HCIプロトコルまでで、それ以上のプロトコル・プロファイル(L2CAP、ATT、GATT、HOGPなど)は、何故使用しないのでしょうか。例えば1台のパーソナル・コンピュータ(PC:masterとなる)があり、そして、その周りには沢山のBluetoothLE機器があったとします。PCは、それらのBluetoothLE機器と接続できなければいけません。ところが、各々のBluetoothLE機器は、それぞれ異なるプロファイル(音楽用、USB無線化、RS232C無線化のための各種プロファイル)を持っていますので、これらに、個別に対応する必要があります。そこで、PCは、まず、各々のBluetoothLE機器がどのようなプロファイルを持っているかを調べる必要があります。そして、そのプロファイルが分かったら、そこで使用されるデータ構造がどの様な形態なのかを調べる必要があります。例えば、BluetoothLE機器がUSB-HIDの無線化のためのプロファイルを持っている場合、以上の調査を実行するための「約束事」を定めたのが、大まかに言えば、L2CAP、ATT、GATT、HOGPなのです。一方、PICをmasterとする場合、もちろん、いろいろなプロファイルに対応させたい場合には、L2CAP、ATT、GATTが必要になります。でも、多くの場合、繋ぐ相手であるslaveのPIC回路は、どうせ1つのプロファイルしか必要でありません。さらに、1つのプロファイルでしたら、何もBluetoothSIGで定められているプロファイルに拘る必要はありません。つまり独自のプロファイルを作れば良いのです。この独自プロファイルは、HCIプロトコル上に作ることになりますが、そう大層なものにする必要性はありません。例えば、slaveのPIC回路に付けたLEDを点灯させたり、消灯させたりするのに、それぞれmasterのPIC回路からslaveのPIC回路へ、'S'と'R'を送るように「規定」(通信の約束事と)すれば、それだけで、プロファイル(同時にプロトコル)になってしまいます。LED_ON_OFFプロファイル(プロトコル)とでも呼びたければ呼べますが、あえてプロファイルと呼ぶ必要も無いように思います。このため、簡単に、「PIC-PIC間接続の場合、HCIプロトコルまでしか必要がない」と私は言っています。