HCIレイヤー(PIC-PC間接続: Windows XP)

目次


PIC用ファームウェア

PIC24FJ64GB002に書き込むためのファームウェアはnewbluetooth.zip ver.1.0ですが、以下の点につき、必要に応じて修正してから再コンパイルしてPICに書き込んでください。

1.4MHzのセラミック発振子を用いていますが、もし8 MHzのものを用いたければ, main.cの中の_CONFIG2 の中のPLLDIV_NODIV をPLLDIV_DIV2としてください。

2.もし、PICがbluetooth USB ドングルを認識しない場合、main.cの上から82行目の delay_time=30;の数値30を大きい値に変えてみてください。なお、PCとPICが無線接続できた後(”case ACL_GET_DATA”(main.c)以後)、delay_time=0;とすることによりデータ転送速度を元に戻しています。なお、最新のMicrochip Application Librariesでは、この不都合は解消されていますので、delay_timeなる変数は必要なくなりましたが、更新するのが面倒であれば、そのままお使いください。

3.RS232C基板を使用してデバック内容をPCに出力するためには、main.cの中の"//#define DEBUG_MODE"なる行のコメント(//だけ)を消してください。


デバイス・ドライバーのインストール

パーソナル・コンピュータ(PC)側のbluetooth USB ドングルをPCで認識するためには、「PIC18F2550と制御コンピュータとの関係」の所で説明したように、デバイス・ドライバーが必要になります。ここでは、柏野政弘氏により作製された有名な、uusbdv.sys を使用します。本家のものは沢山のファイルが入っており、どれを使用するのか迷うといけませんので、ここでは必要な部分だけをdll.zipとしてのせておきます。デバイス・ドライバーをPCに組み込むために、以下の3つのことを行ってください

1.メモ帳などで dll.zipを解凍して出てくるdriverフォルダの中のUUSBD.INFを、持っているPC側のbluetooth USB ドングルのvender ID (VID)とproduct ID (PID)に合わせて、
%USB\VID_0A12&PID_0001.DeviceDesc%=UUSBD.Dev, USB\VID_0A12&PID_0001
の行と、
USB\VID_0A12&PID_0001.DeviceDesc="Universal USB Driver"
の行を変更してください。なお、USB ドングルのVIDとPIDは"USBVIEW.EXE"(bluehost.zipに間違って入れてしまいました)を実行すると分かります。これを実行して、Optinsメニューを選択してAuto refreshとConfig Discriptorsの両方にチェックを入ます。その後、FileメニューからRefreshを選択します。

すると、以下のような画面が現れます。この画面の左側のパネルで、使用しているbluetooth USB ドングルを選択すると、その情報が右側のパネルに現れます。パネルを見ると、vender ID が0A12で、product IDが0001であることがすぐ分かります(この場合、上記のままで、変更しなくて良いことになります)。

2.PCのC:\WINDOWS\infフォルダを開き、bth.infファイルをinfフォルダから外へ引き出し、別な場所に大切に保存しておいてください。もし、infフォルダが見つからない場合、表示しないような設定になっています。任意のフォルダを開き、メニューからツール -> ファルダオプションと進み、ダイアログを表示させ、そこで”表示”タブを選択します。そして、”すべてのファイルとファルダを表示する”という項を選択すると表示されるようになります。

3.bluetooth USB ドングルをPCに差し込むと、デバイスドライバがどこにあるか聞いてきます。そこで、dll.zipを解凍して出てくるdriverフォルダを指定すればuusbd.sysがPCに組み込まれます。PIC18F2550の「USBドライバーのインストール」を参照してください。

ところで、無名のドングルの場合のUSBVIEW.EXEの実行結果は次のようになります。

無名のドングルがハブ構造を持っていることが分かりますので、PIC24FJ64GB002用には使えません。


アプリケーション・ソフトウェア

アプリケーション・ソフトウェアbluehost.zip ver.1.0(柏野政弘氏により作製されたドライバー用DLL uusbd.dll も含んでいます)を解凍して出てくるbluehostフォルダの中のbluehostDlg.cppをメモ帳などで開いて、以下の行を、お持ちのbluetooth USB ドングルに合うように手直しして再コンパイルしてください。具体的には、"USBVIEW.EXE"を実行してbluetooth USB ドングルのエンドポイントの順番を確認して、h2、h3のコメントを外したり付けたりしてください。

h1=Uusbd_OpenPipe(husb,0,0);//first Endpoint 1(81) for HCI event
//for PLANEX
h2=Uusbd_OpenPipe(husb,0,1);//second Endpoint 2(02) for ACL data
h3=Uusbd_OpenPipe(husb,0,2);//third Endpoint 2(82) for ACL data
//for non brand product
// h3=Uusbd_OpenPipe(husb,0,1);//second Endpoint 2(82) for ACL data
// h2=Uusbd_OpenPipe(husb,0,2);//third Endpoint 2(02) for ACL data

たとえば、以下の画面はPLANEX社のBT-MicroEDR1Xの場合の情報ですが、bEndpointAdressが上から下へ81,02,82の順になっていますので、上記のままで(コメントの付け替えをしなくても)良いことが分かります。

さて、PIC基板を電源につなぎ、PC側でbluehost.exeを実行します。PICとPCとが無線でつながると、2つのエディット・ボックスと1つのSENDボタンを持ったダイアログが現れます。上のエディット・ボックスに何か文字を入れ、SENDボタンを押すと、下のエディット・ボックスに文字列が現れる筈です。最初の1文字目だけが変わっていることに気が付くと思います。例えば、“123”と上のエディット・ボックスに記入してSENDボタンを押すと、下のエディット・ボックスに“223”と現れます。最初の文字は、アスキーコードで‘2’ = ‘1’ +1となっています。PIC側で1を足すのです。ここで、PIC基盤の電源を切り、なにかデータを送って試みてください。何の反応もないはずです。これは、PICとPCとの間でHCIレイヤーで無線通信ができていることの確かな証拠です。今回は、入出力できるデータの数は、32バイトに限定しています。56バイトまで拡張できるはずです。それ以上のデータを扱う場合には、複数回に分けて送受信してください。


ファームウェアとソフトウェアの簡易説明

PIC用のファームウェアのmain.cをご覧下さい。245五行目のcase ACL_GET_DATA:とcase ACL_GET_DATA_READ_END:の部分が、PCからのデータを受け取る部分です。ご自分のファームウェアを作製する場合にも、そのまま使用して貰えば問題はありません。一方、case ACL_PUT_DATAの所が、PCへデータを送っている部分です。buf[0]からbuf[7]までは、そのまま使用下さい。後は、buf[8]以降に送りたいデータを入れるだけです。

次に、PC用のアプリケーション・ソフトウェアのbluehostDlg.cppの中の関数CBluehostDlgOnSend()の中身をご覧下さい。 buf[0]からbuf[7]までのデータの意味が少し分かると思います。また、アプリケーション・ソフトウェア側で、どのようにデータを送受信するかが理解できると思います。

以下の図は、bluetooth USB ドングルと(PCあるいはPIC)間でのデータのやり取りを行うエンドポイントの様子を示したものです。エンドポイント0x00は、bluetooth USB ドングルをUSB機器として接続するための情報を(PCあるいはPIC)から送受信するためや、HCIコマンドを(PCあるいはPIC)からbluetooth USB ドングルへ、クラスリクエストとして送るために使用されます。また、エンドポイント0X81はbluetooth USB ドングルから(PCあるいはPIC)へ、HCIコマンドに対する応答などのHCIイベントを送るために使用されます。さらに、エンドポイント0x82はbluetooth USB ドングルから(PCあるいはPIC)、そして、エンドポイント0x02は(PCあるいはPIC)からbluetooth USB ドングルに”ACLで規定されているデータパケット形式”でデータを送るために使用されます。

なお、ここで、HCIはHost Controller Interfaceを、ACLはAsynchronous Connectionless Link(非同期リンク)の略語です。HCIコマンドの詳細は、上記Core v2.0 + EDR.pdfのVolume 2; Part EのSpecification Documents for HCI (Host Controller Interface) を御覧ください。



デバイス・ドライバーのアンインストール

データの送受信だけでしたら、無理してbluetooth-HIDへ移行する必要はありません。HCIレーヤだけで十分です。実際、マイクロソフトのパワーポインタを無線で操作するコントローラを作製し、きちんと働いています。ただ、他のbluetooth機器と併用したい場合などはbluetooth-HIDやRFCOMMに移行するほうが良いと思います。これから、bluetooth-HIDへ移行します。その前に、組み込んだデバイス・ドライバーをアンインストールします。

次の7つのことを行ってください。

1.C:\WINDOWS\regedt32.exeでbluetooth USBドングルに対応するレジストりー・キー、例えば HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\Vid_0A12&Pid_0001を削除する。

なお、消去できない場合は、削除するキーをマウスで選択して、メニューの編集->アクセス許可でフルコントロールにしてください。

2.C:\WINDOWS\system32\drivers\uusbd.sysを削除する。

3.C:\WINDOWS\inf\uusbd.PNFを削除する。

4.C:\WINDOWS\inf\uusbd.Infを削除する。

5.C:\WINDOWS\inf\oem??.PNFを削除する。

6.C:\WINDOWS\inf\oem??.Infを削除する。

なお、\oem??の??は数値ですが、C:\WINDOWS\infフォルダを開いたら、 検索アイコンをクリック、ファイルとフォルダすべてをクリック、ファイルに含まれる単語または句のボックスにkasiwanoと入れると詮索がはじまり、??が分かります。

7.保存していたbth.infをC:\WINDOWS\infの中に戻しておく。


戻る