nRF52832のBLE機能を用いてデータの取得をしてみた

#nRF52832のBLE機能を用いてデータの取得をしてみた
##目次
- [はじめに](#anchor1)
- [セットアップ](#anchor2)
 - [サンプルコードの取得](#an1)
 - [program a Softdeviceを行う](#an2)
 - [書き込みを行う](#an3)
 - [スマホと接続する](#an4)
- [プログラムの確認](#anchor3)
- [最後に](#anchor4)

<a id="anchor1"></a>
##はじめに
省電力でBLE通信を行うことができるnRF52832のHeart Rate MeasurementとBattery Levelを一定間隔毎に取得するサンプルコードを動かしてみた。文字量を減らして見やすくすることを最優先にしたので、情報不足になっている箇所もあるかとは思われます。<br><br>このサンプルコードはNordic公式が配布しているサンプルコードである。<br>今回はBLE通信でnRF52832からスマートフォンにデータを送るサンプルコードを実行した。

<a id="anchor2"></a>
##セットアップ
[Nordic公式サイト](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v13.0.0%2Fble_sdk_app_hrs.html)を元に以下の作業は行われた。開発環境はOSX10.15.2、SDKはnRF5 SDK v13.0.0である。

<a id="an1"></a>
###サンプルコードの取得
1.  [本サイト](https://developer.nordicsemi.com/nRF5_SDK/nRF5_SDK_v13.x.x/)の`	nRF5_SDK_13.0.0_04a0bfd.zip`をクリックし、ダウンロードする。
2. . コンピュータ内で解凍する。

<a id="an2"></a>
###program a Softdeviceを行う
[Nordic公式サイト](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v13.0.0%2Fgetting_started_softdevice.html&anchor=getting_started_sd)に基づいて作業を行った。

まずは使用するマイコンのセットアップを行う必要がある。<br>今回はサイト記載のうち、他に
インストール等が必要ないMac OS環境下で一番簡単な方法？（GCC makefileを使う方法）で試した。

1.  `nrfjprog`を使えるようにするため、
`/nRF-Command-Line-Tools_ 10 _5 _0 _OSX/nrfjprog`にパスを通す。(```vi ~/.bash_profile```でパス変数を編集後、`source ~/.bash_profile`で読み込み)

2.  `make flash_softdevice`を実行して書き込みを行う。<br>この作業からマイコンの接続が必要。お忘れなきよう。

<a id="an3"></a>
###書き込みを行う

1.  ターミナルを起動。
2.  ```cd　/nRF5_SDK_13.0.0_04a0bfd/examples/ble_peripheral/ble_app_hrs/pca10040/s132/armgcc```を実行。
3. `make flash`を実行。

<a id="an4"></a>
###スマホと接続する
以下作業では、iphone8にインストールされているアプリ`nRF Connect`を使用する。

1. Sccanerに表示されている`Nordic_HRM`を選択。<br>候補内にデバイス名が表示されない場合はアプリの再起動をかける。筆者も１回目では表示されなかった。
2. `Connect`で接続する。
3. 右にスワイプして`Services`を表示。
4. `Heart Rate Measurement`と`Battery Level`それぞれの右下にある「三本の下矢印」マークを選択。
5. `Value`に値が表示される。`Heart Rate Measurement`は１秒おきに、`Battery Level`は２秒おきに値が更新されることを確認する。
6. サンプルコードは正常に作動した！！！(`Heart Rate Measurement`の更新周期が１秒より長い気がしなくもない…)

<a id="anchor3"></a>
##プログラムの確認
サンプルコード内の関数やイベントの役割等を解説する。<br>変更を加えたい場合は以下関数やイベントを参考にすると、探している箇所を見つけやすいかもしれない。つまりコードをいじらない場合は読み飛ばしてもらって構わない。
###重要なイベント
####ble _evt _dispatch
様々なイベントのトリガーとなる。これが個々のイベントを開始する。
#####pm _on _ble _evt　
peer_managerにイベントを伝達。
#####ble _hrs _on _ble _evt　
BLEスタックからheart_rateへのすべてのイベントを処理。
#####ble _bas _on _ble _evt　
BLEスタックからバッテリーサービスへのすべてのイベントを処理。

###その他のイベント
#####ble _conn _params _on _ble _evt　
このモジュールに関するBLEスタックからのすべてのイベントを処理。
#####bsp _btn _ble _on _ble _evt　
このモジュールに関するBLEスタックからのすべてのイベントを処理。
#####ble _advertising _on _ble _evt　
Advertisingモジュールに関するBLEイベントを処理するには、モジュールのBLEスタックイベントディスパッチャからこの関数を呼び出す必要がある。
####nrf _ble _gatt _on _ble _evt　
このモジュールに関するBLEスタックからのイベントを処理。

###初期設定
####timer init()
タイマーモジュール
`battery_level_meas_timeout_handler`,`heart_rate_meas_timeout_handler`を作成。

####ble _stack _init()
 ble _evt _dispatchの設定。
 
####advertising_init()
 advertising _dataをスタックに保存。そしてble _advertising _startによって操作されるローカル構造内(on _adv _evt)にデータ保存。
 今後使用される接続設定タブを変更。
 
####services_init()
 heart rateの初期化。
 バッテリーサービスの初期化。
 Device Information Serviceの初期化。
 
####sensor _simulator _init()
 センサーの設定。
 
####conn _params _init()
  GAP Peripheral Preferred Connection Parametersの設定。
  update _timeout _handlerの作成。

####peer _manager _init()
 peer _managerの設定
 pm _even t _handlerをpeer _managerに登録。
 FDSであるfds _evt _handlerを登録。

####application _timers _start()
 タイマースタート。

###advertising_start()
#####peerにデータが保存されている場合
 peerに保存されている前のデータを削除。後advertisingをスタートさせる。
#####else
advertisingのチャンネルを設定をし、スタートする。

<a id="anchor4"></a>
##最後に
[MacでPATHを通す](https://qiita.com/nbkn/items/01a11392921119fa0153)を参考にしてパスを通したのだが、パスは通ったもののあまりうまくいかなかったので、パスの通し方がわからないという方はご自身でパスの通し方を勉強なさってから作業された方が賢明かもしれない。<br>具体的な不具合としては、`source ~/.bash_profile`を実行する度に以前のバージョンのパスに以前のバージョン＋変更を加えたパスが追加され、膨大な量に膨れ上がってしまった。