nRF9160DKを動かしてみたよ

編集履歴
MQTTの操作方法が不十分だったので加筆しました 2021年6月3日
通信の確認の記述が不十分だったので加筆しました。　2021年7月1日

＜概要＞
nordic社製の通信モジュール、nRF9160を使用する下準備として開発キットnRF9160DKで接続確認をしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/85b155b9-66a6-f849-71b2-072a1993c3de.png)

nRF9160DKは、nRF9160 LTE Cat-M1/Cat-NB1 System in Package (SiP)のアプリケーション・ファームウェアを設計・開発するためのハードウェア開発プラットフォームです。
この開発キットには、SIMカードホルダーやアンテナなど必要な外部回路がすべて含まれています。
LTEのモデムでLTE通信を行い、ATコマンドで制御することができます。モデムのファームウェアはコンパイル済みのファームウェアとして提供されており、[ここ](https://www.nordicsemi.com/Software-and-tools/Development-Kits/nRF9160-DK/Download?lang=ja-JP#infotabs)でダウンロードすることができます。
日本国内で使用するためにはファームウェアをアップデートする必要があります。
今回はさくらインターネットのセキュアモバイルコネクトSIMを使用して接続確認を行いました。
接続確認をする上でファームウェアのアップデートと、接続の確認の方法がわかりにくかったので手順をシェアします。

＜使用機器＞
[nRF9160DK](https://www.mouser.jp/ProductDetail/Nordic-Semiconductor/nRF9160-DK?qs=byeeYqUIh0NojiJp04V9fA==)
[さくらセキュアモバイルコネクトSIM](https://www.sakura.ad.jp/services/sim/)
Windows10
マイクロUSBケーブル

＜手順＞
・開発環境をインストールする
・ファームウェアのダウンロードをする
・nRF Connect for Desktopのインストールを行う
・nRF Connect LTE Link Monitorのインストールを行う
・nRF Connect Programmerのインストールを行う
・日本国内で電波をつかめるようにファームウェアのアップデートをする
・http通信ができるようにファームウェアのアップデートをする
・接続の確認を行う

＜接続の準備 ファームウェア＞
１．まずはnRFConnectSDKという、ソフトウェア開発キットをダウンロードしてインストールします。手動でインストールしてもできるのですが、スピーディに行うためにデスクトップアプリを使用します。
[こちら](https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Connect-for-desktop/Download)からnRF Connect for Desktop をダウンロードします。私は最新版をダウンロードしました。
ダウロードが終わったらexeファイルを開いてインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/465c50f8-eb86-9825-785e-1d439fbf21b4.png)

２．写真のような画面が出ますので、Toolchain manager, Programmer, LTE Link Monitorをインストールしてください。上記の写真ではOpenというボタンになっていますが、インストールする前はInstallというボタンになっていますので押下するとインストールすることができます。

３．インストールが終了したらToolchainManagerを開きます。
ToolchainManagerからnRF Connect SDK v1.5.1をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/6485db08-a98e-ed45-2437-30db4f635c1a.png)

先ほどと同じようにInstallボタンを押下することでインストールすることができます。
※今回はビルド済のファームウェアを書き込むようにしますので、必要ないかもしれません。

４．書き込むファームウェをダウンロードしておきます。
[こちら](https://www.nordicsemi.com/Software-and-tools/Development-Kits/nRF9160-DK/Download?lang=ja-JP#infotabs)にアクセスしてファームウェアをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/b502f8e8-be80-6cc9-ebf2-51b0c316cf80.png)
今回は一番新しいファームウェアを選択しました。

５．ここで開発ボードの接続を行います。
このとき、開発ボードのスイッチの位置に気を付けておいてください。
SW1が左側、SW2が中央、SW6が左側になっていることを確認します。
PROG/DEBUGスイッチはnRF91になっていることを確認してください。
左下には電源スイッチもついていますので気をつけておいてください。
自分はこの電源スイッチにしばらく気づかずにはまりかけました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/c883ccb3-35fe-1dcd-d35c-6df589f386f0.png)
６．次にProgrammerを開きます。
Programmerではファームウェアの書き込みを行います。今回は先ほどダウンロードしたファームウェアの中からバッチの書き込みを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/59516cd3-65c5-abbf-b62c-dc17ec08b1a0.png)
７．開発ボードとPCをusbケーブルで接続して、開発ボードの電源が入っていることを確認を行います。1番のボタンを押してポートを選択することにより、シリアル接続を行います。
次に2番のボタンを押してファームウェアのアップデートを行っていきます。

８．2番のボタンを押すとエクスプローラが開きますので、先ほど（４の手順で）ダウンロードしたファームウェアを開きます。ダウンロードしたzipファイルを解凍して、その中に入っているzipファイルを選択してください。ファームウェアのアップデートを行います。

※日本のLTE通信を使用できるようにするにはファームウェアをアップデートする必要があるそうです。
書き込んだビルド済みファームウェアでは、HTTPポートが無効になっていますので、HTTP, FTP, MQTT, GPS等のサポートを有効にするために関連するオプションを有効にしてアプリケーションを自分でコンパイルする必要があります。今回はビルド済のファームウェアがありましたので、追加して書き込むことにします。

