ブロードキャスタのおさらい

BLE実演シリーズの第一弾として、ブロードキャスターロールを実装します。

本連載第4回『BLEは2へんげ』にて、BLE通信形態には、ブロードキャスト型とコネクション型が存在することを紹介しました。ブロードキャスト型は、通信相手先を特定せず、通信パケットを一方的に発するタイプ。代表例としてビーコンがありましたね。今回は、そのビーコンを、PSoC BLE Pioneer Kit上で実現します。

送信するパケット書式として、同じくコラム「BLEは2へんげ」にて紹介しましたiBeaconフレームを利用します。同フレームのMinor Numberフィールドの2オクテット領域に温度情報(1Oct)と湿度情報(1Oct)情報を乗せて送信することにします。(図1)

図1 : iBeaconフレーム書式

なぜ、この様な書式とするのか。それは、次回利用する予定の サイプレス社製CYALKIT-E02 Solar-Powered BLE Sensor Beaconが、上記の方法を利用して温度・湿度情報をビーコン発信させているからです。また、同製品には、スマートフォン用のビーコンアプリも用意されていて、お手軽にビーコン情報を確認できるからです。

実行環境のご提供

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

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

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

手順1 : ワークスペース作成から回路図作成まで

前回Lチカ実装を行った際と同じく、PSoC Creator起動後、まずは、ワークスペースを作成します。

Lチカ実装同様、[Select Project type]ダイアログ/[Target Hardware]として、[Kit: CY8CKIT-042-BLE(PSoC 4100BEL/PSoC4200 BLE)]を選択。次の[Select project template]ステップで、[Empty schematic]を選択した後、任意のワークスペース(Workspace)名とプロジェクト名(Project name)を設定します。

ワークスペースは Lチカ作業で作成したワークスペースを流用できますが、異なるワークスペースを用意することをお勧めします。

図2 : Target Hardware の選択

図3 : Project template の選択

図4 : Project の生成

続いて、回路図の作成。今回の主役は、もちろんBLE。右ペインにあるコンポーネントカタログ(Component Catalog)のConfigurationグループより[Bluetooth Low Energy(BLE)]を選択(図5)。

図5 : BLEブロックをドラック&ドロップで配置

ビーコンを発信するには、BLEコンポーネントのみで事足りるのですが、送信状態を示すLEDと制御用のポートも付け加えます。ポート、LED、抵抗の追加やポートのコンフィグレーションについては、前回記事 「やっぱりLチカ」をご覧ください。

最終的回路図は、図6のようになります。

図6 : LEDポートの追加した回路最終形

LEDデバイスの内部

PSoC BLE Pioneer Kitのベースボードに搭載されているLEDデバイスは1つなのですが、内部的には赤(Red)、緑(Green)、青(Blue)3種のLEDが統合されています。複数のLEDを同時に点灯させるとRGB色が混合された色で発光します。

PSoC BLE Pioneer Kitの回路図上では、以下のようになっています。

cypress cy8ckit-042-ble_pioneer_schematic より

今回は、BLEコンポーネントのコンフィギュレーションが重要ですので、先にピンアサインを行っておきます。左ペインにあるWorkspace Exploreより拡張子[.cydwr]が付いたファイルをクリックし、[Pins]タブを選択します。LED緑は、P3-7に、LED青は、P3-6に接続されていますので、PO_LED_Gと、PO_LED_Bのピンアサインは、図7のようになります。

図7 : ピンアサイン

さらに、[Clock]タブを選択し、高速クロックをCYALKIT-E02に合わせてECO(24MHz)に変更しておきます(ディフォルトは、IMO:48MHz)。

使用しない、IMOクロックのチェックを外しておきます。

そして、アドバタイズメントパケットの周期呼び出しに利用する低速クロックの1つTimer0を2Hzに設定します。

図8 : クロック設定

手順2 : BLEコンポーネントのコンフィグレーション設定

コンポーネントの名称(ID)は、ディフォルトの’BLE_1’から’BLE’としています。

[General]タブにて、[Braoadcaster/Obsever]項を選択した後、GAP roleとして[Broadcaster]を選択します。

図9 : GAPロールとして、Broadcaster を選択

次いで、[GAP Settings]タブでの設定。4つのカテゴリがあります。

まずは、<General>。

[Device Name]フィールドに、任意の名前を設定します。今回は利用しないのでディフォルトのままでもよいのですが、意識付けとして設定します。図10では、”Beacon01”としています。

