nRF52でBLEデバイスを開発する（１）Adafruit FeatherとSEGGER Embeded Studio

# はじめに
　今年のはじめにnRF52832を使った製品開発に突っ込まれたおかげで、それなりのノウハウが貯まってしまいました。その殆どはgoogleとNordic Devzoneを調べまくって得た結果です。製品ソースを社外に公開するわけにも行かないので、ワンボードマイコンを使いながらそのノウハウを綴っていきたいと思います。

# nRF52とは
　nRF52とは、Nordic Semiconductor社製のBLEマイコンのシリーズです。Bluetooth 5に対応したBLEスタックがソフトデバイスとして提供されており、このソフトデバイスを使用することで、Bluetooth SIGの認証を取りやすくなっています。

# 方針
　nRF52シリーズにはいくつか開発環境があります。

- Nordic nRF52 SDK
- Zphyr OS
- Arduino
- FreeRTOS

　中でもArduinoはSoCの上にラッパーをかぶせて、同一ソースのソフトウェアを複数の環境で動作させることができる、大変素晴らしい開発環境だと思います。
　ですが、本稿ではArduinoについては一切扱いません。nRF52の標準的な開発環境である、nRF52 SDKとSEGGER Emebded Studioを使います。
　nRF52 SDKを使うことに対するメリット・デメリットはいくつでもあると思いますが、最大のメリットはNordic Devzoneに集約された無数のノウハウを利用できることに尽きるのではないかと思います。ググれば大概の答えがある、というのは思う以上に開発の手助けとなるものです。これに加えて、オープンソース化されたサンプルアプリ・ドライバ・ライブラリ群から、様々なノウハウを得ることが可能です。
　とはいえ、課題設定もなしに調べてもわからないと思うので、私自身が調べた中で蓄積していった成果を書き記していきたいと思います。

# 開発機材

　本稿では、nRF52840をベースに進めていきます。が、nRF52832を使用する場合でも、殆ど変わりません。

　プロトタイピングに以下の機材を使用します。

- nRF52840-DK
https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-DK
- Adafruit Feather 52840 Express
https://www.adafruit.com/product/4062

　nRF52840-DKは、Nordic純正の開発・評価キットです。一枚のボードにnRF52840とSEGGER J-Linkが組み込まれており、これ一枚で基本的な開発・デバッグが可能です。
　ただし、このボードは技適認証を取っていないため、電波を出すと国内法に引っかかります。
　このため、nRF52840-DKのJ-LinkにAdafruit Feather 52840 ExpressのCPUを接続します。Adafruit Feather 52840 ExpressはRaytac製のMDBT50Qモジュールを採用しており、このモジュールが技適認証を取得しています。殆どの場合はこのモジュールを使用することで製品化の際の認証コストを下げることができるはずです。

# 接続

　以下の写真のように、nRF52840-DK(以下DK)のDebug-outポート(P19コネクタ)とAdafruit Feather 52840 Express(以下Feather)のデバッグコネクタを接続します。また、DKのデバッガ側のUSBコネクタと、FeatherのUSBコネクタの両方にPCを接続します。
![nrf52840接続.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89529/3f84e6ef-6517-aff6-b7e6-c7d6c8706a68.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89529/c026d2ef-0203-db92-f96f-fe75585bc190.png)

　必要な部品はmouserで購入できます。

- nRF52840-DK
　https://www.mouser.jp/ProductDetail/Nordic-Semiconductor/nRF52840-DK?qs=sGAEpiMZZMve4%2FbfQkoj%252BNBzIyHv%252BXNRBv7psA4wYuU%3D

- Adafruit Feather 52840 Express
　https://www.mouser.jp/ProductDetail/Adafruit/4062?qs=3HJ2avRr9PJNiFE32RzJVw%3D%3D

- Adafruitアクセサリ 10-pin 2x5 Socket-Socket 1.27mm IDC (SWD) Cable - 150mm long
　https://www.mouser.jp/ProductDetail/Adafruit/1675?qs=sGAEpiMZZMsMyYRRhGMFNoz71MgRCkjBt4Dfh6D%2Fb9c%3D

　一セットで一万円かかりません。

　上記の組み合わせだとケーブル一本でかんたんに接続できますが、他のボードを使いたい場合もあるでしょう。
　その場合は以下のように配線します。DKのP20コネクタからジャンパ線で引き出します。

　ターゲットに給電してある場合。

|DK|ターゲット|
|:-----|-----:|
|VTG|VDD|
|GND Detect|GND|
|SWDIO|SWDIO|
|SWDCLK|SWDCLK|

　ターゲットに給電していない場合。(DKから給電する場合)

|DK|ターゲット||
|:-----|-----:|:--|
|VDD|VDD||
|GND|GND||
|SWDIO|SWDIO||
|SWDCLK|SWDCLK||
|VDD - VTG||(DKボード上で配線)|
|GND - GND Detect||(DKボード上で配線)|

　大抵のボードではSWDIO/SWDCLKはスルーホールではなく、パッドで出ているだけなので、ジャンパ線のはんだ付けなどが必要になります。

# SEGGER Embeded Studioとは
　SEGGER社の出しているIoT向けIDEです。単体で買うと$9900しますが、Nordic製品をターゲットとしている場合に限り、無料で商用利用可能なライセンスが発行されます。(ブレークポイントが5個まで、などPro版との違いがあります)
　nRF52 SDKは他の開発環境もサポートしていますが、ちゃんと動くバイナリの吐けるIDEを使わない手はありません。
　以下のものをダンロード・インストールします。
　- SEGGER Emebeded Studio(以下SES)
　- nrfGo Studio
　- nRF52 SDK (ダウンロードしてC:\Nordic\とかに展開しておく)
　- Nordic Commnd Line Tools (nRFgoに入っているバイナリはバージョンが古いため)

