PIC24FJ64GB002(Windows 10)

  Bluetooth USB(Ver 4.0)ドングルを介してPIC24FJ64GB002とパーソナルコンピュータ(PC:Windows10 64bit Professional Ver.21H2)をHOGPプロファイルで無線接続します。使用したドングルは、BUFFALO社のBSBT4D200を2個です。1つはPC用に、他の1つはPIC24FJ64GB002用に使用しています。PCに直接ドングルを差し込みます。すると、Windows10の標準Bluetoothドライバが使用されることになります。

PCに差し込むドングルについて、BUFFALO BSBT4D200の他、iBUFFALO社のBSBT4D09BKとLogitic社のLBT-UAN04C2BKは動作確認が取れています。PICに差し込むドングルは、BSBT4D200、BSBT4D09BK、LBT-UAN04C2BKの他に、Princeton社のPTM-UBT7、Planex社のBT-Micro4で動作確認がとれています。ただ、PTM-UBT7とBT-Micro4とはPC用には使用できないようです。理由は不明です。

  Bluetooth V4.0の特徴の1つは、低消費電力モード(Low Energy)で通信ができることです。ここでは、HOGP(プロファイル)[HID Over GATT Profile]を使います。GATTプロファイル(Generic Attribute Profile)とは、ATTプロトコル(Attribute Protocol)を利用したプロファイルで、 HOGPはGATTの上(Over)にHIDを構築するためのプロファイルです。 Bluetoothのマニュアルについては、Core_V4.0.pdfを御覧ください。HCI、ATT、GATT、SMPについては、それぞれマニュアルのVol.2のPart E、Vol.3のPart F、Vol.3のPart G、Vol.3のPart Hをご覧ください。

  なお、PIC用のファームウェアを開発するには、CQ出版社の「インターフェース」2013年5月号(あるいは、同社の「Bluetooth無線でワイヤレスI/O」の第3版の10章と11章)が参考になります。

目次


PIC回路

  回路図と実際の回路を以下に示します。以下、この回路を「PIC回路」と呼ぶことにします。

  回路図に中のピンヘッドJP2には、必要に応じて、「USB シリアル変換器」を接続します。デバック情報などをTera Termでモニターするために使用します。念のため、回路を以下に示します。

「USB シリアル変換器」の左側に、4ピンのピンヘッドがありますが、上から1,2,3,4番ピンと呼ぶことにします。「PIC回路」のピンヘッドJP2も1番ピンから4番ピンまであります。両ピンヘッドの1,2,4番ピンどうしを、それぞれ接続します。3番ピンはどこにも配線されていませんので、接続する必要はありません。

また、「USB シリアル変換器」の右側にUSBジャックがありますが、USBケーブルでPCと接続します。そして、PC側でTera Termを起動すると、その画面上にデバック情報を表示できるようになります。ボーレートは57600です。

注意:USBドングル(BSBT4D200)は3.1V以下になると動作しません。


開発環境

  MPLAB Code Configurator(Classic)をインストールしていない場合はMPLAB Code Configurator(Classic)の導入を参照ください。必要に応じて、Tera TermVisual Studio 2022をインストールします。また、PCとPCに差し込んだBluetooth USB(Ver 4.0)ドングル間を行き来するUSBデータをモニターしたければ、Free USB Analyzerをインストールします。



LEキーボード

  ファームウェアは、keyboardLE_MCC_Windows10.X.zipです。解凍して出てきたフォルダーはMCCインストール時に作られるMPLABXProjectsフォルダーに入れます。MPLAB Xで、このファームウェアをPICに書き込みます。「USB シリアル変換器」を使ってデバック情報をPCに(Tera Term画面上に)出力する場合は、main.cの中にある//#define DEBUG_MODEのコメント//を消してください。

PIC回路とPCを接続した後(接続方法は下記参照)、適当なテキストエディタ(メモ帳など)を開き、PICの2、3、6、7ピン(ファームウェアでプルアップしています)のいずれかをGNDに接続すると、それぞれ、a、b、A、Bなる文字がエディタ画面に現れます。


