Nordic社製BLEの開発環境構築と動作確認（nRF Connect SDK）

# 記事の概要

Nordic社製のBLEモジュールの開発環境は、nRF5 SDKのサポートが止まり、今後はnRF Connect SDKに移行することが決まっています。

本記事ではnRF Connect SDKの開発環境を構築し、動作確認を行います。
ツールは nRF Connect for Desktop および nRF Connect for VS Code を使用し、VS Code上でアプリケーション開発をします。

基本的にはNordicが公開している動画（インストールからVS Code でのサンプルアプリケーションによるLED点滅確認まで）と同じことをしています。
英語の動画ですが、自動翻訳の字幕でも十分に理解できます。そもそも簡単な英語で話しているので、慣れれば聞き取るのも難しくはないと思います

https://www.youtube.com/watch?v=EAJdOqsL9m8

https://www.youtube.com/watch?v=T4RfflybIGE

https://www.youtube.com/watch?v=N1kDSMBtQ2U

https://www.youtube.com/watch?v=qjVvfU6ShUU

もしくは、文章で読めば数分で済むものを、動画で何十分も見せられるのは退屈だという場合は、スイッチサイエンスさんの開発環境構築記事がお勧めです

https://144lab.kibe.la/shared/entries/467b2482-2346-4c3e-8e0f-28d7403de2b9

上記の２点を紹介した時点で本記事の存在意義はほぼ消滅したも同然ですが、開発環境の構築というのは、自分と記事の作者の些細なPC環境の違いのせいで、記事通りにはいかないということが日常茶飯事です。

実際、私は上記の動画や記事の通りにはいきませんでしたし、私の作成した開発環境構築記事も記事通りにいかなかったとよく言われます。
そのため、他の記事とほとんど似たような内容になったとしても、わずかな差分が誰かの役に立つかもしれないので、複数の記事で多角的に環境構築手順を紹介することには意義があると考えています。

# 動作確認に使用するボードとデバッガ


本記事での動作確認に使用したのは、スイッチサイエンスにて購入した nRF5340 MDBT53-1Mモジュールピッチ変換基板です。
nRF53のボードならば何でもよかったのですが、他の開発ボードは売り切れていたので、唯一在庫のあったこの製品を選びました。

https://www.switch-science.com/products/8658?_pos=3&_sid=45bc5509a&_ss=r

今回の記事では紹介しませんが、nRF52の開発ボードでも動作確認できました。

