自作電子小物/TIPS/Bluetooth-LEスタック/ペリフェラル向け/PIC32版

 
 

マイクロチップ社のマイクロコントローラPIC32MXシリーズと、Bluetooth-USBドングルで動作する、Bluetooth4.0 LE(Low Energy)対応のソフトウエア・スタック・ライブラリです。ATT(Attribute protocol)と、RFCOMM(シリアル通信モデムエミュレーション)、SDP(Service Discovery Protocol)をサポートしています。Bluetoothではセントラル、ペリフェラル、オブザーバ、ブロードキャスターという立ち位置を定義していますが、これはペリフェラル(周辺機器)向けの機能で、お手軽に組込み用途に利用できます。STM32F4版もあります。

Bluetooth-le Stack for Peripheral on PIC32

2015年2月12日

1. 外部仕様
(1)Bluetoothサポート概要
 仕様準拠       :Bluetooth バージョン4.0のペリフェラル機能の一部(BR/EDR + LE)
 デバイス検索機能   :検出可能なデバイスとなります、デバイスを探す事はできません(Scan enable、Advertise)
 サービス情報照会機能 :SDP (Service Discovery Protocol) およびATT (Attribute protocol) の情報提供機能のみ
             相手のサービスを検索する事はできません
 認証・暗号化機能   :あり(V0.3fから)
             設定の変更で、暗号化・認証を要求するようになります
             認証機能はパスキー入力などのサブルーチンをアプリケーション側に用意する必要が有ります
             LEのプライバシー機能は、ランダムデバイスアドレスの受け入れ(チェック)のみ可能
             SecurityManager/ATTのデータ署名機能はありません
             キーは電源が切れたら消失します
 誤り検出、再送機能  :なし
 仮想シリアル通信   :RFCOMMでコネクション待ち
 アトリビュート照会機能:ATTで小物内データの検索および更新機能、通知機能あり(Notify,Indicate)
             相手のATTデータにアクセスする機能はありません
 音声系機能      :なし

(2)動作条件
 対応CPU:PIC32MX250F128以上
 Bluetoothドングル:市販品はおおむね使用可能
 多重動作:マルチタスク不可
 複数インスタンス:複数のドングル接続は未対応
 開発環境
 
 参考情報:
  使用メモリ量:
   プログラム領域:(USBスタック、Cライブラリ等全て含んだサイズ、コンパイラ最適化は-O1)
     バージョン0.3b: 約68kB
     バージョン0.3c: 約66kB
   データ領域:(スタックを除く)
     バージョン0.3b: 静的領域=7.2kB ヒープ領域=約8kB
     バージョン0.3c: 静的領域=9.1kB ヒープ領域=約6kB
  消費電流:
   33mA前後(サンプル回路全体、ドングル7mA、その他26mA、 CPUコアクロック40MHz)


2. ダウンロード

MPLAB X プロジェクトファイル:
 スタック本体と、サンプルプログラムが含まれます。
「Bluetooth4P_PIC32MX_Sample0.3j.zip」 (1.1MB) バージョン0.3j 2017.2.24
 アドバタイズメッセージを自由に設定可能にした
 環境設定ファイルbt_config.hを追加し、ユーザとスタックのソースファイルの分離を推進
 サンプルファイルを心拍計/体温計(認証付)/独自サービスの3種類を用意
 動的にアドバタイズをオン・オフ、強制的にディスコネクトできるAPIを追加
 16ビットUUIDに対応(ATTとアドバタイズ)
 LEの暗号化・認証機能を追加
 BR/EDR(クラッシク機能)の暗号化・認証機能を再設計
 BR/EDRのシグナリング状態遷移を真面目に実装
「Bluetooth4P_PIC32MX_Sample0.3c+.zip」 (1.7MB) バージョン0.3c+ 2016.2.28 
 Harmony v1.06対応、バグ対応、SecurityManager削除。
「Bluetooth4P_PIC32MX_Sample0.3b.zip」 (2MB) バージョン0.3b 2015.5.3
 Harmony v1.01対応、bt_init(),bt_process()を削除、bt_att_data.[ch]を追加

Eagle6.5 回路図データ:
 「PIC32MXtest.zip」 (147kB) 2015.2.26 VUSB間違っていましたので修正してあります

権利関係
GPL v3に準じます。
Bluetooth仕様の情報源については、次の公開情報を元にしています。私の英語読解力の問題があり、誤解の可能性が高いので、重要な場面では使わないようにして下さい。
●BLUETOOTH SPECIFICATION Version 4.0
 Bluetooth SIG 開発者向けサイトdeveloper.bluetooth.orgの公式仕様書
