記事の概要
Nordic社製のBLEモジュール nRF53 を用いて、nRF Connect SDKによりBLEアプリケーションを開発する方法を紹介します
今回はメッセージ出力させる方法について説明します。
メッセージ出力方法は、USB端子を介してUSB CDC ACM を使用する方法や、JLinkを用いてJTAG/SWD経由で入出力する方法などもありますが、今回はUART通信機能を利用します。
なお、今回の記事の内容については以下のNordicの演習が参考になります。
新規アプリケーション作成
今回はサンプルを流用するのではなく、新規にアプリケーションを作成します。
VS Code の nRF Connect アイコンをクリックしてNRF CONNECT サイドウィンドウを開き、 WELCOME を展開し、Create a new application をクリックします。
Create a blanv application を選択します。
アプリケーションの置き場所とアプリケーション名を設定します。
次はボードの設定をします。APPLICATIONS を展開し、Add build configuration をクリックします。
前回の記事で作成したオリジナル基板についての boards ファイル、 trial_nrf5340 を以下では使用します。
Boards target に trial_nrf5340 を入力し、画面最下部の build COnfigutation をクリックします。
自動でビルドが実行されてから、BUILD を展開すると、 Source Files -> Application -> src に以下の 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 にしておきます。別の通信速度にしても問題ありません。
以上の設定を行うと、 trial_nrf5340.dts に以下の UART0 設定が追加されます。
なお、上記のツール設定を行わず、 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モジュールをコンソールと関連付ける設定を追加します。
/ {
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 ファイルに以下の設定を追加します。
# Enable console
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
USB-シリアル変換
現時点では開発ボード nRF5340 MDBT53-1M の UART入出力端子がどこにもつながっていません。
そこで USB-シリアル変換モジュールを外付けすることで、PCとUSB接続して PC-nRF53 間でUART通信できるようにします。
今回はマルツで販売されている PL2303SA搭載モジュールを使用します。
なお、以下の点に注意してハンダ付けしてください。
- USBから電源供給するので USB-シリアル変換モジュールの SJ1 をハンダでつなぐ
- nRF53 は 3.3V で動作しており、TXD/RXD は内蔵の 3.3V レギュレーションの出力を使っても問題ないので、 USB-シリアル変換モジュールの SJ2 をハンダでつなぐ
- モジュールのRXD端子は nRF53 のTXD端子と接続し、モジュールのTXD端子は nRF53 のRXD端子と接続する
- モジュールは内部給電しているので、3.3V端子とGNDは nRF53 と接続しなくてもいい
printk
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通信すると通信が詰まってしまい、諸々の機能に影響を及ぼすので、1秒間隔でメッセージ出力するように k_sleep 関数を使用しています。
なお、UART 通信は他の機能を邪魔することがあるので、実際の製品などではメッセージ出力はデバッグ時のみにして、本番時には無効化することをお勧めします。
動作確認
ACTIONS を展開して Build と Flash を行います。
次いで ターミナルソフトの TeraTerm を立ち上げて シリアルを選択します
「設定」から「シリアルポート」を選択し、スピードを先ほどに設定した通信速度と同じにします。
すると以下のように1秒ごとにメッセージ出力されます。
その他のメッセージ出力方法
USB CDC ACMを利用したメッセージ出力方法については以下をご参照ください。
JLinkを用いてJTAG/SWD経由で入出力する方法については以下をご参照ください。