ビーコンオブザーバの概要
前回は、PSoC BLE Pioneer Kitを使って、ビーコン(ブロードキャスタ)を実現しました。今回は、ビーコン受信機側(オブザーバ)をPSoC BLE Pioneer Kit上で実現します。
ビーコンとして、温度・湿度情報を発信するサイプレス社製のBLEセンサビーコン「CYALKIT-E02 Solar-Powered BLE Sensor Beacon」(以下、センサビーコン)を想定しています。ですが、PSoC BLE Pioneer Kitを複数台お持ちの方は、前回のサンプル実装がそのまま利用できます。
センサビーコンは、前回も触れましたが、iBeaconフォーマットの[Minor Number]フィールド(2 Oct)に温度情報(1 Oct)と湿度情報(1 Oct)を乗せています。さらに、[Major Number]フィールドを使って、BLEセンサビーコンが複数存在しても、識別できる様 番号情報も乗せています(図1)。
今回は、PSoC BLE Pioneer Kitがもつシリアル通信機能も使って、PC側のターミナルエミュレータに、ID情報、温度情報、湿度情報を、表示させることを実現します。
実行環境のご提供
本稿で紹介する実行環境を以下のリンクからダウンロードいただけます。ぜひ、こちらも参照しながら、解説をご覧ください。
なお、サンプルアプリケーションは、利用する環境によっては動作しない場合があります。お問合せへの対応は難しいため、大変恐縮ですが、動作しない場合は、周囲の経験者などに支援してもらってください。こちらの条件にご同意のうえ、ダウンロードをお願いいたします。
手順1 ワークスペース作成から回路作成まで
早速、新規プロジェクトを作成してみましょう。今回も、PSoC Creator3.3CP3を前提としています。
新規プロジェクトは、既存のワークスペースに追加することも可能です。その場合、[Create Project]ダイアログの[Workspace]フィールドの選択として[Add to current workspace]が選択されている必要があります(図2)。
続いて、回路図を作成します。今回は、主役のBLEに加えて、シリアル通信を行うSCPコンポーネントも利用します。右ペインにあるコンポーネントカタログ(Component Catalog)のCommunicationグループより[UART (SCB mode)]を選択します。シリアル通信コンポーネントとして、[UART]コンポーネントも存在しますが、今回は、周辺機能としてPSoCデバイスに組み込まれているSCBコンポーネントを利用します(図3)。
そして、今回も通信状態を示すLEDと制御ポートも用意します。最終的な回路図は、図4の様になります。
さらにピンアサインも忘れずに行っておきましょう。左ペインにあるWorkspace Exploreより拡張子[.cydwr]が付いたファイルをクリックし、[Pins]タブを選択します。LED緑の信号線[PO_LED_G]は、Port[P3-6]に、SCBブロックの送信線[SCB:rx]はPort[P1-4]に、受信線[SCB:tx]は、Port[P1-5]に接続するよう設定します(図5)。
手順1の最後、クロック設定ですが、今回はILOは使用しません。また、前回同様ECO24MHzを主クロックとして選択します。
[Configure System Clocks]ダイアログは、[Clocks]タブにて、画面情報にある[Edit Clock]アイコンをクリックすることで表示されます。
手順2 コンポーネントのコンフィグレーション設定
今回は、コンポーネントが二つあります。まずは、BLEコンポーネントから。
今回も、コンポーネントの名称(ID)を、’BLE_1’から’BLE’としています。
[General]タブにて、[Broadcaster/Obsever]項を選択した後、GAP roleとして[Observer]を選択します。
次いで、[GAP Settings]タブでの設定。
サブカテゴリとして、<General>と<Scan Settings>の2つがあります。
<General>カテゴリの設定は、デフォルトのままで構いません。今回は、[Device Name]フィールド値は、空のままとしました(図8)。
<Scan Settings>カテゴリの設定は、[Scan Timeout]項のチェックを外します。他は、デフォルト設定のままです(図9)。
最後に、[Advanced]タブです。今回は、ビーコンスキャンをし続けますので、[Use BLE low power mode(external watch crystal is required)]のチェックを外します(図10)。
以上が、BLEコンポーネントのコンフィグレーションです。
続いてSCBコンポーネントのコンフィグレーション。
SCBコンポーネントの名称も変更します。ここでは、[SCB]としています。
また、[UART]にチェックが付いていることを確認します(図11)。
さらに、[UART Basic]タブ。通信パラメータを設定します。基本デフォルトのままでOKです。デフォルトは「115200bps/8bit/1stop bit/non parity」になっています。
この値を、PC側のターミナルエミュレータ上の設定と合わせる必要があります(図12)。
シリアル通信の最後のコンフィグレーションとして、PC側への送信時のバッファサイズを拡張します。ここでは、デフォルト8から64に変更しています。この値を変更することで、[Interrupt]設定が、[none]から[Internal]に、自動的に変更されます(図13)。
以上のコンフィグレーションが終わりましたら、プリビルドを行います。必要なソースコードが自動生成されます。
手順3 ユーザーソースコード
ユーザーソースコードは、主に2つの処理で構成されています。
iBeaconフォーマットを含むアドバタイジングパケット受信後、各フィールドのデータを抽出する処理と、抽出した情報をシリアル通信に送出する処理です。
1つ目の処理、データ抽出は、アドバタイジングパケット受信後の発行されるイベント「CYBLE_EVT_GAPC_SCAN_PROGRESS_RESULT」を捕らえて処理します。
BleEventHandler()ハンドラの第2引数に受信パケットの格納領域が示されていますので、格納領域(厳密には、変数gAdvReportに複製が保存)よりUUIDフィールド位置を算出し、iBeaconのUUIDである “00050001-0000-1000-8000-00805F9B0131”と同値であれば、iBeaconパケットと判断します。
iBeaconパケットと判断した後は、フォーマットに従って、major numberフィールド、minor numberフィールド抽出し、識別情報(変数gID)、温度情報(変数gTemp)、湿度情報(gHumidity), 電波強度情報(変数gRssi)をそれぞれの変数に格納します。また、必要に応じて、換算処理も行います。
そして、最後に情報更新が行われたことを示す変数(gFlagReportUpdate)を変更します。
処理的には、前後しますが、BleEventHandler()ハンドラでは、前回のブロードキャスタ同様、BLEプロトコルスタックの初期化正常終了後に発行されるCYBLE_EVT_STACK_ONイベントも補足します。今回は、アドバタイジングパケットのスキャンを開始させるAPI CyBle_GapcStartScan()をコールします。と同時に緑LEDも点灯させています(図14)。
もう一つの主処理、ビーコン受信したデータをシリアル通信で送出する処理は、main()内で行っています。情報更新フラグ(gFlagReportUpdate)が、真であれば、sprintf()関数を使って、メッセージを生成し、SCB_UartPutString()を使って、シリアルポートに送出しています。もちろん、各モジュールの初期化およびハンドラBleEventHandler()の登録もmain()関数内で行っています(図15)。
以上が用意するソースコードです。
ソースコード入力が終わりましたら、ビルドを実行します。
ビルドが正常終了しますと、実行イメージが生成されますので、ターゲットであるPSoC BLEデバイスにダウンロードします(図16)。
書き込みが正常終了し、BLEモジュールの初期化が正常に行われると、LED(緑)が点灯します。
手順4 PC上のターミナルエミュレータを使った動作確認
ビーコンを起動します。ここでは、センサビーコン(CYALKIT-E02)を、照明下もしくは太陽光下に起きます(CYALKIT-E02はソーラーパワーなので、電池は必要ありません)。
ホストPCとPSoC BLE Pionner kitをUSBで接続します。
ホストPC上でターミナルエミュレータを起動し、適切な通信ポート名COMnを選択します(通信ポート名は、PCによって異なります)。
次に通信パラメータを、図12で設定した値に「115200bps/8bit/1stop bit/non parity」に合わせます。
以上の状態で、PsoC BLE Pioneer kitベースボード上のリセットボタンを押下します。実行イメージおよび通信設定が適切であれば、ターミナルエミュレータ上に「Beacon Observer」というメッセージが表示されます。
その後、所定の間隔※1で、ビーコン情報がターミナルエミュレータ上に表示されます(図17)。
※1 ソーラーパワーで動作している関係で、光量が多い場合は、比較的短い間隔(1秒前後)、光量が少ない場合は、比較的長い間隔(数秒)で更新されます。
* * *
二回に分けて、ブロードキャスタ型通信の代表例であるビーコン発振器・受信機の実装を紹介しました。BLEプロトコルスタックから発せられるイベントが多いため、利用シーンに応じたイベントの選別が難しい面がありますが、ビーコンクラス送受信であれば、限定的であることから、比較的容易に実装できることがお判りいただけたのではないかと思います。
次回は、GATTプロファイルを使った実装を紹介します。
著者紹介
飯田 幸孝 (IIDA Yukitaka)
- アイアイディーエー 代表 / PE-BANK 東京本社所属プロエンジニア
計測機器開発メーカ、JAVA VMプロバイダの2社を経て、2007年独立。組込機器用ファームウェア開発に多く従事。2015年より新人技術者育成にも講師として関わる。PE-BANKでは、IoT研究会を主宰。
モノづくり好きと宇宙から地球を眺めてみたいという思いが高じて、2009年より宇宙エレベータ開発に、手弁当にて参画。 制御プログラムを担当。一般社団法人宇宙エレベータ協会主催「宇宙エレベータチャレンジ2013」にて、世界最長記録1100mを達成。
宇宙エレベータ開発のご縁で静岡大学の衛星プロジェクトStars-Cに参画。2016年12月、担当ユニットが一足先に宇宙に行き、地球を眺める。