スマホやPCなどのBLE端末から通信して、bCoreNKDに接続されたラジコンサーボモーターをコントロールするサンプルスクリプトのプロジェクトファイル
BLE通信の仕様については基本的に触れません。
実質20行ほどのスクリプトで、4つのラジコンサーボをコントロールできます。
BLE通信の仕様についての参考書籍としては、
iOS×BLE Core Bluetoothプログラミング 堤 修一 (著), 松村 礼央 (著)
をお勧めします。bCoreの開発時にお世話になりました。
GitHubからまとめでDownLoadできるようになっています。
bCoreNDKSample_11.bgproj プロジェクトファイルについては説明省略
bCoreNDKSample_11_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行目 このサンプルスクリプトで使用する ラジコンサーボへの位置指定 のための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_11_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)を選択
19行目 BLE113の内蔵タイマ(Timer1, Timer3, timer4)に供給するベースクロックを指定。
ここでは、"3"を設定して4MHz(1クロックが0.25usec)を設定。
22行目 Timer1をPWM出力モードで、ポートP03, P04, P05, P06で使用するための設定を行います。
timer 使用するタイマを選択(1/3/4)
enable_channels 使用するポートをビット指定で設定(ここではPWM1, PWM2, PWM3, PWM4を選択)
divisor Timer1供給クロックのベースクロックからの分周比を設定(ここでは0でそのまま4MHzを入力)
mode Moduloモードを選択(0:Suspended, 1:Free running, 2:Modulo, 3:Up/Down)
alternate 出力ピンの選択
(1:PWM0@P02/PWM1@P03/PWM2@P04/PWM3@P05/PWM4@P06,
2:PWM0@P12/PWM1@P11/PWM2@P10/PWM3@P07/PWM4@P06)
※詳しく知りたい場合は公式サイトからダウンロードできる Bluetooth Smart Module Configuration Guide のtimerの章を参照。
bCoreNDKSample_11_script.bgs スクリプト本体ファイル
7~25行目 event system_boot(major ,minor ,patch ,build ,ll_version ,protocol_version ,hw )
Arudinoで言うところの setup()に相当する、スクリプト実行時に最初に呼ばれる処理
Arudinoで言うところの loop()に相当する部分は無いので、イベントドリブンでスクリプトを書く必要がある。
13~17行目 call hardware_timer_comparator(timer, channel, mode, comparator_value)
タイマの設定をします。
timer 設定するタイマを選択(1/3/4)
channel 設定するチャンネルを選択
mode 設定するモード
cmparator_value 設定する値
※詳しく知りたい場合は公式サイトからダウンロードできる BLUEGIGA BLUETOOTH SMART SOFTWARE API DOCUMENTATION のTimer Comparatorの章、CC2540/41 System-on-Chip Solution for 2.4-GHz Bluetooth® low energy Applications User's Guide の Timer 1 (16-Bit Timer)を参照。
bCoreNDKSample_11_hardware.xmlで、Timer1はmoduloモードに設定済み。
このモードでは、Timer1のPWM0のチャンネルで全体の周期を決定し、その周期の中で他のPWM1~4を使って任意の幅のPWMを出力する。
先ず、13行目でPWM0が16ms(1600usec÷0.25[usec/count]=6400[count]) でカウントクリアされるように設定。
bCoreNDKSample_11_hardware.xmlで、PWM0は出力されないようになっているため、P02はIOポートとして利用可能。
14~17行目で、PWM1~4に、ラジコンサーボ信号のニュートラルポジションとなる 1500[usec]間Onになる周期(1500÷0.25=6000)を設定。mode=4に設定することで、PWM0がクリアされるとHレベル、各PWMチャンネルに設定された周期で信号がLとなり、サーボ制御信号となる。
ラジコンサーボの信号は周期に対して制御信号幅が非常に小さいため、制御分解能を得ようとすると、16ビットタイマを使用する必要が有るため、Timer3, 4を使用するのは推奨しません。
20行目 call gap_set_mode(discover, connect)
GAPのモードを設定します。引数詳細は API Reference を参照のこと
ここで、アドバタイズ(端末から見つけてもらえるように情報発信)を開始。
23行目 call sm_set_bondable_mode(bondable)
bondableモードの設定をします。引数詳細は API Reference を参照のこと
ざっくり言うと、端末(セントラル)とbCoreNKD(ペリフェラル)間の接続のセキュリティ認証関係の設定。
30~32行目 event connection_status(connection, flags, address, address_type, conn_interval, timeout, latency, bonding)
スクリプトが起動してアドバタイズを開始したあと、端末(セントラル)から接続された時に実行される。
ここでは なにもしていないので省略可能。
接続されると、自動的にアドバタイズは終了する。
37~41行目 event connection_disconnected(handle,result)
端末(セントラル)から接続された状態で、接続が切れた場合に実行される。
ここでは 再度端末から発見接続可能なようにするためアドバタイズを再開させる。
45~49行目 procedure servo_control(ch, pos)
2つの引数(ch, pos)を持った自前の関数を定義
posに0~255の値が指定された場合に、指定されたchのPWM出力に、ラジコンサーボの制御信号で約1500±900[usec]
の信号出力を設定させるための関数
81~89行目 event attributes_value(connection, reason, handle, offset, value_len, value)
接続中の端末から write された場合に実行される。
複数のキャラクタリスティックを持っている場合、そのキャラクタリスティックに対して write されても
このイベントが発生するため、識別は handle (つまり xgatt_Servo)で行う。
handleには、*_hardware.xml で定義したそのキャラクタリスティックのidが格納されている。
ここでは、送られてきたデータが2バイトで、1バイト目(value(1:1)が~4の場合に、
1バイト目をch、2バイト目をposとして、servo_control(ch, pos)を実行
テスト回路 bCoreNKD_Sample11ervice の SW Status に2バイトのデータwpWriteすると、P03~P06に接続されたラジコンサーボが動きます。1バイト目でチャンネル指定(0x01: P02, 0x02: P03, 0x03:P04, 0x04; P05)、2バイト目で目標位置(0x80がニュートラル)を指定します。
ラジコンサーボを動かす場合は、十分電流を出せる電源を繋ぐ必要があるため、電源はニッケル水素電池3~4本かLiPo1セル、LiFePO41セルを推奨します。
ラジコンサーボの駆動信号は3.3Vになるため、モノによって動かないラジコンサーボがあります。
動作確認済みのラジコンサーボは、Tower Pro
SG90 ,
SG92 ,
SG-5010 になります。
何れも、秋月電子で安価で販売されており、実動作検証で3V程度の低い電源電圧でも動作することを確認しています。
偽造品が出回っているため、異常に安い通販での購入は避けましょう。
テスト動画 VIDEO 接続のテストには、
LightBlue というiOSアプリが便利です。
このアプリを使うと、開発中のBLEデバイスのアドバタイズ情報、各サービスやキャラクタリスティックの値の確認、変更が自在に可能です。
ただし、このアプリは一度接続したデバイスの名前等を変更(bCoreNKDでGATT.xmlを変更)した場合の
変更を受け付けないことがある(一度アプリを落とすとか、接続して切り離すとかする必要がある)ので
注意が必要です。今後改善されるかもしれません。
2016/07/22(金) 11:53:10 |
bCoreNKDとは?
| コメント:0