前回、GATTプロファイルを利用したアプリケーションの例として、Find Me Profile(FMP)の実装を始めました。

Find Me Profileは、その名のとおり、デバイスの場所を知らせ、見つけてもらうための規格です。探しものがここにあるよと知らせる「Find Me Target」(以下、Targetロール)と、探しものをみつける際に手元で操作する「Find Me Locator」(以下、Locatorロール)の2つで構成されます。

単純な実装はすぐに終わってしまったため、前回後半からは双方向にFind Meし合える実装に入りました。ドングル側は終えたので、今回はベースボード側の実装に入ります。ソースコードの補足説明も加えておりますので、ぜひ参考にしてください。

実行環境のご提供

本稿で紹介する実行環境を以下のリンクからダウンロードいただけます。ぜひ、こちらも参照しながら、解説をご覧ください。

なお、サンプルアプリケーションは、利用する環境によっては動作しない場合があります。お問合せへの対応は難しいため、大変恐縮ですが、動作しない場合は、周囲の経験者などに支援してもらってください。こちらの条件にご同意のうえ、ダウンロードをお願いいたします。

>> 実行環境ダウンロード (要 IT Search+会員登録)

ベースボード側(Peripheral)

では、ベースボード側の実装をはじめましょう。

まずは、Peripheral用に新規にプロジェクトを作成します。ただ、既存のworkspaceに追加するかたちで行います(既存のプロジェクトを閉じなければ自動的に追加されます)。ターゲットデバイスやテンプレートはビーコンブロードキャスタと同じく、「PSoC 4xxxxBLE」「Empty schematic」とします。

図1が、全体像です。コンポーネントとして、BLE、LEDの他、SWの入力ポート、デバッグ用UARTを加えています。プロジェクト名は、「BLE_My_FindMe_Peripheral」としています。

図1 : Peripheral側 プロジェクト外観

ひとつのワークスペースに複数のプロジェクトが存在する場合、アクティブなプロジェクトは1つしか存在しえないので、切り替える必要があります。

アクティブなプロジェクトの切替は、プロジェクト名をフォーカス後、マウス右クリックで表示されるポップアップメニュー内の[Set As Active Project]を選択することで行います。

図2 : アクティブプロジェクトの切替

ピンアサインは図3となります。

図3 : Peripheral側 ピンアサイン

BLEコンフィグレーションに移ります。

既存のFindMeプロファイル / Targetロール設定から拡張できるといいのですが、なぜかクライアント機能のクライアントロールを追加できません。上述のFindMeLocatorを仮設定して、そこから変更することは可能なのですが、今回は別のアプローチで行います。

まずは、[General]タブ。[Profile]として「Custom」、[Profile Role]として「Client and Server」を、[GAP Role] として「Peripheral」を選択します(図4)。

図4 : Peripheral側BLE General タブ

続いて、[Profile]タブ。まず、ロール名(Roll名)を[Client] → 「Find Me Locator」、[Server] → 「Find Me Target」へとそれぞれ変更しています。また、各ロールの配下に [Immediate Alert]サービスを追加し(図5)、既存の[Custom Service]を削除しています。

図5 : Immediate Alertサービスの追加

これでCentral側同様、TargetロールとLocatorロールをPeripheral側にも持たせることができました(図6)。

図6 : Peripheral側BLE Profileタブ

最後に[GAP Settings]タブ。[General]セクションと、GAPロールとして、Peripheralを選択したことで、現れた4つのサブセクションのうち、[Scan response packet]サブセクションが変更の対象となります。

[General]セクションにおいては、[Device name]フィールドを、「My FindMe Peripheral」とします。

CySmartを使ってスキャンを行った場合、ここで設定した名称が、表示されます(図7)。

図7 : Peripheral側 BLE Gap Settings/Generalセクション

[Scan response packet]サブセクションにおいては、[Manufacturer Specific Data]項にチェックを入れ、[Company]フィールドとして「Cypress Semiconductor Corporation」を選択、[Data]フィールドとして「34:12」を設定します。(図8)

図8 : Peripheral側 BLE Gap Settings/Scan response packetサブセクション

Manufacturer Specific Dataのフィールド値は、今回のサンプル実装において、コネクション確立時に接続先を識別する際に利用します。詳しくは、ソースコードの項で述べます。

ソースコード

2つのデバイスのソースコードは、一方はCentral、一方はPheripheralといったGAPロールの違いによる差異、LED回路の差異はありますが、それ以外の部分では、基本的には同じ構成になります。以下、ロール別に実装上のポイントを紹介します。