LEマウス

  ファームウェアは、mouseLE_MCC_Windows10.X.zipです。解凍して出てきたフォルダーはMCCインストール時に作られるMPLABXProjectsフォルダーに入れます。MPLAB Xで、このファームウェアをPICに書き込みます。「USB シリアル変換器」を使ってデバック情報をPCに(Tera Term画面上に)出力する場合は、main.cの中にある//#define DEBUG_MODEのコメント//を消してください。

PIC回路とPCの接続が完了すると(接続方法は下記参照)、マウスカーソルが円を描きます。


LE一般的HID

  ファームウェアは、generalLE_MCC_Windows10.X.zipです。解凍して出てきたフォルダーはMCCインストール時に作られるMPLABXProjectsフォルダーに入れます。MPLAB Xで、このファームウェアをPICに書き込みます。「USB シリアル変換器」を使ってデバック情報をPCに(Tera Term画面上に)出力する場合は、main.cの中にある//#define DEBUG_MODEのコメント//を消してください。

  パーソナル・コンピュータ用のアプリケーション・ソフトウェア(Visual Studio 2019でコンパイル、同2022でもコンパイル可)は、generalLE_MCC.X.zipを解凍して出てきたフォルダーの中のHOGP\Release\HOGP.exeです。PIC回路とPCを接続した後(接続方法は下記参照)、これを実行すると、2つのエディット・ボックスと1個のOKボタンを持つダイアログ(対話)・ウィンドウが現れます。 例えば上のエディット・ボックスに123と入れて、OKボタンをクリックすると、下のエディット・ボックスに223と現れれば、正常に動作しています。送信された文字列のうち、第1番目の文字だけが変わったもの(アスキーコードで1足されたもの)が現れるはずです。

アプリケーション・ソフトウェアはVisual C++用ですが、Visual C++/CLI用やC#用には、PIC32MX270F256B-50I/SP (HARMONY: v2.06)にあるutilities2017B.zipにて、vidとpicを与えているファイル中で、vidを04d8に、pidを003Fに変えるだけです。


注意事項

1.MCCでは、一般的ホストは提供されていませんので、CDCホストを手直しします。MCCで生成されるファイルの内、CDCに関係するusb_host_cdc_interface.husb_host_cdc_interface.cusb_host_cdc.husb_host_cdc.cusb_host_cdc_config.hの5つのファイルは、プロジェクトから除外(Exclude)します。削除(Remove)してはいけません。これら5つのファイルを削除すると、MCCで再度コード生成したときに、これら5つのファイルが新たに生成されプロジェクトに追加(Include)されます。そのままコンパイルするとエラーとなります。5つのファイルをプロジェクトから除外(Exclude)してもファイル自体は物理的に存在しますので、MCCで再度コード生成したとしても、これら5つのファイルが新たに生成・置換されることはありません。したがって、コンパイルエラーにはなりません。

2.一般的ホストに関しては、たとえばMicrochip Libraries for Applications(MLA)のv2013-06-15の中のmicrochip_solutions_v2013-06-15\USB\Host - MCHPUSB - Generic Driver Demoが参考になると思います(私はこれよりかなり古いバージョンのものを参考にしています)。CDCに関係する上記5つのファイルの代わりに、このDemoからmain.cusb_host_generic.husb_host_generic.c(usb_host_config.cと名前を変える)、usb_config.h(usb_host_config.hと名前を変える)、usb_config.cをプロジェクトに付け加え編集を行えば良いと思います。



接続方法

1.最初の接続は、PIC回路にて、タクトスイッチ(SW1)を押しながら電源を入れます。電源を入れた後、タクトスイッチは2秒程度押したままにします。その後はタクトスイッチを放してもかまいません。

