Nordic Nrf528xxを使ってみよう nrf52840（MDBT50Q）でカスタムボードを作ってみよう

nrf52840はArduinoに採用されました。
今後もいろいろなボードが出てくると思われますが、
今回、MDBT50Qでビーコンを製作したので自作ボードを作る際の注意点等を紹介します。

<img width="400" alt=nrf52840-Ble-Beacon src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/17f7b3d6-b424-ff14-fde6-b056a1ce3618.jpeg>

#入手について
現在、販売されているモジュールは、多岐にわたっており、世界的にみると、Raytecのシリーズが中心かと思われます。
http://bluetooth.tokyo/
日本では株式会社フクミが商流を担当していましたが、スイッチサイエンスで一般販売しています。
https://www.switch-science.com/catalog/list/809/
国内メーカーの製品よりも安価に開発が行えるようになったと言えます。

なお、ロット購入は、株式会社フクミで対応してもらえるそうです。
https://fukumi.co.jp/contact

また、国内メーカーが良いという方は、加賀デバイスさんなどに相談すると良いようです。

#GPIOの設定
SDKの
\components\boards\pca10056.h
nrf52840:pca10056.h
nrf52832:pca10040.h

たとえば、以下のように記述されています。

```
#define LED_1          NRF_GPIO_PIN_MAP(0,17)
```
ピン設定を変更したいときは、後ろの(0,17)を変更します。

#Debugger
J-LINK EDU MINIなどを使用しています。
J-LINK EDU MINIはDigikeyで2,354円（2019年8月2日現在）で購入可能です。
秋月電子でも取り扱ってくれるといいのですがね・・・

残念ながらSTマイクロのNucleoについているST-LinkをJ-LinkOB化しても
nrf52840では使用できません。
このため、大きいJ-Linkか上記を使用することになります。
私の製作したものは、大きいJ-Linkと接続コネクタを製作して接続しています。

<img width="600" alt=J-Link-adapter.jpg src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c2a76a36-6974-5977-c0de-68e22879bf11.jpeg>
なお、別途、Cmcis－DapやDaplinkを使えば、書き込み可能です。

こちらも参照ください。
https://qiita.com/drafts/09c86e01d37ef1db9244/edit

#32.768 kHz 外部クリスタル
nrf52xx系のモジュールには32.768 kHzのクリスタルが内蔵されていないものが多多あります。
仕様としてはXTAL SMD 2012, 32.768kHz, 9pF, ±20ppmになります。
このため、外部にクリスタルを用意する必要がありますが、
精度が厳しい為に、うまく動かない事があるようです。
*クリスタルが存在しないと、無線を発信できません。

以下ファイルの該当箇所を修正することで内蔵クロックで動作するようになります。
SDKの
\config\nrf52840\config\sdk_config.h

私は、以下を変更しました。

```
#define NRF_SDH_CLOCK_LF_SRC 1
#define NRF_SDH_CLOCK_LF_RC_CTIV 0
#define NRF_SDH_CLOCK_LF_ACCURACY 7
```
参考：nRF52 XTAL使わずにRCクロックでBLE通信
http://blog.suga41.com/?eid=384

以下、変更後のものです。

```
//==========================================================

// <h> Clock - SoftDevice clock configuration

//==========================================================
// <o> NRF_SDH_CLOCK_LF_SRC  - SoftDevice clock source.
 
// <0=> NRF_CLOCK_LF_SRC_RC 
// <1=> NRF_CLOCK_LF_SRC_XTAL 
// <2=> NRF_CLOCK_LF_SRC_SYNTH 

#ifndef NRF_SDH_CLOCK_LF_SRC
#define NRF_SDH_CLOCK_LF_SRC 0
//#define NRF_SDH_CLOCK_LF_SRC 1
#endif

// <o> NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval. 
#ifndef NRF_SDH_CLOCK_LF_RC_CTIV
#define NRF_SDH_CLOCK_LF_RC_CTIV 16
//#define NRF_SDH_CLOCK_LF_RC_CTIV 0
#endif

// <o> NRF_SDH_CLOCK_LF_RC_TEMP_CTIV - SoftDevice calibration timer interval under constant temperature. 
// <i> How often (in number of calibration intervals) the RC oscillator shall be calibrated
// <i>  if the temperature has not changed.

#ifndef NRF_SDH_CLOCK_LF_RC_TEMP_CTIV
#define NRF_SDH_CLOCK_LF_RC_TEMP_CTIV 2
//#define NRF_SDH_CLOCK_LF_RC_TEMP_CTIV 0
#endif

// <o> NRF_SDH_CLOCK_LF_ACCURACY  - External clock accuracy used in the LL to compute timing.
 
// <0=> NRF_CLOCK_LF_ACCURACY_250_PPM 
// <1=> NRF_CLOCK_LF_ACCURACY_500_PPM 
// <2=> NRF_CLOCK_LF_ACCURACY_150_PPM 
// <3=> NRF_CLOCK_LF_ACCURACY_100_PPM 
// <4=> NRF_CLOCK_LF_ACCURACY_75_PPM 
// <5=> NRF_CLOCK_LF_ACCURACY_50_PPM 
// <6=> NRF_CLOCK_LF_ACCURACY_30_PPM 
// <7=> NRF_CLOCK_LF_ACCURACY_20_PPM 
// <8=> NRF_CLOCK_LF_ACCURACY_10_PPM 
// <9=> NRF_CLOCK_LF_ACCURACY_5_PPM 
// <10=> NRF_CLOCK_LF_ACCURACY_2_PPM 
// <11=> NRF_CLOCK_LF_ACCURACY_1_PPM 

#ifndef NRF_SDH_CLOCK_LF_ACCURACY
#define NRF_SDH_CLOCK_LF_ACCURACY 0
//#define NRF_SDH_CLOCK_LF_ACCURACY 7
#endif

// </h> 
//==========================================================
```