実際のソースコードは、ダウンロードしてご覧ください

Targetロール

Locatorから、Alert Level Characteristicへの書き込みが行われると、とあるイベントが発生し、事前に登録したコールバックルーチンがコールされる仕組みになっています。API CyBle_IasRegisterAttrCallback ()を使って、コールバックルーチンの指定を行います。

コールバックルーチン IasEventHandler()では、API CyBle_IassGetCharacteristicValue()をコールし、Alert Level Characterisicに書き込まれたAlert値を読み出し、グローバル変数gMyAlertLelvelを更新する処理を行っています。

main()ルーチン内のfor()ループで、gMyAlertLevel値に応じたLED点灯処理を行っています。今回の実装では、No AlertでLED消灯、Mild AlertでLED点滅、High Alertで常時点灯としています。

Locatorロール

デバイス間の接続が確立された後に行う必要な処理は、対抗デバイスがサポートしているサービスを知ることです。API CyBle_GattcStartDiscovery()を介して行います。

各々のデバイス上のSWが押下されると、API CyBle_IascSetCharacteristicValue()を使って、対抗のデバイスにAlert値を書き込んでいます。なお、この処理も、Targetロールと同じく、main()ルーチン内のfor()ループ内で行っています。

ちなみに、キーの押下/解放(キーイベント)は、10msec間隔のタイマ割込みによって判断する方法を採用し、チャタリング(キー押下/解放の際の振動によって生じる信号の揺れ)対策も兼ねています。

コネクション処理

Peripheralが、アドバタイジングパケットを発し、Centralが同パケットをスキャンする役回りであることから、コネクション確立までの処理が、PeripheralとCentralで異なります。

Peripheralでは、BLEプロトコルスタック初期化終了後(CYBLE_EVT_STACK_ONイベント受信後)、CyBle_GappStartAdvertisement()を、Centralでは、CyBle_GapcStartScan()をコールします。

ドングルの場合、スマートフォン上のCySmartと異なり、接続先デバイスをリスト表示・選択するUIがありません。FindMeTargetをサポートとする相手のみと自動接続を行うために、Peripheral側で識別情報を送信するようにしています(図8)。

Central側では、この識別情報を確認する処理を行い、特定相手であることが判別できたところで、コネクションを行うようにしています。

動作確認

上記に加えて、各種コンポーネントの初期化処理を行えばソースコードの実装は完了です。その他にUART機能の実装もありますが、今回は、デバック利用なので説明は割愛します。

いよいよ、ビルドです。今回は、2つのプロジェクトがありますので、適宜アクティブプロジェクトを切り替えてビルド&ダウンロードを行う必要があります。

2つのデバイスのダウンロードが正常終了しましたら、ベースボード側のリセットボタンを押下します。ベースボード上のLEDが緑色点灯するはずです。その後、ドングル側のリセットボタンを押下します。コネクションが正常に行われると、ベースボード上のLEDが消灯します。

ドングル側のSW2を押下すると、ベースボード上のLEDが青色で点滅し、ベースボード上のSW2を押下すると、ドングル上のLEDが青色点滅すれば成功です(図9)。

図9 : 動作確認の様子

ふたひねりを加えたことで、紙面的にはやや長くなりましたが、実装規模は大きくはないはずです。Peripheral側に加え、Central側もPSoC/PRoCにすることで、利用の幅はさらに広がるのではないでしょうか。

次回は、いよいよ最終回となります。どういう形でしめるとしますか…。

著者紹介

飯田 幸孝 (IIDA Yukitaka)
- アイアイディーエー 代表 / PE-BANK 東京本社所属プロエンジニア

計測機器開発メーカ、JAVA VMプロバイダの2社を経て、2007年独立。組込機器用ファームウェア開発に多く従事。2015年より新人技術者育成にも講師として関わる。PE-BANKでは、IoT研究会を主宰。

モノづくり好きと宇宙から地球を眺めてみたいという思いが高じて、2009年より宇宙エレベータ開発に、手弁当にて参画。 制御プログラムを担当。一般社団法人宇宙エレベータ協会主催「宇宙エレベータチャレンジ2013」にて、世界最長記録1100mを達成。

宇宙エレベータ開発のご縁で静岡大学の衛星プロジェクトStars-Cに参画。2016年12月、担当ユニットが一足先に宇宙に行き、地球を眺める。

[PR]提供:ホワイトペーパー