<Advertisement packet>にて、[Local Name]項を有効にするとアドバタイズメントパケットに反映されます(ただし、今回は有効にしません)。

図10 : Device Nameの設定

続いて、<Broadcaster Role/Advertisement settings>カテゴリです。ここでは4カ所の設定を以下のように変更します。

Advertising type: Non-connectable undirected advertising
Fast advertising interval:
    Minimum(ms): 1000
    Maximum(ms): 1000
    Timeout(s): チェックを外す

図11 : Advertisement settings

そして、4つカテゴリのうち最も重要なのがここ<Advertisement packet>カテゴリです。

[Advertisement data settings]一覧の[Manufacture Specific Data]項にチェックを入れます。表示される[Company]フィールドには、"Apple, Inc."を選択。DataにはUUID: 00050001-0000-1000-8000-00805F9B0131を指定します。具体的には以下の文字列を入力します。

02:15:00:05:00:01:00:00:10:00:80:00:00:80:5F:9B:01:31:00:00:00:00:C3

この文字列は、後ほど紹介するスマートフォンアプリを利用する際、重要な鍵となりますので、一言一句間違いなく入力してください。

図12 : Advertisement packet

最後のカテゴリ<Scan response packet>、今回はディフォルトのままとします。

ついでながら、残りのタブ[Advanced][Built-in]も今回は、ディフォルトのままとします。

以上のコンフィグレーションが終わりましたら、一度ビルド(プリビルド)を行います。Lチカ同様、必要なソースコードが自動生成されます。

手順3 : ユーザーソースコード

ユーザーソースコードは、主に3つの処理で構成されています。

一つはBLEの状態が変化する毎に発生するイベントに対する処理です。

GAP層のイベントだけで 30種強定義されているのですが、今回は、1つのイベント - BLEスタックが立ち上がった際に発生するイベントのみに対応し、他のイベントは無視します。

CYBLE_EVT_STACK_ONイベントが発生することで、LED(緑)を点灯させるとともに、ビーコン状態管理をアクティブに変更しています。

図13 : BleEventHandler()関数

二つ目は、アドバタイズメントパケットの送信・停止制御を行います。

AdvPayloadUpdate ()関数は、500msec単位で呼び出されるよう、main()関数内で設定されていています。500msec毎に、パケット送信開始API CyBle_GappStartAdvertisement()、パケット送信停止API CyBle_GappStopAdvertisement()を交互に呼び出すことと、上述の Fast Advertising interval値を1000msに設定することで、周期1秒でのアドバタイズメントパケットの発行を実現しています。

実用的利用では、温度センサ/湿度センサを接続し、読み取ったデータをビーコンパケットに乗せるべきですが、ここでは、データ送受が正しく行われていることの確認を目的とすることから、一定の下限・上限値間を一定間隔で増加を繰り返すパターンデータ生成し、センサ情報として送付することにします。

図14 : AdvPayloadUpdate()関数

最後は、main()関数。

BLEコンポーネントの初期化とCySysWdtSetInterruptCallback()関数を使ってAdvPayloadUpdate()関数の定期呼び出しを実現しています。

図15 : main()関数

以上が用意するソースコードです。

ソースコード入力が終わりましたら、ビルドを実行します。

ビルドが正常終了しますと、実行イメージが生成されますので、ターゲットであるPSoC BLEデバイスにダウンロードします。

図16 : ビルド正常終了 & PSoCデバイスへの書き込み

書き込みが正常終了すると、LED(緑)が点灯し、LED(青)が1秒間隔で点滅します。

手順4 : スマートフォンでの動作確認

Cypress社が提供している BLE-Beaconアプリを利用します。

Android用アプリはこちらから、iOS用アプリは、こちらから、ダウンロード可能です。いずれも無償利用可能です。

図17は、Android端末での表示例ですが、ノコギリ歯が表示されることが確認できます。

図17 : BLE-Beaconアプリでのグラフ表示

*  *  *

今回は、お手軽ビーコン作成を目的にしていたことから、ビーコンから発する数値をソフトウエア的に生成しましたが、PSoCなら、簡単に実物のセンサデバイスを使うことも可能です。

I2CとかSPIと言ったデジタル出力インタフェースをもつセンサであれば、PSoC側に適した通信インタフェースコンポーネントを配置すれば、すべてデジタルでリアル温度センサビーコンを実現することが可能です。

I2CコンポーネントやSPIコンポーネントについては、機会があれば紹介します。

次回は、オブザーバ(ビーコン受信器)を実現します。

著者紹介

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

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

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

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

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