nRF Connect SDKによるBLEアプリケーション開発2：メッセージ出力

# 記事の概要

Nordic社製のBLEモジュール nRF53 を用いて、nRF Connect SDKによりBLEアプリケーションを開発する方法を紹介します

今回はメッセージ出力させる方法について説明します。
メッセージ出力方法は、USB端子を介してUSB CDC ACM を使用する方法や、JLinkを用いてJTAG/SWD経由で入出力する方法などもありますが、今回はUART通信機能を利用します。

なお、今回の記事の内容については以下のNordicの演習が参考になります。

https://academy.nordicsemi.com/courses/nrf-connect-sdk-fundamentals/lessons/lesson-3-printing-messages-to-console-and-logging/

# 新規アプリケーション作成

今回はサンプルを流用するのではなく、新規にアプリケーションを作成します。

VS Code の nRF Connect アイコンをクリックしてNRF CONNECT サイドウィンドウを開き、 WELCOME を展開し、Create a new application をクリックします。

<img width="40%" alt="新規作成01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/42b97e59-8fef-dffe-d49f-eb23b665c5e4.png">

Create a blanv application を選択します。

<img width="70%" alt="新規作成02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/73940c22-cb02-b585-31aa-5bb81074ad2b.png">

アプリケーションの置き場所とアプリケーション名を設定します。

<img width="70%" alt="新規作成03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/617c0d9a-b9ab-d600-01a3-adced7814cc8.png">

次はボードの設定をします。APPLICATIONS を展開し、Add build configuration をクリックします。

<img width="40%" alt="新規作成05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/52508d5b-827b-ef87-e1c4-6f7842a30786.png">

前回の記事で作成したオリジナル基板についての boards ファイル、 trial_nrf5340 を以下では使用します。

https://qiita.com/Kosuke_Matsui/items/a12397e22331f41ed330

Boards target に trial_nrf5340  を入力し、画面最下部の build COnfigutation をクリックします。

<img width="70%" alt="新規作成06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/cc0cb567-4361-7015-a1d3-36a57af801eb.png">

自動でビルドが実行されてから、BUILD を展開すると、 Source Files -> Application -> src に以下の main.c ファイルが生成されています。


```C:main.c
#include <zephyr/kernel.h>

int main(void)
{
        return 0;
}
```

# UART通信によるメッセージ出力

## UART機能設定

メッセージ出力には UART 通信を使用するので、ボードの設定を編集し UART機能を追加します。

Devicetree Boards file をクリックしてボード設定を開き、 NODES を展開し、peripheral の uart0 にチェーンを入れます。

次に uart0 をクリックして設定画面を表示させ、 PINS を展開し 端子を設定します。
クロックやAD端子などの特定の機能が決まっている端子、既に LEDやスイッチと接続されている端子でなければ、任意の端子を選ぶことができます。

今回は TX端子を P0.12 に割り当て、RX端子を P0.11 に割り当てました。
RTS端子とCTS端子は使用しませんが、端子設定だけはしておきます。（RTS端子を P0.10 に割り当て、CTS端子を P0.09 に割り当てました）

通信速度は 115200 にしておきます。別の通信速度にしても問題ありません。

<img width="70%" alt="uart01b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/d544841a-ebaa-f95e-5501-480e5bd4ac20.png">

以上の設定を行うと、 trial_nrf5340.dts に以下の UART0 設定が追加されます。
なお、上記のツール設定を行わず、 trial_nrf5340.dts に以下の設定を直接入力してもかまいません。

```C:trial_nrf5340.dts
/* UART0 GPIOs can be configured for other use-cases */
&uart0 {
	/* Disabled by default */
	current-speed = <115200>;
	status = "okay";
	pinctrl-0 = <&uart0_default>;
	pinctrl-1 = <&uart0_sleep>;
	pinctrl-names = "default", "sleep";
};
```

また、 メッセージをコンソールに出力させたいので、以下のようにUARTモジュールをコンソールと関連付ける設定を追加します。