●ETSI TS 101 369 V6.3.0 (1999-03) Technical Specification
    (GSM 07.10 version 6.3.0 Release 1997)
 European Telecommunications Standards Institute
 RFCOMM仕様で参照されているドキュメント

以下は0.3cのみ関係ありません。
●Federal Information Processing Standards Publication 197 (FIPS-197)
 ADVANCED ENCRYPTION STANDARD (AES)
  Rijndael Algorithm: http://csrc.nist.gov/archive/aes/rijndael/wsdindex.html
  Reference source code: rijndael-alg-ref.[ch] rijndael-api-ref.[ch]


サンプルの動かし方

(1)部品を用意


(2)実験回路を組む

普通はブレッドボードが良いでしょう。もちろん ユニバーサル基板だと、なお良いと思います。
安定化したDC5V,100mA以上の電源を用意して下さい。

(3)PCで開発環境を準備
以下のソフトウエアをセットアップしておいて下さい。
  IDE: MPLAB X IDE
  Compiler: XC32
  Library: Microchip Harmony
バージョンは、出来るだけ指定の物を入手して下さい。MPLAB Xは、古い物しかダウンロード出来ない場合でも、インストール後にMPLAB X内からアップデートする方法があります。
プログラマ(書込み器)はPICkit3の前提での手順になります。

(3)MPLAB Xでビルド
・ダウンロードしたプロジェクトファイルは、
    $HOME/Documents/MPLABXProjects
  のディレクトリを作って、そこに展開して下さい。デフォルトの$HOME/MPLABXProjectsとは違うので注意です。
・MPLABXでOpen Projectし、$HOME/Documents/MPLABXProjects/Bluetooth4P_PIC32MX_Sampleを開く
 開いた時に、何もエラーメッセージが出なければ問題ありません。
・ビルドすると、警告メッセージが出ますが正常です。こんなメッセージbuild log.txtです。
・バージョン条件の相違やプロジェクトディレクトリを変えたい場合は、MPLAB Xで開くとエラーメッセージがたくさん出ますので、一つ一つ潰して行く必要があります。プロジェクトのプロパティ内に設定されている、ファイルパス名等を修正すれば何とかなる物もありますが、ソースファイルの格納場所を再度設定し直す(削除して追加)事を行わないと修正出来ない場合もあり、かなり大変です。Bluetooth4P_PIC32MX_Sample.X/nbproject/configurations.xml と project.xmlのファイルを直に修正するのが近道です。ただ設定が、てんでおかしくなってしまう事もあるので、バックアップを取ってから修正した方が良いでしょう。

(4)MPLAB Xからプログラムを書込み
・PICkit3を接続し、プロジェクトのプロパティで、Hardware ToolがPICkit3になっている事を確認。
・5Vの電源を接続、MPLAB Xで書込みボタンを押す。
・PICkit3の赤ランプが点滅して10秒程で書込み完了する。
・1回目は失敗する事があるので、エラー時はとりあえず再度書込んでみる。

(5)実行
・書込み完了と同時に実行が始まります。
・USBスタックの初期化が済むとLED3が点灯します。(点灯しなければCPU自体が動いていない可能性大)
・USB-Bluetoothドングルを挿入すると、ドングルが正常に認識されればLED1が点灯します。
・Bluetoothドングルに通信ランプが付いている場合は、1秒間隔位で点滅していれば、ほぼOK。

詳しい事はSTM32版の「3. サンプルの動かし方」参照して下さい。


4. ユーザアプリケーションでの利用方法

(1)ユーザアプリケーションへの導入
 (a)サンプルプログラムをベースにアプリ機能を追加
  Harmony v1.01での利用の場合、この手順を使って下さい。
  単順にフォルダごと、別ディレクトリ名で複製して下さい。
   例) Bluetooth4P_PIC32MX_Sample -> MyApp001
      Bluetooth4P_PIC32MX_Sample/Bluetooth4P_PIC32MX_Sample.X -> MyApp001/MyApp001.X
  プロジェクトの設定ファイル中の名称をテキストエディタで修正して下さい。
    ファイル:MyApp/MyApp.X/nbproject/project.xml

   水色の部分を変更。UUIDはだぶらないように別の値にして下さい。
   詳しい手順です。
    MPLAB X プロジェクトコピー方法.txt
   コピーしたプロジェクトで動く事を確認したら、ユーザのロジックを組込んで下さい。

 (b)既存アプリにBluetooth機能追加
  Harmony v1.04以降での利用の場合、この手順を使って下さい。
   ユーザアプリケーションへの導入手順 0.3c+.txt

 (c)デバイス名称などの設定変更
   詳しい事はSTM32版の「4. アプリケーション適用」を参照して下さい。