９．[こちら](https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/slm_5F00_all_5F00_features_5F00_dk.hex
)から通信オプションが有効になったビルド済のファームウェアをダウンロードします。ダウンロードしたファームウェアを3番の領域にドラッグアンドドロップします。
右側のreadボタンを押して領域を確認した後、writeボタンを押してファームウェアを書き込みます。
これでファームウェアの準備ができました。

＜接続　ATコマンド＞
２の手順でインストールしたLTE Link Monitorを開きます。
Programmerと同じ手順でシリアル接続を行います。
シリアル接続が確立したらATコマンドでモジュールの操作ができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/95823bc5-59b0-1ebb-59a3-250f28e1d54e.png)

まずは、接続ができているか確認します

画面左下のATボタンを押してください。terminalにokが返ってきたらシリアル接続されていることが確認できます。atとsendしても同じことが行えます。

```at
AT+CFUN?
```
でモデムのモードを確認します。
0が帰ってきた場合はモデムがパワーオフになっていますので、

```at
AT+CFUN=1
```
でモデムをパワーオン状態にします。

apnの設定をしていきます。今回はさくらインターネットのセキュアモバイルコネクトのSIMを使用していますので、さくらインターネットの情報を登録していきます。

```at
AT+CGDCONT=1,"IP","sakura.io"
AT+CGAUTH=1,"PAP","sakura","sakura"
```
のatコマンドを送信してokが帰ってきたら必要情報が入力されています。

```at
AT+CGDCONT?
```
のコマンドを送信して、接続先情報を確認します。
"IP","sakura.io","",0,0
のような値が返ってきたら、接続完了です。
右側のsearch networlsボタンを押すか、

```at
AT+COPS=?
```
コマンドを送信することで、ネットワークへのの接続を行います。
接続には時間がかかりますので、気長に待ってください。
LTEの接続がうまく行かないことも多いので、窓際や屋外等なるべく電波環境のいいところで確認することをお勧めします。
通信が確立したら右上の電波状況が表示されるようになります。

通信が確立したらpingをとばして、httpが使用できるか確認します。

```at
AT#XHTTPCCON=1,"google.ca",80
```
pingが送れることが確認できたら、
mqttを送信してみます。

```at
AT#XMQTTCON=1,"MyMQTT-Client-ID","","","mqtt-server",1883
```
コマンドを送信して、ブローカーサーバーと接続します。

```at
AT#XMQTTPUB="topic",1,"Test123 message with QoS 0",0,0
```
コマンドでメッセージをパブリッシュします。

```at
AT#XMQTTSUB="topic",0
```
コマンドでサブスクライブ

```at
AT#XMQTTUNSUB="topic"
```
コマンドでサブスクライブの終了。

```at
AT#XMQTTCON=0,"MyMQTT-Client-ID","","","mqtt-server",1883
```
コマンドでブローカーサーバーの切断ができます。
~~mqttサーバーからからmqttをsubscribeできることを確認します。
subscribeできるところまで確認できたら、~~
MQTTを使用しての双方向通信ができましたので、
nRF9160DKからmqttの通信ができることが確認できました。


＜考察と感想＞
Nordicの開発環境とnRF9160の開発ボードを使用することでLTEによるmqtt通信ができることが確認できました。今後IoTの製品に組み込むことでさらに面白い商品ができそうです。
今回は提供されている開発環境を使用しましたが、teartermを使用することで、おなじATコマンドを使用することができます。
今回は[合同会社NEXTSTEPの上野さん](https://next-step.asia/)に協力していただきました。ありがとうございました。


＜参考情報＞
[Autumn-Color.com](https://www.autumn-color.com/archives/1972)
[Working with nRF9160 DK](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/ug_nrf9160.html#application-mcu)
[プロダクトブリーフ](https://www.nordicsemi.com/-/media/Software-and-other-downloads/Product-Briefs/nRF9160-DK-product-brief.pdf?la=en&hash=C37A8EFD5E8CB6DC82F79F81EC22E1473E6447E7)
[nRF9160 DK](https://www.nordicsemi.com/Software-and-tools/Development-Kits/nRF9160-DK/Download?lang=ja-JP#infotabs)
[nRF Connect SDK](https://www.nordicsemi.com/Software-and-tools/Software/nRF-Connect-SDK)
[nRF connect SDK チュートリアル](https://devzone.nordicsemi.com/nordic/nrf-connect-sdk-guides/b/getting-started/posts/nrf-connect-sdk-tutorial
)
[QandA](https://devzone.nordicsemi.com/f/nordic-q-a/73906/nrf9160-http-client-at-commands-always-returns-cme-error-0)
[MQTT AT commands](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/applications/serial_lte_modem/doc/MQTT_AT_commands.html?fbclid=IwAR2dL_kswUFm1VyksS9za9ivusQFlM44vKgtt4B7-MrfJeSQEKm2xsnhvAM)
[AT Command for NB-IoT communication](http://www.pic-control.com/at-command-for-nb-iot-communication/?fbclid=IwAR25_jvpjU3kP6H8JI93V19BqAulJIkGTYC4azGowH1AJ1J17XkKcDLpE6c)