```C:trial_nrf5340.dts
/ {
	model = "trial_nrf5340";
	compatible = "mpengineering,trial-nrf5340";

	chosen {
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_ns_partition;
		zephyr,console = &uart0;  /* UARTモジュールをコンソールと関連付ける設定を追加する */
	};
 ```

 また defconfig ファイルに以下の設定を追加します。

```C:trial_nrf5340_defconfig
# Enable console
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
```

## USB-シリアル変換

現時点では開発ボード nRF5340 MDBT53-1M の UART入出力端子がどこにもつながっていません。

https://www.switch-science.com/products/8658

そこで USB-シリアル変換モジュールを外付けすることで、PCとUSB接続して PC-nRF53 間でUART通信できるようにします。
今回はマルツで販売されている PL2303SA搭載モジュールを使用します。

https://www.marutsu.co.jp/pc/i/137791/?srsltid=AfmBOoqzW8kBnrUKIrPCVOQruvVkvzrFu8T68goxo35WLft6sm-S6NBG

なお、以下の点に注意してハンダ付けしてください。
* USBから電源供給するので USB-シリアル変換モジュールの SJ1 をハンダでつなぐ
* nRF53 は 3.3V で動作しており、TXD/RXD は内蔵の 3.3V レギュレーションの出力を使っても問題ないので、   USB-シリアル変換モジュールの SJ2 をハンダでつなぐ
* モジュールのRXD端子は nRF53 のTXD端子と接続し、モジュールのTXD端子は nRF53 のRXD端子と接続する
* モジュールは内部給電しているので、3.3V端子とGNDは nRF53 と接続しなくてもいい

<img width="40%" alt="IMG_7874.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/4f9d9b04-0d60-6bec-856a-26b34e20813d.jpeg">

## printk 

main.cを以下のように編集します。

 ```C:main.c
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>

int main(void)
{
        while(1)
        {
                printk("Hello, World!\n");
                k_sleep(K_SECONDS(1));
        }
        return 0;
}
```

printk 関数を使用することで、 UART通信のメッセージをターミナルに表示できます。

連続でUART通信すると通信が詰まってしまい、諸々の機能に影響を及ぼすので、１秒間隔でメッセージ出力するように k_sleep 関数を使用しています。

なお、UART 通信は他の機能を邪魔することがあるので、実際の製品などではメッセージ出力はデバッグ時のみにして、本番時には無効化することをお勧めします。

## 動作確認

ACTIONS を展開して Build と　Flash を行います。
次いで　ターミナルソフトの TeraTerm を立ち上げて シリアルを選択します

<img width="70%" alt="uart02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/47af4278-f707-5f9d-e0e7-73f7f9fce0f2.png">

「設定」から「シリアルポート」を選択し、スピードを先ほどに設定した通信速度と同じにします。

<img width="60%" alt="uart03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/3f412d0c-08cc-8304-1ed6-6019ed8f7d48.png">

すると以下のように1秒ごとにメッセージ出力されます。

<img width="70%" alt="uart04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/efa394ac-4755-3bbb-02e4-ae0a2a338d05.png">

# その他のメッセージ出力方法

USB CDC ACMを利用したメッセージ出力方法については以下をご参照ください。

https://www.mikan-tech.net/entry/zephyr-usb-serial

JLinkを用いてJTAG/SWD経由で入出力する方法については以下をご参照ください。

https://tomo-wait-for-it-yuki.hatenablog.com/entry/2019/03/27/050000

# 関連記事

* 開発環境構築
 [Nordic社製BLEの開発環境構築と動作確認（nRF Connect SDK）](https://qiita.com/Kosuke_Matsui/items/4b797ba5db309914263f)
* 周辺機能
    * [nRF Connect SDKによるBLEアプリケーション開発１：デバイスツリーの作成](https://qiita.com/Kosuke_Matsui/items/a12397e223)