また、デバッガには[J-LINK BASE](https://www.digikey.jp/product-detail/ja/segger-microcontroller-systems/8-08-00-J-LINK-BASE/899-1004-ND/2175882)を用いました。
ですが、動作確認だけが目的の場合や趣味の工作でしたら、もっと安価なJ-[J-LINK EDU](https://www.digikey.jp/ja/products/detail/segger-microcontroller-systems/8-08-91/7387472) を使用すればいいと思います
私は仕事で使用するので[J-LINK BASE](https://www.digikey.jp/product-detail/ja/segger-microcontroller-systems/8-08-00-J-LINK-BASE/899-1004-ND/2175882)を持っていたので、それを使用しました。

<img width="60%" alt="IMG_1671.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/99b93370-e026-62a4-7949-c06a7ab1e0ad.jpeg">

もし[J-LINK BASE](https://www.digikey.jp/product-detail/ja/segger-microcontroller-systems/8-08-00-J-LINK-BASE/899-1004-ND/2175882)を使用するのでしたら、ボードとデバッガを接続には変換基板が必要になります。

<img width="30%" alt="IMG_1673.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/822d1c7f-0431-1efc-3b91-b9e5e6fcf051.jpeg">

私はさくらインターネットから開発者向けに頒布された変換基板を用いていますが、変換基板を持っていない場合、以下のタイプのケーブルを購入して同様の治具を自作ください。

- コネクタタイプ ソケット
- ピッチコネクタ	0.050インチ
- ポジション数	10個	
- 列数	2列

例えば[FFSD-05-S-06.00-01-N](https://www.digikey.jp/product-detail/ja/samtec-inc/FFSD-05-S-06-00-01-N/SAM8221-ND/1106580)がお勧めです。

# nRF Connect for Desktop のインストール

まずは nRF Connect for Desktopをインストールします。

以下のサイトにおいてDownloadsをクリックします

https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-Desktop

<img width="90%" alt="nRFConnectforDesktopサイト.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/86ac8ddc-c5aa-8652-2647-43ef3f10d550.png">

Downloads画面に移動したら、左のプルダウンメニューから自分のPCのOSを選択し、表示されているexeファイルをダウンロードします。

<img width="90%" alt="手順1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/a2967982-81ce-2c83-56b1-84b428f261cd.png">

exeファイルを実行すると、インストールが開始されます。
インストールの設定は全て初期設定のままで問題ないはずです。

ただし、途中で開始される SEGGER のインストールについてのみは、後述する理由でlegacy USB Driver もインストールすることを推奨します。

<img width="50%" alt="手順2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/61bf385a-9109-6d10-8aef-a4feab2c899c.png">

以下の赤で囲んだlegacy USB Driver インストールのボックスをチェックします。

<img width="50%" alt="Segger2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/50b30d3b-d443-fd97-ad78-8288a6aac9c5.png">

インストールが完了し、nRF Connect for Desktopを起動すると以下の画面が立ち上がります。
必要なツールを更にインストールします。

<img width="50%" alt="手順3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/4193ca9b-a21a-5dcd-3079-49656240e02d.png">

本記事では、ProgrammerとToolChainManagerを使用するので、それらをインストールしてください。

# nRF Connect for Desktop

## Programmerの使用方法

Programmerを起動し、SELECT DEVICEをクリックすると、ボードに接続されているデバッガ一覧が表示されるます。
本記事ではJ-Linkを使用するので、J-Linkをクリックします。

<img width="90%" alt="VsCode1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/91c0e1f1-83fa-c74a-6e7c-e59c37b91649.png">

Readをクリックすると、現在のデバイスに書き込まれているデータが右側に表示されます。

<img width="90%" alt="VsCode2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/63958ee7-ec1b-835f-b235-d726494d5999.png">

Add fileを選択して、書き込みたいhexファイルを選択すると、左側に書き込むデータが表示されます。
Erase & write をクリックすると、書き込みが開始されます。

<img width="90%" alt="VsCode3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/42b3513b-d30f-3003-89f4-58349ae48858.png">

後述する nRF Connect for VS Code を用いて書き込みすることもできます。

## ToolChainManager

ToolChainManager を起動すると様々なバージョンのnRF Connect SDKをインストールすることができます。
開発する製品に合わせたSDKをインストールします。

<img width="70%" alt="ToolChainManager1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/accc0793-0a3a-4c65-ae14-9f4d4c72427d.png">

インストールしたSDKについては、更新や削除もできます

<img width="60%" alt="Segger3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/848b9d11-bb87-68db-61c4-987796942278.png">

また、後述する nRF Connect for VS Code を用いてSDKをインストール、更新、削除することもできます。

# nRF Connect for VS code

次は VS Code上から利用できるnRF Connect for VS codeをインストールします。

nRF Connect for VS codeを使用する為には、当然、VS Codeが必要になります。
VS Codeのインストール方法については多くの解説記事があるので、ここでは省略します。

まず最初にVS Codeを起動し、Extensionsをクリックします。
<img width="50%" alt="VsCode1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/85f8eb74-f23c-dc5b-5ffe-0cad57ccc57a.png">

検索欄にnRF Connectと入力し、表示されたものの中から「nRF Connect for VS Code Extension Pack」のinstallをクリックします。

<img width="50%" alt="VsCode2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/d1c587c3-5cbc-2c63-773d-57731cd6d19e.png">

更にinstallをクリックします。

<img width="50%" alt="VsCode3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/fe383107-ebf5-2e87-5d02-403391bfa3bd.png">

インストールが完了すると、nRF Connectのアイコンが追加されるので、クリックします。

<img width="50%" alt="VsCode4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/5a0345cd-8b26-6e9c-43a1-b7ecfb2ce9ce.png">

何のToolchainもインストールしていなければ、Install Toolchainという文字だけが表示されるのでクリックします。
すると、様々なバージョンのToolchainが表示されるので、どれかのバージョンを選択してクリックします。
今回は最新のv2.6.1をインストールします。Toolchainのインストールには少し時間がかかります。

<img width="70%" alt="VsCode5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/ccaede39-3e47-bac5-797b-218afb4b79c9.png">

Toolchainがインストールに成功すれば、nRF ConnectのアイコンをクリックするとWELCOMEメニューが表示されます

<img width="50%" alt="VsCode4b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/e1f805b1-3fb2-dba7-cad8-ed12677d67e2.png">

既にToolchainがインストールされているとき、別のバージョンをインストールしたい場合は、WELCOMEメニューの「Manage toolchain」→「Install Toolchain」の順で選択してクリックすると、先ほどと同様に様々なバージョンのToolchainが表示されて選ぶことができます。

<img width="70%" alt="VsCode5b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/1d2d527f-6901-ab91-7617-241a92694545.png">

先ほどにToolChainManager でSDKをインストールする方法を紹介しましたが、VS Codeでも同じことができます。
WELCOMEメニューの「Manage SDKs」→「Install SDKs」の順で選択してクリックします。

<img width="90%" alt="VsCode6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/a7f4ebd5-6def-4747-c609-ff4b408ff8ef.png">

すると様々なバージョンのSDKが表示されるので、開発したいマイコンに対応しているバージョンを選択してクリックします。
今回はv2.6.1を選択しました。

<img width="80%" alt="VsCode7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/bcc28ba0-05f3-79e0-ec8c-fd7b94e2e877.png">

SDKのインストール先とフォルダ名を入力してEnterキーを押します。

<img width="60%" alt="ToolChainManager1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/5838a503-71c8-8d90-f19e-e76a16faa531.png">

インストールが成功したかどうかはターミナルに表示されるメッセージで確認します

## nrfjprog についてエラーが出た場合

SDKのインストール時、私は以下のエラーがターミナルに表示され、nrfjprogを実行できませんでした。

<pre>Using the nRF Connect SDK v2.6.1 at c:\ncs\v2.6.1
️❗️ nrfjprog couldn't be executed. Please ensure that SEGGER J-Link Software and Documentation Pack and nRF Command Line Tools are both installed.</pre>

先ほどの手順で紹介したように、SEGGER J-Link Softwareはインストール済みのはずなのに、それがないと言われてしまいました。
そこで、jlinkのサイトから64-bit版と32-bit版のインストーラーを両方ダウンロードして実行しました。

https://www.segger.com/downloads/jlink

<img width="70%" alt="Segger1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/7ccfe7bc-afb1-8b6d-8734-5f4b799d50fd.png">

また、インストールの際には、legacy USB Driver をインストールするボックスにチェックを入れました。

<img width="60%" alt="Segger2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/50b30d3b-d443-fd97-ad78-8288a6aac9c5.png">

これらを行った後、ToolChainManager でSDKを更新したところ、このエラーは出なくなりました。
片っ端からインストールしたので、どのソフトウェアが不足していたのかは不明ですが、必要なソフトウェアはインストールできたようです。

SDKの更新は、nRF Connect のWELCOMEメニューの「Manage SDKs」からもできるはずです。
もしくはいったんSDKを削除してから再インストールしてください。


# アプリケーションの作成

次は開発環境を用いてアプリケーション作成し、ビルド、書き込み、デバッグの確認をします。

アプリケーションの作成方法については、いかのNordic社の演習ページも参考になります。

https://academy.nordicsemi.com/courses/nrf-connect-sdk-fundamentals/lessons/lesson-1-nrf-connect-sdk-introduction/topic/exercise-2-1/


今回は既に用意されているサンプルのアプリケーションを用います。
WELCOMEメニューの「Create a new application」→「Copy a sample」の順に選択してクリックします。

<img width="100%" alt="application_example1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/c8d0a1b2-d965-ab94-c1c7-eab7cb019785.png">

Blinkey Sampleを探してクリックします。
このサンプルはLEDを1秒間隔で点滅させるアプリケーションです。

<img width="60%" alt="application_example2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/e3caddd0-8f88-50ec-babc-393050b5bbc0.png">

アプリケーションの保存場所と名称を入力してEnterキーを押します。

<img width="70%" alt="application_example3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/5a6a2537-8e26-e2b5-07b8-14dc91f00bf0.png">

作成したアプリケーションを開くかどうかを聞いてくるので、Openをクリックします。

<img width="40%" alt="application_example4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/2fbbdf13-69b1-704e-7e4c-df97c58a0d4b.png">

以上の操作をすると、Applicationメニューが追加され、そこに追加したアプリケーションが表示されます。
この時点では何のソースファイルや設定も存在しないので、まずはビルド設定を行います。
「Add build configuration」をクリックします。

<img width="50%" alt="application_example5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/77622acd-777c-5484-f18b-a9765a15fd61.png">

Boardから1つを選択します。
有名な開発ボードの設定は既に登録されているので、それを選択します。
自分で作成したボードやここに登録されていないボードについては、自分でボード設定を作成するか、既に作成されたボード設定を追加しないといけません。

今回は登録されていないボードを使用するので自分で設定を追加しないといけないのですが、動作確認の為にボード設定を1から作りたくないので既存のボード設定を流用します。
今回は、nrf5340dk_nrf5340_cpuapp_nsを選択します。

**[追記]重要な補足**
boardの設定には nrf5340dk_nrf5340_cpuapp_ns と nrf5340dk_nrf5340_cpuapp があります。
nsはnon-secureの略で、一見するとセキュリティが低いように思えるかもしれませんが、実際にはこちらの方が Cortex-M Security Extension が適用されており より安全です。
nsがつかない方はデバッグ用などの動作確認に用いて、nsがつく方を製品版として利用するのが推奨されます。
**（追記終わり）**

<img width="70%" alt="application_example6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/c3aba487-6c6e-ecbe-67a8-9f285e309413.png">


自動選択でconfファイルを探して選んでくれるのですが、念のために Configurationはprj.confを手入力で選択します。（この項目を設定しなくても、今回は自動でprj.confファイルが選択されます。）
その他の設定は初期設定のままで問題ありません。


設定してからBuild Configurationをクリックすると、ソースフォルダ、設定フォルダ、出力フォルダが作成され、ビルドが自動で実行されます。


なお、既に作成されたボード設定を追加する方法は以下を参照ください。

https://144lab.kibe.la/shared/entries/467b2482-2346-4c3e-8e0f-28d7403de2b9#vscode%E3%81%A7blinky%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89

ただし、私の環境では、用意されていたボード設定が期待通りに動作しなかったので、今回は別のボード設定を流用しました。

なお、設定後にビルド設定を修正したい場合は、ビルド設定の横の...を右クリックしてメニューを表示させて「Edit Build Configuration」をクリックします。

<img width="70%" alt="application_example8a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/01b1147c-eccb-cc57-50a9-6ab38e902ac3.png">

先ほどと同様の画面が表示されるので、設定をやり直してからBuild Configurationをクリックすると、ソースフォルダ、設定フォルダ、出力フォルダが更新され、ビルドが再実行されます。

<img width="50%" alt="application_example8b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/97321de3-de45-c8cd-d6c7-c73c7f88bdd5.png">

ソースフォルダを展開すると、今回のアプリケーションのソースファイル main.c があります。

<img width="70%" alt="application_example7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/8129e2d2-46f1-1b9f-d732-ad813ae45099.png">

また、ACTIONメニューとCONNECTED DEVICESメニューが追加されていることも確認できます。

ACTIONメニューの項目について、Buildで再ビルド、Debugでデバッグと書き込み、Flashで書き込みができます。

CONNECTED DEVICESメニューにはデバッガと接続されているデバイスが表示されています。

<img width="50%" alt="application_example9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/7452bb41-9697-564e-7bf7-a8608869ce85.png">

今回は他のボードの設定を流用しているのでLEDのポート設定が使用しているボードと一致していません。
~~そこでnRF5340_cpuapp_common.dtsiの設定を一時的に変更します。~~

**[追記]修正**
既存のboardの設定を変更したいときはoverlayファイルを使用します。（もしくは1から作り直します）
APPLICATION -> build -> 各自の作成したアプリケーション名　を選択してから、各自の作成したアプリケーション名のメニュー -> Config files -> +Create overlay file をクリックすると overlayファイルが生成されます。
ここに書き込んだ設定は、既存の設定を上書きします。よって以下のled0のポート設定はoverlayファイルに実装してください。
**（追記終わり）**


main.cで使用しているled0のポートをPort1_11にしておきます。

```C
		led0: led_0 {
			gpios = <&gpio1 11 GPIO_ACTIVE_LOW>;
			label = "Green LED 0";
		};
  ```

<img width="70%" alt="application_example10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/e7b3e7b5-7e5e-a5ca-3b77-a4b33a0b82c2.png">

ACTIONメニューのBuildをクリックして再ビルド後、Flashをクリックすると、修正後のプログラムを書き込みます。
リセットもしくは電源のOFF/ONをすれば、書き込んだプログラムが動作し、LEDが点滅を開始します。
 
<img width="30%" alt="IMG_1672.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/f89a3d2f-da02-febf-a7c8-8222ad9a2fe0.jpeg">

デバッガで内部の動作を追いかけることもできます。
ACTIONメニューのDebugをクリックするとデバッグメニューが表示され、コントロールパネルが表示されます。

ソースの行をクリックしてブレークポイントを置き、リセットをクリックすればブレークポイントで止まり、矢印をクリックすれば次のブレークポイントまで動作します。

<img width="70%" alt="application_example11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/b20ae970-21ff-bd0a-6e35-88be9c6f2cea.png">

# 関連記事

* 周辺機能
    * [nRF Connect SDKによるBLEアプリケーション開発１：デバイスツリーの作成](https://qiita.com/Kosuke_Matsui/items/a12397e22331f41ed330)
    * [nRF Connect SDKによるBLEアプリケーション開発2：メッセージ出力](https://qiita.com/Kosuke_Matsui/items/9e314cc6137e06df0de0)