ノートPCを買い替え、まだNordicの開発環境を作っていないので、作りながら記録を残しておく。
BLE peripheral側は、nRF51822が載っているBLE Nanoを使うことにしよう。
古いのと新しいのでRAMのサイズが違うようだが、まあ気にしないでおこう。
この子であれば、J-Linkなどがなくても、USB経由で焼けるんじゃなかろうか。
RedBearLab BLE Nano - スイッチサイエンス
先に言っておくことになるが、mbed環境は使わない。。
まだBluetooth Developer Studioのコード生成がmbedに対応していないというか、mbed用がないのだ(たぶん)。
コード生成はプラグインで、プラグインはJavaScriptで書けばよいから、そのうち誰かが作ってくれるのかもしれないが、まだ時代が追いついていないのだ。。
BLE central側は、AndroidのNexus5(Android 6.0.1)を使う。
たぶん、Android 5.1以上あれば動くんじゃなかろうか。
Android側は、Bluetooth Developer Studioが自動生成するくらいで、あまり説明しません。
説明するものが無いというか、他を読んだ方がよいというか。。
中身は、Bluetooth Developer Studioで作っていく。
大したものを作る気がないので、BLE Nanoに載っているLEDを制御する、ということにしておこう。
たぶん、Bluetooth Developer Studioでやるのが、一番簡単だと思う。
残念なのは、Windowsでしか動かないというところだろうか。
まず、Bluetooth Developer Studioをダウンロードする。
名前、会社名、メールアドレスの入力が必須なのはうっとうしいが、仕方ない。
https://www.bluetooth.com/download-developer-studio
今日2016/12/23は、DeveloperStudio_1_1_3135_0.exeがダウンロードされた。
起動する。
SIGN INなどあるし、Bluetooth SIGは無料で入会できるようにはなっているのだが、会社として登録することになる。
だから、無視だ。
「NEW」をクリック。
UUIDは勝手に決めてくれているので、変更したくなければそのままでよい。
今回は「NanoLed」という名前にしておこう。
なお、ここのNAMESPACE欄は、Androidアプリを作るときにも使われるので注意しておこう。
OKするとダイアログが閉じて、「New Profile」とだけ書かれた画面が出てくる。
そこをクリック。
ここは特に使わないので、New Profileのところを「NanoLed」に変更して、SAVE。
変更したけど、しなくてよいのかもしれん。
次は、右側にある「CUSTOM SERVICE」をクリック。
ここからが本番だ。
サービス名が「NanoLed new service」と長いので、newを削除することにした。
これは、後でソースを自動生成するときのファイル名になる。
左側にある「+」ボタンをクリック。
これはServiceにCharacteristicを追加するボタンだ。
今回は、1サービス、1キャラクタリスティック(書込みのみ)を作ってみよう。
書込みすると、それに応じてLEDが点いたり消えたりする、という目論見だ。
黄色で囲んだところを変更させる。
↓↓↓
適当に名前を付けて、WRITEをMANDATORYにする。
WRITEとWRITE WITHOUT RESPONSEの違いは、結果が返ってくるか来ないかだけの違いなので、今回はどうでもよい。
後から読み返して分かるようにしておきたければ、この下にあるINFORMATION TEXTなどにメモを残しておけばよいだろう。
他の画面にも、同じような欄があるから、丁寧にやるときは入力しておくと、人に渡すときに親切だったり、数ヶ月後の自分に親切だったりするかもしれない。
これで名前は付いたものの、このCharacteristicが何バイトなのかとか、どういう設定ができるのかが決まってない。
これはFIELDを入力していくことになる。
画面下左にある「ADD FIELDS」をクリックだ。
NAMEと、FORMATくらいは入力することになるだろう。
ONとOFFの設定ができればよいので、8bitあればよいだろう。
名前はonoffにした。
入力したら「DONE」をクリック。
戻るので、「SAVE」をクリック。
これで、サービスの入力が終わった。
お疲れ様でした。
他の項目もきれいに入力しておくと、レポート出力機能でそれっぽいものをHTMLで出すことができる。
まあ、気が向いたらやってみるのもよいだろう。
ここまでできたら、nRF51822とAndroidのソースの自動生成をさせたいのだが、プラグインがまだ入っていない。
プラグインは、Bluetooth SIGからダウンロードしたり、Nordicのサイトからダウンロードしたりする。
Bluetooth Developer Plugins | Bluetooth Technology Website
下の方にプラグインの一覧がある。
今回は、Android Plugin v1.0と、bds_plugin_1.2.2_nRF5_SDK_11.0.0.zipを使う。
nRF5 SDKはv12を使う予定だが、まあ使えるんじゃなかろうか。
Androidのプラグインは、解凍するとファイルがべたっと入っているので、Android_Client1.0とでも名前を付けたフォルダを作って移動させる。
そして、フォルダごとプラグインフォルダに移動させる。
Windows10 64bitのデフォルトだと、C:\Program Files (x86)\Bluetooth SIG\Bluetooth Developer Studio\Plugins、の中に移動させる。
Nordicのプラグインは、解凍するとpluginsフォルダがあるので、その中に入っているNordic Semiconductor v1.2.2を移動させる。
Program Filesの中におくので管理者権限がいるのだが、まあよかろう。
もしBluetooth Developer Studioを立ち上げたままだったのであれば、プロジェクトを保存して立ち上げ直そう。
立ち上げ直してプロジェクトを開き、メニュー「TOOLS > GENERATE CODE」を選ぶとダイアログが開く。
一番上の「GENERATE CODE FOR」で、Server側かClient側かを選ぶ。
今回は、PeripheralがServerで、CentralがClientになる。
BLE NanoがServerで、AndroidがClientだ。
データを持っている方がServerになるので、PeripheralがServerになることが多いだろう。
下の「SAVE TO」に書いているフォルダに出力するので、ServerとClientは出力先を変えた方がよい。
nRF5用の生成ソース
Android用の生成ソース
では、BLE Nano側のビルドを行う。
オンラインmbedコンパイラで楽々、と行きたかったのだが、無理そうなのでKeiliでビルドする。
https://www.keil.com/demo/eval/arm.htm
ここが一番面倒かも。
まあ、ほどほどに入力すればよいだろう。
今だと、MDK522.exeがダウンロードされた。
Keilは面倒、ということであれば、gccでもよいだろう。
私は普段gccを使っているのだが、今回はなるべく手動を減らすことを目的にしているので、Keilにしたのだ。
まあ、gccを使える人であれば、ここから先は雰囲気さえ分かれば対応できると思う。
Keilをインストールし終わると、Packageのデータをダウンロードするので、待つ(下にプログレスバーが出る)。
終わったら、終了させよう。
次に、nRF5 SDKをダウンロードする。
v13はまだalpha版なので、v12.2.0をダウンロードし、適当な場所に解凍した。
あ、「適当な場所」というのは、フォルダ名に日本語とかスペースとか入っていないような、あまり深すぎない場所、という意味だ。
私は「C:\Prog\nrf5\nRF5_SDK_12.2.0_f012efa」という場所に置いた。
developer.nordicsemi.com:/nRF5_SDK/nRF5_SDK_v12.x.x/
解凍したフォルダの中に「examples\ble_peripheral」があり、そこに「experimental_bluetoothds_template」がある。
これをフォルダごとコピーして、同じ場所に別名でペーストしよう。
今回は「experimental_bluetoothds_nanoled」という名前にした。
そして「examples\ble_peripheral\experimental_bluetoothds_nanoled\pca10028\s130\arm5_no_packs」という場所に「bluetoothds_template_pca10028_s130.uvprojx」というファイルがある。
たぶん、緑色のアイコンになっていると思うので、それをダブルクリックするとKeilが立ち上がってくれる。
そうすると、おそらく足りないものをダウンロードするよう要求してくるので、YesYesいっておく。
ここまでやって「examples\ble_peripheral\experimental_bluetoothds_nanoled」を見ると、こうなっていると思う。
この中に、先ほど生成されたソースをコピーする。
上書きも気にせずやってしまう。
service_if.c,hは上書きになるが、ble_nanoled_service.c,hは新規なので、プロジェクトに追加が必要だ。
Keilの左側にあるツリーのApplicationで右クリックし「Add Existing Files to Group 'Application'...」をクリックし、追加しよう。
そして、ビルド!
・・・service_if.cでエラー発生。
これは、ログ周りが変更になったためと思われる。
どうせログは今回見ないので、こんな感じで無効にしておこう。
#include "app_trace.h"
↓
//#include "app_trace.h"
#define app_trace_log(...)
これでビルドすると、".\_build\nrf51422_xxac.axf"というファイルができたらしい。
axf、というのは、ARMのELF形式みたいなものだろう。
ARM社のコンパイラでビルドすると、axfファイルができるのだ。
まずは、ここまででBLEのCharacteristicが見えるかどうかを確認しておこう。
mbedは、USB接続するとファイルシステムとして見えて、そこにファイルを置くと焼いてくれる、というしくみになっている。
「components\softdevice\s130\hex」においてある「s130_nrf51_2.0.1_softdevice.hex」をD&D。
そうすると、親基板のLEDが高速点滅して、勝手にアンマウントして再接続された。
続けて、「examples\ble_peripheral\experimental_bluetoothds_nanoled\pca10028\s130\arm5_no_packs\_build」にある「nrf51422_xxac.hex」をD&D。
これも同じく。
焼き終わったら、一度はずして、付け直した方がよいのかな?
BLEのperipheralが動いているかどうかは、スマホアプリを使って確認するのが簡単だ。
私はnRF connectというNordicのアプリを使っている。
nRF Connect for Mobile - Google Play の Android アプリ
が、iOSだったらLightBlueに軍配が上がるかも。
LightBlue Explorer - Bluetooth Low Energyを App Store で
まあ、いろいろ使ってみるとよいだろう。
Android版の場合、動いていると「Nordic_BDS」という機器がAdvertisingしているので、CONNECTするとCharacteristicが見える。
矢印が上向きは、WRITEの意味。
UUIDは作ったときのものなので、ここまで同じ手順で作っていても別の番号になっていることだろう。
あっさり書いているが、実は焼くのに手間がかかっていた。
というのも、うちのBLE Nanoはいろいろやっていたためか、ファームウェアがmbedで使うものになっていなかったのだ。
RedBearLab BLE Nano | mbed
ここの回路図の下にある「Interface Firmware」の手順に従ってファームウェアを書き換えると、SoftDeviceのHEX→ビルドしたHEXの順に焼いて動くようになった。
HEXファイルをマージすると安心ではあるのだが、SoftDeviceを書き換えることはめったにないので、一度このようにして動くのが確認できれば、あとはビルドしたHEXだけをD&Dで焼けばよいはずである。
まとめるのは、mergehexというツールがあるようだが、上記手順までではインストールされなかったので、nRF Toolsに入っているのかもしれん。
動かなかったとしても、フォローできないので先に進もう。
ここまでで、BLE NanoのCharacteristicが見えていたなら、残っているのはCentralからの書込に応じてLEDの点灯状態を変更する、というところだけが残っていることになる。
Centralから書込まれると、service_if.cのon_nanoled_service_evt()が呼ばれ、case文のBLE_NANOLED_SERVICE_LED_EVT_WRITEに分岐することになる。
BLE Nanoに載っているLEDを変更したかったら、このcase文に書けばよいだ。
書込まれた値は、Bluetooth Developer StudioのFIELDで「onoff」という名前を付けたので、それでgrepしよう。
ble_nanoled_service_led_tというstructのtypedefに入っている。
そしてble_nanoled_service_led_tはble_nanoled_service_evt_t.paramsの中に入っている。
さっきのcase文が入っている関数はble_nanoled_service_evt_tが引数で渡されるので、そこからonoffを探せばよいだろう。
試したところ、BLE NanoのLEDは、GPIOの19番になっていた。
そして、アクティブLOになっていて、0で点灯、1で消灯のようだ。
service_if.cを以下のように変更すると、AndroidのnRF connectアプリでCharacteristic書込みを行うとLED制御できた。
- bluetooth_init()
- nrf_gpio_cfg_output(19);
- on_nanoled_service_evt()
- BLE_NANOLED_SERVICE_LED_EVT_WRITEの中
- p_evt->params.led.onoffが0なら19番に1、0以外なら0書込み
- BLE_NANOLED_SERVICE_LED_EVT_WRITEの中
static void on_nanoled_service_evt(ble_nanoled_service_t * p_nanoled_service, ble_nanoled_service_evt_t * p_evt) { int onoff; switch (p_evt->evt_type) { case BLE_NANOLED_SERVICE_LED_EVT_WRITE: app_trace_log("[Bluetooth_IF]: NANOLED_SERVICE_LED evt WRITE. \r\n"); if (p_evt->params.led.onoff == 0) { onoff = 1; } else { onoff = 0; } nrf_gpio_pin_write(19, onoff); break; default: // No implementation needed. break; } }
uint32_t bluetooth_init(void) { ... nrf_gpio_cfg_output(19); nrf_gpio_pin_write(19, 1);
... }
修正したらKeilでビルドして、できたHEXファイルをBLE Nanoに書込む。
SoftDeviceは、消さない限りは前のが残っているようだ。
焼いた後は立ち上げ直して、スマホアプリからCONNECTし、Characteristicに0x00かそれ以外を書込めば、LEDが消えたり点いたりするはずだ。
BLE Nanoはここまで。
Androidアプリは・・・力尽きたので省略だ。
自動生成した中にbatファイルがあるので、Android Studioで新規生成したプロジェクトのフォルダを引数に指定して実行すると、ファイルがコピーされるようになっている。
以前のここを参照しておくれ。
http://hiro99ma.blogspot.com/2016/02/bleandroidbluetooth-developer.html
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。