2.パーソナル・コンピュータ(PC)から接続します。PCのタスクバーに、Bluetoothアイコンがありますので、これをマウスでクリックします。すると、以下のような「Bluetoothとその他のデバイス」画面が現れます。

この画面で、「Bluetoothまたはその他のデバイスを追加する」と書かれた場所をクリックすると、次のような画面が現れます。

この画面で、「Bluetooth」と書かれた場所をクリックすると、次のような画面が現れます。この画面に接続したいデバイスのアイコンが表示されますので、そのアイコンをクリックします。接続が完了すると、画面下方にある「キャンセル」ボタンが「接続」ボタンに変わります。そして、PIC回路上のLED(D1)が点灯します。

また、「Bluetoothとその他のデバイス」画面の中に、接続完了とともに、次のような画面が現れます。なお、最初の接続では電池残量を100%に設定しています。

ところで、もしBluetoothアイコンがタスクバーになければ、ウィンドウ・メニューから「設定」を選び、そのホーム画面から「デバイス(Bluetooth、プリンタ、マウス)」を選択して、「Bluetoothとその他のデバイス」画面を出します。この画面の右側にある関連設定で「その他のBluettothオプション」を選びます。オプションタブにて「bluetoothアイコンを通知領域に表示する(N)」というチェック・ボックスにチェックを入れます。これで、Bluetoothアイコンがタスクバーに現れます。

  3.2回目以降の接続(再接続)は、タクトスイッチ(SW1)を離したまま、PIC回路の電源を入れるだけです。接続が完了すると、PIC回路上のLED(D1)が点灯します。

なお、PCの電源を切って、再度電源を入れた後、再接続を行うと、次のように電池残量が50%と表示されるよう設定しています。各ファームウェアのmain.cで、ケース文case GATT_BATTERY_NOW_RE_RES:の中に、buf[11]=0x32;なるコードがありますが、この0x32(10進数で50)が電池残量50%を意味します。

ところで、再接続に少し時間が掛かる場合もあります。というのは、PIC回路の電源を切ると、PCとの接続が切れるのですが、PC側が接続切断を認識するのに10秒程度時間が必要だからです。PIC回路の電源を切った後、約10秒後、PC側では「接続済み」状態(接続状態)から「ペアリング済み」状態(接続切断状態)になります。

この「ペアリング済み」状態になった後ならば、2秒程度で再接続できます。

注意:「接続済み」状態から「ペアリング済み」状態への強制移行は、PIC回路側から切断命令をPCに送ることにより(具体的には、main.cの中のcase L2CAP_DISCONNECT_REQ:を実行することにより)可能です。問題は、電源を切る直前に、この切断命令をどの様な方法でPCに送るかにあります。付加回路を考えています。


LE一般的HIDの応用(OTTOの足)

  OTTOと言う名の2足歩行ロボットがあります。足を前に振り出す機構が無いにもかかわらず、なぜOTTOロボットが前進できるのかに興味を持ち、以下の写真のようにOTTOロボットの足(正確には脚と足)だけを作ってみました。左の写真が正面で、右のものが背面です。足の制御はLE一般的HIDを利用してパーソナル・コンピュータ(OS:Windows10)で行っています。

 

1.足の作成

  足の作成に先だち、CNC-Paradise可愛いOtto DIYロボットを作る2を、そして特にそこで提供されているアクリル板の加工図BodyPartsのDXFファイルを参照しました。

  足の材料は、2mm厚の白アクリル板と3mm厚の黒アクリル板、マイクロサーボ9g SG-90(秋月電子通商)4個、外径6mmφ長さ10mmのプラスチックスペーサ(M3用)2個、M3プラスチックビス2本、M2ステンレスビス・ナット12組です。アクリル板の加工は、主にHOZAN社のPCBカッター K-111で行いました。CNCを含め、その他の電気工具は使用していません。あとは糸鋸(+自作のすり板)、ハンドドリル、組やすり、M2とM3用ハンドタップ、ルータビット(ダイソー100円)を使用して仕上げました。アクリル板の加工図(実寸)は、2mm厚の白アクリル板用3mm厚の黒アクリル板用に示した通りです(図中に必要の無い線も描かれています)。これらの図をダウンロードしてプリンターで印刷する場合、カスタム倍率100%で印刷してください。

