スマホやPCなどのBLE端末から通信して、bCoreNKDに接続されたスイッチの状態を読み取らせる
サンプルスクリプトのプロジェクトファイル
この方法は、Readのリクエストが来る以前に、応答する値を逐一仕掛けておき、
リクエストが来た場合にスクリプトで処理することなくダイレクトに応答させます。
応答値を高速なタイマ割り込みなどを使って周期的に取り込み他の制御で使用している
場合などに有効な方法です。
Readを行う方法は、この他に
サンプルスクリプト 05 の方法もあります。
BLE通信の仕様については基本的に触れません。
この程度の短いスクリプトで簡単にBLE端末から操作するガジェットを作ることができます!
BLE通信の仕様についての参考書籍としては、
iOS×BLE Core Bluetoothプログラミング 堤 修一 (著), 松村 礼央 (著)
をお勧めします。bCoreの開発時にお世話になりました。
GitHubからまとめでDownLoadできるようになっています。
bCoreNDKSample_06.bgproj プロジェクトファイルについては説明省略
bCoreNDKSample_06_gatt.xml GATT設定ファイル
このGATT.xmlでは3つのサービスを定義しています。
4~20行目 Generic Access Profile
BLE端末(Central)側からデバイス(ペリフェラル=bCoreNKD)を見つけるときに識別する
為の名前と、デバイスのタイプを設定しています。
UUID:0x2a01 Apperance については、
このように定義 されています。
unknown (つまり0)にしてあります。
id スクリプトから値(Value)を参照する場合に使用する変数名
read セントラル(通信相手の端末)からみてこの値がReadできるかどうか
const 値が固定値であるかどうか
type ="hex"とすると16進数、しない場合は文字列としてValueが認識される
24~45行目 Device Information
デバイス(ペリフェラル=bCoreNKD)に関する情報を設定します。
省略可能です。
48~58行目 このサンプルスクリプトで使用する LEDを点灯・消灯させる ためのBLE通信の口(characteristic)を設定します。
このスクリプトでは、見やすくするために恣意的な文字列をUUIDにしていますが、
UUIDの生成については
こちら を参照して適切に設定して下さい。
advertise "true"にしないとこのサービスが端末から発見できないため利用できなくなる
description サービス、キャラクタリスティックを説明する文字列
id スクリプトから値(Value)を参照する場合に使用する変数名
properties read/write/write_no_responseのそれぞれの属性の有効無効の設定
今回のサンプルスクリプトは値を端末から司令するだけなので、write_no_responseのみtrue
value length やり取りされる 値 の長さ(byte 単位)
value type typeが hexの場合はReadに対して
スクリプトでイベント(event attributes_user_read_request())が発生しないため、
Readが発生した時点で仕掛けられていたValueがそのまま応答されます。
bCoreNDKSample_06_hardware.xml ハード的な設定に関するXMLファイル
6行目 <sleep enable="false" /> は、通信相手がいない場合に問答無用で
BLE113がスリ-プしないために必要。
このサンプルのように、最初から通信しない場合は、スクリプトが走るとすぐにスリ-プしてしまいます。
9行目 送信アンテナ強度の設定
15が最大値。小さくすることで消費電力を下げられるが、通信可能距離が短くなる。
bias設定は5から変更しないこと。
12行目 <script enable="true" /> がないと、スクリプトが実行されません。
falseにするとスクリプトが実行されなくなります。
14~16行目 各ポートの 3ステートバッファの有効無効、プルアップ/プルダウンの設定を行います。
設定は、P0x、P1x、P2x単位で行います。個々のポート個別に設定を変更することはできません。
indexで、ポート(0:P0x、1:P1x、2:P2x)を選択。
3ステートバッファを有効にしたいビットを tristatemaskで1にします。(全て有効の場合$FF、Px7の有効の場合 $80)
pullで、プルアップ(up)かプルダウン(down)を選択
bCoreNDKSample_06_script.bgs スクリプト本体ファイル
6~11行目 スクリプト中で使える変数は dim で定義。4byte 32bitのみ使用できます。
connected 端末との接続の有無を管理するフラグ
counter タイマで時間をカウントするためのカウンター
r_result Port読み出し用
r_port Port読み出し用
r_portData Port読み出し用
14~35行目 event system_boot(major ,minor ,patch ,build ,ll_version ,protocol_version ,hw )
Arudinoで言うところの setup()に相当する、スクリプト実行時に最初に呼ばれる処理
Arudinoで言うところの loop()に相当する部分は無いので、イベントドリブンでスクリプトを書く必要があります。
16、17行目 変数の初期化
19~21行目 call hardware_io_port_config_direction(port, direction)
各ポートの入力/出力を設定します。
port (0:P0x、1:P1x、2:P2x)
direction 1を設定したBitが 出力に、0を設定したBitが 入力 に設定されます。
全出力の場合 $FF、Px7のみ出力にする場合は $80
ここでは、P0xを全出力 Pull Up、P1xを全入力 Pull Up、P2xを全出力 Pull Up
に設定しています。
23、24行目 call hardware_io_port_write(port, mask, data)
各ポートの出力に設定したbitの出力値を更新します。
port (0:P0x、1:P1x、2:P2x)
mask マスクビット、対応するbitが1のbitのみ反映されます。
data 出力データ、対応するbitの0/1がマスクビット1のbitのみ反映されます。
26行目 call hardware_set_soft_timer(time, handle, single_shot)
ソフトウェアタイマ割り込みを設定します。
time 割り込みが発生するカウントを設定します。1カウント=1/32768秒になるため、
0.1秒ごとに設定する場合 3277 とします。
hadle 割り込み発生時に引き渡されるhandleを設定します。
handleを変更しても設定できるソフトウェアタイマ割り込みは一つだけです。
複数設定した場合、最後に設定したソフトウェアタイマ割り込みが有効になります。
single_shot この引数が0の場合は、割り込み発生後再度カウントを開始し
繰り返しタイマ割り込みが発生します。
1の場合、割り込み発生後は新たにタイマ割り込みを設定しない
かぎり再度の割り込み発生は起こりません。
30行目 call gap_set_mode(discover, connect)
GAPのモードを設定します。引数詳細は API Reference を参照のこと
ここで、アドバタイズ(端末から見つけてもらえるように情報発信)を開始します。
33行目 call sm_set_bondable_mode(bondable)
bondableモードの設定をします。引数詳細は API Reference を参照のこと
ざっくり言うと、端末(セントラル)とbCoreNKD(ペリフェラル)間の接続のセキュリティ認証関係の設定。
40~45行目 event connection_status(connection, flags, address, address_type, conn_interval, timeout, latency, bonding)
スクリプトが起動してアドバタイズを開始したあと、端末(セントラル)から接続された時に実行される。
ここでは connected のフラグを立て、点滅中のLEDを一度消灯状態に。
接続されると、自動的にアドバタイズは終了する。
50~55行目 event connection_disconnected(handle,result)
端末(セントラル)から接続された状態で、接続が切れた場合に実行される。
ここでは connected のフラグを消し、再度端末から発見接続可能なように
するためアドバタイズを再会させる。
59~83行目 event hardware_soft_timer(handle)
タイマ割り込みが発生すると実行されるイベントハンドラから呼び出される。
引数のhandleは、タイマ割り込みを設定した際のhandleが引き渡されます。
hardware_soft_timer内の処理がタイマ割り込み間隔よりも長い場合、
処理終了後に再度タイマ割り込みが発生します。
63~76行目 LEDの点滅制御
ここでは、2つのフラグ connected と counter を利用して、端末(セントラル)から接続が無い
状態では0.5秒間隔で全てのLEDと 点灯/消灯 させます。
78行目 call hardware_io_port_read(1, $FF)(r_result, r_port, r_portData)
Port1xのデータ読み出し
80行目 call attributes_write(xgatt_SW,0,1,r_portData)
読みだしたPort1xのデータをそのまま xgatt_SW (GATT.xml)に反映させます。
Readが発生した場合は、スクリプトを介さずこの値がそのまま応答されます。
そのため、0.1秒周期のタイマで更新しているスイッチの状態に対してタイミング次第で
応答値の更新が最大で0.1秒遅れることになります。
ただし、BLEでのReadの応答が40~100ms程度遅れる(iOSとBLE113での実測値)
ことを考えると、元々厳密なリアルタイム性が要求される用途での使用は難しいため
根本的な問題になりにくいと考えます。
テスト回路 入力に設定してあるP1xですが、P10、P11が内蔵PullUpだけでは不安定なため10kΩのプルアップを追加してあります。
スクリプトが起動すると、1HzでP07のLEDが点滅します。
この状態で端末から接続を行うとLEDが消灯します。
bCoreNKD_Sample5Service の SW Status をReadすると、
スイッチのOnOff状態が1バイトのデータとして取得できます。
テスト動画 VIDEO 接続のテストには、
LightBlue というiOSアプリが便利です。
このアプリを使うと、開発中のBLEデバイスのアドバタイズ情報、各サービスやキャラクタリスティックの値の確認、変更が自在に可能です。
ただし、このアプリは一度接続したデバイスの名前等を変更(bCoreNKDでGATT.xmlを変更)した場合の
変更を受け付けないことがある(一度アプリを落とすとか、接続して切り離すとかする必要がある)ので
注意が必要です。今後改善されるかもしれません。
2016/06/11(土) 18:50:32 |
bCoreNKDとは?
| コメント:0
スマホやPCなどのBLE端末から通信して、bCoreNKDに接続されたスイッチの状態を読み取らせる
サンプルスクリプトのプロジェクトファイル
この方法では、Readのリクエストが来てから応答する値をスクリプトで用意し応答させる方法です。
Readを行う方法は、この他に
サンプルスクリプト 06 の方法もあります。
BLE通信の仕様については基本的に触れません。
この程度の短いスクリプトで簡単にBLE端末から操作するガジェットを作ることができます!
BLE通信の仕様についての参考書籍としては、
iOS×BLE Core Bluetoothプログラミング 堤 修一 (著), 松村 礼央 (著)
をお勧めします。bCoreの開発時にお世話になりました。
GitHubからまとめでDownLoadできるようになっています。
bCoreNDKSample_05.bgproj プロジェクトファイルについては説明省略
bCoreNDKSample_05_gatt.xml GATT設定ファイル
このGATT.xmlでは3つのサービスを定義しています。
4~20行目 Generic Access Profile
BLE端末(Central)側からデバイス(ペリフェラル=bCoreNKD)を見つけるときに識別する
為の名前と、デバイスのタイプを設定しています。
UUID:0x2a01 Apperance については、
このように定義 されています。
unknown (つまり0)にしてあります。
id スクリプトから値(Value)を参照する場合に使用する変数名
read セントラル(通信相手の端末)からみてこの値がReadできるかどうか
const 値が固定値であるかどうか
type ="hex"とすると16進数、しない場合は文字列としてValueが認識される
24~45行目 Device Information
デバイス(ペリフェラル=bCoreNKD)に関する情報を設定します。
省略可能です。
48~58行目 このサンプルスクリプトで使用する LEDを点灯・消灯させる ためのBLE通信の口(characteristic)を設定します。
このスクリプトでは、見やすくするために恣意的な文字列をUUIDにしていますが、
UUIDの生成については
こちら を参照して適切に設定して下さい。
advertise "true"にしないとこのサービスが端末から発見できないため利用できなくなる
description サービス、キャラクタリスティックを説明する文字列
id スクリプトから値(Value)を参照する場合に使用する変数名
properties read/write/write_no_responseのそれぞれの属性の有効無効の設定
今回のサンプルスクリプトは値を端末から司令するだけなので、write_no_responseのみtrue
value length やり取りされる 値 の長さ(byte 単位)
value type typeが Userの場合はReadに対して
スクリプトでイベント(event attributes_user_read_request())が発生する
bCoreNDKSample_05_hardware.xml ハード的な設定に関するXMLファイル
6行目 <sleep enable="false" /> は、通信相手がいない場合に問答無用で
BLE113がスリ-プしないために必要。
このサンプルのように、最初から通信しない場合は、スクリプトが走るとすぐにスリ-プしてしまいます。
9行目 送信アンテナ強度の設定
15が最大値。小さくすることで消費電力を下げられるが、通信可能距離が短くなる。
bias設定は5から変更しないこと。
12行目 <script enable="true" /> がないと、スクリプトが実行されません。
falseにするとスクリプトが実行されなくなります。
14~16行目 各ポートの 3ステートバッファの有効無効、プルアップ/プルダウンの設定を行います。
設定は、P0x、P1x、P2x単位で行います。個々のポート個別に設定を変更することはできません。
indexで、ポート(0:P0x、1:P1x、2:P2x)を選択。
3ステートバッファを有効にしたいビットを tristatemaskで1にします。(全て有効の場合$FF、Px7の有効の場合 $80)
pullで、プルアップ(up)かプルダウン(down)を選択
bCoreNDKSample_05_script.bgs スクリプト本体ファイル
6~11行目 スクリプト中で使える変数は dim で定義。4byte 32bitのみ使用できます。
connected 端末との接続の有無を管理するフラグ
toggle LEDを点滅させるためのフラグ
r_result Port読み出し用
r_port Port読み出し用
r_portData Port読み出し用
14~35行目 event system_boot(major ,minor ,patch ,build ,ll_version ,protocol_version ,hw )
Arudinoで言うところの setup()に相当する、スクリプト実行時に最初に呼ばれる処理
Arudinoで言うところの loop()に相当する部分は無いので、イベントドリブンでスクリプトを書く必要があります。
16、17行目 変数の初期化
19~21行目 call hardware_io_port_config_direction(port, direction)
各ポートの入力/出力を設定します。
port (0:P0x、1:P1x、2:P2x)
direction 1を設定したBitが 出力に、0を設定したBitが 入力 に設定されます。
全出力の場合 $FF、Px7のみ出力にする場合は $80
ここでは、P0xを全出力 Pull Up、P1xを全入力 Pull Up、P2xを全出力 Pull Up
に設定しています。
23、24行目 call hardware_io_port_write(port, mask, data)
各ポートの出力に設定したbitの出力値を更新します。
port (0:P0x、1:P1x、2:P2x)
mask マスクビット、対応するbitが1のbitのみ反映されます。
data 出力データ、対応するbitの0/1がマスクビット1のbitのみ反映されます。
26行目 call hardware_set_soft_timer(time, handle, single_shot)
ソフトウェアタイマ割り込みを設定します。
time 割り込みが発生するカウントを設定します。1カウント=1/32768秒になるため、
0.5秒ごとに設定する場合 16384 とします。
hadle 割り込み発生時に引き渡されるhandleを設定します。
handleを変更しても設定できるソフトウェアタイマ割り込みは一つだけです。
複数設定した場合、最後に設定したソフトウェアタイマ割り込みが有効になります。
single_shot この引数が0の場合は、割り込み発生後再度カウントを開始し
繰り返しタイマ割り込みが発生します。
1の場合、割り込み発生後は新たにタイマ割り込みを設定しない
かぎり再度の割り込み発生は起こりません。
30行目 call gap_set_mode(discover, connect)
GAPのモードを設定します。引数詳細は API Reference を参照のこと
ここで、アドバタイズ(端末から見つけてもらえるように情報発信)を開始します。
33行目 call sm_set_bondable_mode(bondable)
bondableモードの設定をします。引数詳細は API Reference を参照のこと
ざっくり言うと、端末(セントラル)とbCoreNKD(ペリフェラル)間の接続のセキュリティ認証関係の設定。
40~45行目 event connection_status(connection, flags, address, address_type, conn_interval, timeout, latency, bonding)
スクリプトが起動してアドバタイズを開始したあと、端末(セントラル)から接続された時に実行される。
ここでは connected のフラグを立て、点滅中のLEDを一度消灯状態に。
接続されると、自動的にアドバタイズは終了する。
50~55行目 event connection_disconnected(handle,result)
端末(セントラル)から接続された状態で、接続が切れた場合に実行される。
ここでは connected のフラグを消し、再度端末から発見接続可能なように
するためアドバタイズを再会させる。
59~79行目 event hardware_soft_timer(handle)
タイマ割り込みが発生すると実行されるイベントハンドラから呼び出される。
引数のhandleは、タイマ割り込みを設定した際のhandleが引き渡されます。
hardware_soft_timer内の処理がタイマ割り込み間隔よりも長い場合、
処理終了後に再度タイマ割り込みが発生します。
ここでは、2つのフラグ connected と toggle を利用して、端末(セントラル)から接続が無い
状態では0.5秒間隔で全てのLEDと 点灯/消灯 させます。
83~93行目 event attributes_user_read_request(connection, handle, offset, maxsize)
接続中の端末から read された場合に GATTの Value type propeties が USERの場合に実行される。
複数のキャラクタリスティックを持っている場合、どのキャラクタリスティックに対して write されても
このイベントが発生するため、識別は handle で行う。
handleには、*_hardware.xml で定義したそのキャラクタリスティックのidが格納されている。
87行目 call hardware_io_port_read(1, $FF)(r_result, r_port, r_portData)
Port1xのデータ読み出し
89行目 call attributes_user_read_response(connection, 0, 1, r_portData)
読みだしたPort1xのデータをそのままReadへの応答として返す
テスト回路 入力に設定してあるP1xですが、P10、P11が内蔵PullUpだけでは不安定なため10kΩのプルアップを追加してあります。
スクリプトが起動すると、1HzでP07のLEDが点滅します。
この状態で端末から接続を行うとLEDが消灯します。
bCoreNKD_Sample5Service の SW Status をReadすると、
スイッチのOnOff状態が1バイトのデータとして取得できます。
テスト動画 VIDEO 接続のテストには、
LightBlue というiOSアプリが便利です。
このアプリを使うと、開発中のBLEデバイスのアドバタイズ情報、各サービスやキャラクタリスティックの値の確認、変更が自在に可能です。
ただし、このアプリは一度接続したデバイスの名前等を変更(bCoreNKDでGATT.xmlを変更)した場合の
変更を受け付けないことがある(一度アプリを落とすとか、接続して切り離すとかする必要がある)ので
注意が必要です。今後改善されるかもしれません。
2016/06/11(土) 18:35:00 |
bCoreNKDとは?
| コメント:0