　SEGGER Embeded Studioのインストールについては、こちらの記事を参照ください。
　Nordic Nrf528xxを使ってみよう　nrf52840 nerf52832 Segger Embedded Studio準備編　
　https://qiita.com/usashirou/items/7b0156170a3d636a393c

　SEGGER Embeded Studioを起動すると、以下のダイアログが出ます。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89529/4b17de10-dadb-12ab-2ab9-54c3b9019290.png)
　"Activate Your Free License"をクリックしてメールアドレスを登録しましょう。(Nordicユーザー向けのライセンスは、nRF52向けのプロジェクトを開いて初めて有効になります。)

# Lチカ
　とりあえず、Lチカで動作確認しましょう。

　まず、Debugケーブルを一旦外して、DK単体にします。
　この状態で、(SDKを展開したディレクトリ)/examples/peripheral/blinky/pca10056/blank/ses/blinky_pca10056.emProjectをダブルクリックして開きます。インストールが間違っていなければSESが起動するはずです。(*.emProjectがSESのプロジェクトファイル)
　開いたら、Debug→Goで走らせます。DK上のLEDが点滅を開始したらOKです。

　次に、Debugケーブルを挿して、Featherに接続します。最初はAdafruitのArduino互換のファームが焼かれているので、Target→Connect J-Link、Target→Erase Allとやって、Flashを初期化します。)
　その上で、main()を以下の様に書き替えます。

```main.c
int main(void)
{
    /* Configure board. */
    int bluepin = NRF_GPIO_PIN_MAP(1,10);  // P1.10
    int redpin = NRF_GPIO_PIN_MAP(1,15);  // P1.15

    nrf_gpio_cfg_output(bluepin);
    nrf_gpio_pin_write(bluepin,1);

    nrf_gpio_cfg_output(redpin);
    nrf_gpio_pin_write(redpin,0);

    /* Toggle LEDs. */
    while (true)
    {
      nrf_gpio_pin_toggle(bluepin);
      nrf_gpio_pin_toggle(redpin);
      nrf_delay_ms(500);
    }
}
```
　Featherの回路図(https://cdn-learn.adafruit.com/assets/assets/000/068/545/original/circuitpython_nRF52840_Schematic_REV-D.png?1546364754 )によると、P1.15が赤色LEDで、P1.10が青色LEDとなります。

　他のボードでLチカをやる場合は以下の記事が参考になります。
　Nordic Nrf528xxを使ってみよう　Lチカをしよう nrf52832 Segger Embedded Studio編
　https://qiita.com/usashirou/items/3d86ee832b508331d12c

# 自分のプロジェクトを作る
　上のLチカではSDK内のソースファイルを直接書き替えてしまいましたが、通常の開発であればソースコードをポータブルにする必要があります。
　まず、上で使ったプロジェクトを作業用ディレクトリにコピーします。(仮にC:/work/Nordic/blinkeyとします。)
　次にC:/work/Nordic/blinkey/pca10056/blank/ses/blinky_pca10056.emProject をテキストエディタで開き、「../../../../../..」を「$(SDK)」で全置換し、保存します。
　このemProjectをSESで開き、Tools→Optionを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89529/3c33b226-a611-6986-216e-ea73e1abb618.png)
　ここのBuilding→Global Macrosをダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89529/aae74ea7-1b22-f869-72cf-dce09db6808a.png)
　ここに、「SDK=(SDKを展開したパス)」と書き込み、OKを押して閉じます。

　これで、SDKを参照するディレクトリが分離できました。ローカルに存在するソースファイルは、main.cとconfig/sdk_config.hのみとなりました。SDKのディレクトリをリードオンリーに設定して余計な上書を防ぐようにしましょう。

　私の使用している.gitignoreを書いておきます。

```
*.hex
*.emSession 
*.jlink
Output
*.eww
```
　これでリポジトリに保存できるようになりました。

# 余談
　DKが採用しているデバッガマイコンにはSEGGER純正のJ-Linkが使用されています。(DKの裏にSEGGERのロゴが印刷されていますね。)SEGGER社が出している純正のJ-Link BASEが$300前後することを考えると、5000円で購入可能なこの製品は大変お買い得といえます。
　J-Linkを使いたいだけであれば、J-Link EDU(学生や研究用に限定2500円～)や、ST-LinkのJ-Link化など、もっとお安い方法があります。が、趣味でやるんならともかく、お仕事で確実に動くものが欲しい場合はDKが有力な選択肢になると思います。(Amazonで1000円ぐらいで売ってる中華クローンは使い物になりませんでしたｗ)

# 余談２
　上で紹介している、nRF52840-DK+Adafruit Featherの組み合わせは、技適取れていること以外はnRF52840-DK単体とできることに違いはありません。「バレなきゃ犯罪じゃないんですよ」とか言わないようにｗ

# 参考リンク
　Nordic Infocenter(APIリファレンスなど)
　https://infocenter.nordicsemi.com/topic/struct_welcome/struct/welcome.html

　Nordic Devzone(QAサイト。nRF52+キーワードでググると大抵ここが出ます)
　https://devzone.nordicsemi.com/

　ゼロから作るBLEデバイス　nRFマイコンとSEGGER Embedded Studioでやってみた！ (同人誌500円とっかかりには丁度いいです)
　https://booth.pm/ja/items/1577270