2.制御回路

  足を制御する電子回路を以下に示します。電源は単三充電式電池1.2Vを4本です。定格電圧は4.8Vになりますが、実際の電圧は5V以上になります。回路図では5Vと表記しています。この電圧を直接掛けるのはサーボモータだけです。あとは、3端子レギュレータで3.3Vを得て、これをサーボモータ以外の電源としています。なお、回路図中のSW2は電源スイッチです。

拡大図 <=ここをクリック

実際の回路を以下に示します。

別途OTTOの頭部分を作り、その中に回路を収めることを考えると、電子回路基板をもう少し小さく(74mm×74mm以内)作りたいところです。


3.サーボホーンアームの取付けとその位置補正

  ①取付け:サーボモータにサーボホーンアームを取付ける前に、ファームウェアMCC_OTTO.X.zipを解凍して出てくるotto.cの中の配列trimの要素を trim[4] = {0, 0, 0, 0}のように、すべてゼロとします。回路図でのSW3をProgram側にした後、ファームウェアをPICに書き込み実行します。書き終わったらRun側に戻します。サーボモータが動きます。上の正面・背面写真(ホーム位置と言います)に近いような状態になるように、サーボモータにサーボホーンアームを取り付けます。

  注意:SW3をProgram側にすると、サーボモータの電源が切れ(サーボモータを回すことができない状態)、ファームウェア書込器(例えばICD3)に3.3Vが掛かります(Programできる状態)。逆にRun側にすると、サーボモータの電源が入り(サーボモータを回すことができる状態)、ファームウェア書込器への3.3Vは断たれます(Programできない状態)。SW3を無くすると、とても危険です。サーボモータが動いている状態でファームウェアを書き込むと、PICがリセットされたとき、短いパルスがサーボモータに掛かってしまいます。その結果として、サーボモータが意図せずに反時計回りに回りきってしまいます。サーボモータに固定されている物同士が干渉する場合、互いに衝突してしまうことになります。

  ②位置補正:サーボモータにサーボホーンアームを取り付けると、両者の噛合わせ具合により、ホーム位置から若干脚や足が曲がった状態になると思います。きちんとホーム位置になるようファームウェア上で補正します。配列trimの各要素を適当に変えては(整数値で単位は度:degree)ファームウェアをPICに書き込み実行することを繰り返してホーム位置になるようにします(試行錯誤)。なお、trim[0]は左脚(LL:Left Leg)、trim[1]は右脚(RL:Right Leg)、trim[2]は左足(LF:Left Foot)、trim[3]は右足(RF:Right Foot)に相当する補正です。trim[0]から順次補正して行けば良いと思います。

  ③動作確認:main.cの71行目の while(1); をコメント文にします。ファームウェアをPICに書き込み実行するとOTTOが前進歩行を始めるはずです。74行目の関数walk(1., 1000, 1);において、第1引数は繰返しの数、第2引数は周期(大きい数値にするとゆっくり動く:単位はmsec)、そして第3引数は動く方向(1とすると前進、-1とすると後進)です。周期を長くして、脚と足がどう動くかを観察すると面白いです。

4.Bluetooth LE制御

  Bluetooth LE制御用のファームウェアはgeneralLE_MCC_OTTO.X.zipです。これを解凍して出てくるotto.cの中にある配列trimの要素を、上記補正で得た値で修正します。修正後のファームウェアをPICに書き込んだあと、パーソナル・コンピュータとBluetooth LE接続します(上記接続方法を参照)。