(2)ドングルが最初だけ認識できない場合
  harmony v1.06では、ドングルによって認識できない場合があります。
  Harmonyのソースを修正すれば、回避出来ます。
  以下のソースファイルを入れ替えるか、プロジェクト内のソースとして取込んで下さい。
    usb/src/usb_host.c  <--> usb/src/usb_host_FIX.c


5. 内部仕様
Bluetoothスタックの開発者向け参考情報です。

(1)基本事項
このライブラリは、STM32版を移植したものです。
細かい所は、そちらを参照して下さい。
ここでは、PIC32固有の部分を説明します。

(2)ソースファイル
ソースファイルの階層:
  v0.3b: SourceTree.png
  v0.3c: SourceTree0.3c.png
 

ソースファイルの一覧:
  v0.3b: SourceFileList.pdf
  v0.3c: SourceFileList 0.3c.pdf


(3)HCIトランスポート層

 (a)USBワイヤレスコントローラ/Bluetoothクラス
 Microchip社から提供されているUSBホスト用ライブラリは、CDCやマスストレージクラスのみのサポートで、Bluetoothドングルを使うための「Wireless Controller Class」は、当然の事ながらありません。
Microchipからは、USBライブラリが2種類提供されています。MLAと呼ばれるものと、Harmonyと呼ばれる物ですHarmonyの方が新しく、PIC32の場合の推奨フレームワークですので、こちら側の選択となります。Harmonyのヘルプファイルが唯一のドキュメントです。USBホストのクラス処理の説明を絵にしてみました。
 

USBホスト共通処理(usb_host.c)は、デバイスが挿入されたらエニュメレーション処理(デバイスディスクリプタ、コンフィギュレーションディスクリプタを読み込んで解析する)を行い、対応するクラスモジュールに制御を渡します。クラスと
モジュールとの結びつけはTPListテーブルに従います。
クラスモジュールは、そのクラス特有のUSB通信を行う処理を実装します。Bluetoothクラス(正確にはワイヤレスコントローラクラスの中のBluetooth-HCIサブクラス)では、コントロール転送、インタラプト転送、バルク転送入力、バルク転送出力の4本のパイプを開設し、それぞれ透過的にデータ転送を行うのが役割になります。
Bluetooth仕様書では、HCIトランスポート層の記述「 BLUETOOTH SPECIFICATION Version 4.0 Volume 4 Host Controller Interface [Transport Layer], Part B USB transport layer」にあります。

Harmony1.01から1.06は、usb_host.cのAPIが大きく変わりました。利用する時に注意すべき点をご紹介致します。
・ドングルが認識されない場合がある(?)
   本来ドングルから応答されるはずのメッセージが来ない事が、特定の個体の電源投入直後に発生する
   usb_host.c内のリトライ機能が働かないようだ(バグ?仕様?ソースコードを読み切れないだけ?)
   Harmonyのソースコードを改修して回避する(前述通り)
・バッファ長は小さ過ぎてはいけない
   USB_HOST_DeviceTransfer()で送受信をリクエストする時のバッファ長は、USB上のパケットサイズとは無関係に
   指定可能なので、USBパケットの分解/組立てを行ってくれるので楽
   ただしインタラプト転送では16バイト以下にすると正しく機能しなかった
   バルク転送でも同じかもしれないが未確認
   単純に大きくすれば回避出来る
   受信時のメッセージダンプ例:バッファ長減らしたら初期化失敗するようになった.txt
・正常受信OKのステータスでも実際はデータが格納されない事がある
   .interfaceEventHandler(データ受信時のコールバック関数)で返される eventData->resultが
   USB_HOST_RESULT_SUCCESSでも、ventData->length長分の受信データがバッファに入っていない事がある
   Harmonyのソースコードを改修する必要があるが、解読し切れなかったので、アプリ側に回避コードを埋め込む
   回避法は、受信前にバッファをゼロクリアし、ゼロのままなら受信リトライする
   受信時のメッセージダンプ例:Lightblueで接続するだけでエラー.txt



 スタック内部の動作について興味がある方は、「自作電子小物/TIPS/Bluetooth-LEスタック/ペリフェラル向け/設計内部情報」をご覧ください。 



5. あとがき
300円のDIPパッケージのマイコンに、直接USB-Bluetoothドングルが挿せるんです。これでBluetoothを利用出来る幅が、かなり広がります。
Harmonyのベータ版の頃から移植作業を開始しましたが、エニュメレーションがどうしても通らず、Harmonyが悪いものだと判断して正式版(V1.0~)を待っていました。時間が出来たので集中して調べたら、結局使い方が悪かっただけという結果でした。(BTドングルのUSBディスクリプタがちょっと変わっているんですよ)その後は、Bluetoothクラスドライバ自体は単純・簡単、肝心なスタック本体は無改造で、さくっと動いてしまいました。あっけないという感動です。
Bluetooth-LE_Stack_for_peripheral_on_PIC32_files/Bluetooth4P_PIC32MX_Sample0.3j.zipBluetooth-LE_Stack_for_peripheral_on_PIC32_files/Bluetooth4P_PIC32MX_Sample0.3c+.zipBluetooth-LE_Stack_for_peripheral_on_PIC32_files/Bluetooth4P_PIC32MX_Sample0.3b.zipBluetooth-LE_Stack_for_peripheral_on_PIC32_files/PIC32MXtest.ziphttp://developer.bluetooth.org/TechnologyOverview/Documents/Core_SPEC.pdfhttp://www.etsi.orghttp://csrc.nist.gov/archive/aes/rijndael/wsdindex.htmlBluetooth-LE_Stack_for_peripheral_on_PIC32_files/build%20log.txtBluetooth-LE_Stack_for_peripheral_on_STM32.htmlBluetooth-LE_Stack_for_peripheral_on_PIC32_files/MPLAB%20X%20%E3%83%95%E3%82%9A%E3%83%AD%E3%82%B7%E3%82%99%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B3%E3%83%92%E3%82%9A%E3%83%BC%E6%96%B9%E6%B3%95.txtBluetooth-LE_Stack_for_peripheral_on_PIC32_files/%E3%83%A6%E3%83%BC%E3%82%B5%E3%82%99%E3%82%A2%E3%83%95%E3%82%9A%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%B8%E3%81%AE%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86%200.3c+.txtBluetooth-LE_Stack_for_peripheral_on_STM32.htmlBluetooth-LE_Stack_for_peripheral_on_STM32.htmlBluetooth-LE_Stack_for_peripheral_on_PIC32_files/SourceTree.pngBluetooth-LE_Stack_for_peripheral_on_PIC32_files/SourceTree0.3c.pngBluetooth-LE_Stack_for_peripheral_on_PIC32_files/SourceFileList.pdfBluetooth-LE_Stack_for_peripheral_on_PIC32_files/SourceFileList%200.3c.pdfBluetooth-LE_Stack_for_peripheral_on_PIC32_files/%E3%83%8F%E3%82%99%E3%83%83%E3%83%95%E3%82%A1%E9%95%B7%E6%B8%9B%E3%82%89%E3%81%97%E3%81%9F%E3%82%89%E5%88%9D%E6%9C%9F%E5%8C%96%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F.txtBluetooth-LE_Stack_for_peripheral_on_PIC32_files/Lightblue%E3%81%A6%E3%82%99%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%9F%E3%82%99%E3%81%91%E3%81%A6%E3%82%99%E3%82%A8%E3%83%A9%E3%83%BC.txtBluetooth-LE_Stack_for_peripheral_-_Design_info.htmlBluetooth-LE_Stack_for_peripheral_-_Design_info.htmlBluetooth-LE_Stack_for_peripheral_on_PIC32_files/Bluetooth4P_PIC32MX_Sample0.3j_1.zipBluetooth-LE_Stack_for_peripheral_on_PIC32_files/Bluetooth4P_PIC32MX_Sample0.3c+_1.zipBluetooth-LE_Stack_for_peripheral_on_PIC32_files/Bluetooth4P_PIC32MX_Sample0.3b_1.zipBluetooth-LE_Stack_for_peripheral_on_PIC32_files/PIC32MXtest_1.zipBluetooth-LE_Stack_for_peripheral_on_PIC32_files/%E9%83%A8%E5%93%81%E8%A1%A8.pdfBluetooth-LE_Stack_for_peripheral_on_PIC32_files/Test01.pdfBluetooth-LE_Stack_for_peripheral_on_PIC32_files/SourceFileList%200.3c_1.pdfBluetooth-LE_Stack_for_peripheral_on_PIC32_files/Harmony%20v1.06%20USB%20HOST%20Library%20structure.pdfBluetooth-LE_Stack_for_peripheral_on_PIC32_files/Bluetooth4P_PIC32MX_Sample0.3c+_2.zipshapeimage_1_link_0shapeimage_1_link_1shapeimage_1_link_2shapeimage_1_link_3shapeimage_1_link_4shapeimage_1_link_5shapeimage_1_link_6shapeimage_1_link_7shapeimage_1_link_8shapeimage_1_link_9shapeimage_1_link_10shapeimage_1_link_11shapeimage_1_link_12shapeimage_1_link_13shapeimage_1_link_14shapeimage_1_link_15shapeimage_1_link_16shapeimage_1_link_17shapeimage_1_link_18shapeimage_1_link_19shapeimage_1_link_20