パーソナル・コンピュータ用のアプリケーション・ソフトウェア(Visual Studio 2019でコンパイル、同2022でもコンパイル可)は、generalLE_MCC_OTTO.X.zipを解凍して出てきたgeneralLE_MCC_OTTO.Xフォルダーの中のHOGP\Release\HOGP.exeです(LE一般的HIDで使用したものと同じ)。アプリケーション・ソフトウェアを実行すると次の図のようなダイアログが現れます。命令(前進の"f"か、後進の"b"か、左進の"l"(エル)か、右進の"")のうち1つの文字を以下のように上のボックスにタイプしてOKボタンを押すと、与えた命令にしたがってOTTOが動きます。

generalLE_MCC_OTTO.Xの中のmain.cの2238行目以下にあるケース文(case HID_WRITE_DATA:からcase HID_WRITE_DATA:まで)の中で、命令の解釈とサーボモータ制御を行っています。ところで、LE一般的HIDのgeneralLE_MCC.XgeneralLE_MCC_OTTO.Xをファイル比較ソフト(例えばWinMerge)で比較すると両者の違いが分かります。

5.参照したファームウェア

  PICのファームウェア作成時には、Otto DIY ESP(Arduino用)を参照しました。Otto DIY ESPでは、generalLE_MCC_OTTO.Xでは実現していない色々な動作を実現しています。それらの動作をPICで実現するためには、Otto DIY ESPの中のOtto9.hOtto9.cppOscillator.hOscillator.cppESP32Servo.hESP32Servo.cppを理解することが必要です。なお、OTTOの動作の基本はOscilltor.cppの中のrefresh()関数にあります。この関数でサーボモータの回転角を正弦波的に変えています。



マスター(AB Shutter3)

  これまでは、PC(パーソナル・コンピュータ)がマスターで、PIC回路がスレーブでした。ここでは、PIC回路をマスターとし、リモコンシャッター(AB Shutter3)をスレーブとして両者を接続します。

1.ファームウェアとその変更

  ファームウェアは、HCImasterLE_MCC.X.zipです。ただし、このファームウェアを正常に動作させるためには、その一部を変更する必要があります。

PIC回路の周りに複数のBluetoothデバイスがあると、その中からリモコンシャッターだけを選択する必要があります。しかし、PCと違ってPIC回路には表示装置がないので、周りにある複数のBluetoothデバイスのすべてを表示装置に表示させて、その中から接続したいものを選択するという方法は採れません。そこで、用いるリモコンシャッターのBluetoothアドレスを前もって調べておいて、それがPIC回路で検索されたとき、接続動作に入るという方法を採用しました。

リモコンシャッターのBluetoothアドレスを調べるためには、PCと接続した後、ここから4つ上の画面で「その他のBluettothオプション」を選びます。すると、Bletoothの設定画面が出てくるので、ハードウェア・タブを選択し、デバイスとしてAB Shutter3を選び、プロパティ・ボタンを押します。

以下のように、プロパティ画面が現れるので、詳細タブを選択し、プロパティとしてハードウェアIDを選ぶと、その値として、「ffff3ef3f22d」を含んだ文字列が現れます。この「ffff3ef3f22d」がリモコンシャッター(AB Shutter3)のBluetoothアドレスです。ただ、ファームウェアでは、この16進数をリトルエンディアンで、2d f2 f3 3e ff ff(6バイト)として扱います。

HCImasterLE_MCC.X.zipでは、これを解凍し出てくるフォルダーの中にmain.cがあります。その428行目に

case HCI_CMD_SCAN_ENABLE_END1:
        if(buf1[6]!=0x2d){
               HciState = HCI_CMD_SCAN_ENABLE_END;
                break;
       }

というコードがあります。ここで、buf1[6]からbuf1[11]までに、PIC回路の周りにある(複数の)BluetoothデバイスのBluetoothアドレスが次々と入ってきます。このファームウェアでは、手抜きをして、2d f2 f3 3e ff ff の最初の1バイトが2dでない間は、次のステップへ進めないようにしています。 6バイトすべてが一致しない間は次のステップへ進めないようにしたほうが無難だとは思います。

2.操作方法

  ①ファームウェアの書き込み: コードを手直ししたら、PICにファームウェアを書き込みます。

  ➁初回接続: PIC回路の電源を入れた後、リモコンシャッターの電源をスイッチ入れます。暫くすると、PIC回路のLEDが光ります。これで、接続が完了します。リモコンシャッターのiOSボタンを押すとLEDが消灯し、androidボタンを押すとLEDが点灯します。

  ③再接続方法: 初回接続の後、リモコンシャッターの電源スイッチを切った場合、接続が切れ、PIC回路のLEDが消灯します。再接続するためには、リモコンシャッターの電源スイッチを入れるだけです。一方、リモコンシャッターに触れないでいると(約90秒ほど)、自動的に接続が切断され、PIC回路のLEDが消灯します。再接続するためには、リモコンシャッターのiOSボタン、あるいはandroidボタンを1回押すだけです。(ボタンを押しても再接続できないときは、リモコンシャッターの電源を入れ直します)。いずれの場合もPIC回路の電源を切る必要はありません。

3.注意

  ①「USB シリアル変換器」を使ってデバック情報をPCに(Tera Term画面上に)出力する場合は、main.cの中にある//#define DEBUG_MODEのコメント//を消してください。 デバック情報のログは、HCImasterLE_MCC.X/DOC/logPIC.txtです。

  ➁ファームウェアでは、GATT(Generic attribute プロファイル)をまともに扱っていません。マスターであるPIC回路は、本来、リモコンシャッターが持っているサービスを調べ上げる必要があります。ただ、接続相手がリモコンシャッターだけなので、リモコンシャッターがどんなサービスを持っているか(GATTデータベース)を前もって調べておけば、PIC回路にてサービスを改めて調べる必要がなくなります。結果として、ファームウェアを大幅に簡略化できます。

  ③GATTデータベースは、PCとリモコンシャッターを接続し、その間のデータの流れを(例えばFree Device Monitoring Studioで)調べることにより得られます。データ転送時のログはHCImasterLE_MCC.X/DOC/logPC.txtに、そして、それを基に作成したGATTデータベースはHCImasterLE_MCC.X/DOC/Shutter.xlsxに保存してあります。

  ④GATTデータベース(HCImasterLE_MCC.X/DOC/Shutter.xlsx)から、ハンドル番号0x0013と0x0017を認識番号として、リモコンシャッターからPIC回路へデータパケットが流れてくることが分かります。以下は、「USB シリアル変換器」を用いてモニターした、ボタン押下時のデータパケット例です。

iOSボタン
押す///////////////
48 20 09 00 05 00 04 00 1B 13 00 01 00
放す///////////////
48 20 09 00 05 00 04 00 1B 13 00 00 00

androidボタン
押す///////////////
48 20 09 00 05 00 04 00 1B 17 00 00 28
48 20 09 00 05 00 04 00 1B 13 00 01 00
放す///////////////
48 20 09 00 05 00 04 00 1B 13 00 00 00
48 20 09 00 05 00 04 00 1B 17 00 00 00

  ⑤PIC回路とリモコンシャッターとの接続時に、前者から後者へIRK(Identity Resolving Key)を送る必要があります。IRKはランダム数(ER)からd1関数を使って作成するのですが、計算が面倒なので固定値としています。main.cの200行目の配列IRK[16]にその値が入っています。この値は、PCとリモコンシャッターを接続したときに、PCが計算した値です。Free Device Monitoring Studioで調べました。HCImasterLE_MCC.X/DOC/logPC.txtでは、54行目に

48 00 15 00 11 00 06 00 08 67 9C 55 CD AC 80 3D 00 E1 18 F3 73 66 67 A3 D1

なる行がありますが、ここで赤字で書いた部分がIRKです。もちろん、この値を固定値として、IRK[16]に設定しても構いません。


戻る