Spresense SDK環境でUART ATコマンドベースのデバイスを制御する

# はじめに
UARTシリアル通信を使ってATコマンドのようなテキストを送受信して制御するようなデバイスは世の中にたくさんありますが、Spresense SDK環境下で、これらのデバイスを簡単に制御し動作を確認する方法を見つけたので記事に残しておきます。

# CU terminal application
Spresense SDKの中にcuターミナルアプリケーションが入っているのでそれをそのまま使用します。

## コンフィグレーション
```:menuconfigを起動する
$ cd spresense/sdk
$ ./tools/config.py default -m
```

`Application Configuration` ---> `System libraries and NSH Add-Ons` ---> `CU minimal serial terminal` を有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/e7a99dc1-ca99-de5c-6cc0-00157b8af8ce.png)

`CU minimal serial terminal` のメニューからシリアルデバイス名やボーレート値のデフォルトを設定することができます。ここで設定する値は、あくまでデフォルト値であって、cuコマンドオプションを使って、あとから変更することも可能です。Spresenseでは、UART2を使用することが多いので、ここでは `Default serial device`を`/dev/ttyS2`に変更しています。

<img width="600" alt="cu-menu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/43b92db8-5abd-b90a-9335-ce352656877a.png">

毎回、menuconfigから設定して使用するのは面倒なので、[Spresense SDKでコンフィグレーション情報を保存する方法](https://qiita.com/baggio/items/98112220dbdf5d22f482)を参考に、設定したコンフィグレーションをファイルに保存しておきます。
```:mkdefconfig.py
$ ./tools/mkdefconfig.py examples/cu
```

次回からは、`config.py`で次のように指定してコンフィグできるようになります。
```bash:config.py
$ ./tools/config.py examples/cu
```

## ビルド
ビルド、書き込みを行います。
```:ビルド＆書き込み
$ make -j
$ ./tools/flash.sh -b 230400 -c /dev/tty.SLAB_USBtoUART nuttx.spk
// macOSを使用した例になっているのでシリアルポートは適宜変更してください
```

# 実行方法

## デバイス接続

ここでは例として、Bluetoothデバイスモジュール ZS-040 を制御します。
<img width="250" alt="cu-menu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/2144a873-3c91-6150-570c-352e0f7745ba.png">

次のように結線します。
<img width="400" alt="cu-menu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/1d24930f-38c1-e4d4-6416-31ed56d14466.jpeg">

| Spresense | ZS-040 | 説明 |
|:-:|:-:|:-|
| Vout  | VCC  | 電源5V |
| GND  | GND  |   |
| RX  | TXD  | IO3.3Vなので拡張ボードのジャンパは3.3Vを選択 |
| TX  | RXD  | ↑ |

## cuコマンド実行

minicomを起動して、`nsh`プロンプトから`cu`コマンドを実行します。
```:minicom
$ minicom -D /dev/tty.SLAB_USBtoUART
// macOSを使用した例になっているのでシリアルポートは適宜変更してください
```
```:nsh
nsh> cu -h
Usage: cu [options]
 -l: Use named device (default /dev/ttyS2)
 -e: Set even parity
 -o: Set odd parity
 -s: Use given speed (default 115200)
 -r: Disable RTS/CTS flow control (default: on)
 -c: Disable lf -> crlf conversion (default: off)
 -f: Enable endless mode without escape sequence (default: off)
 -?: This help
nsh>
```

`/dev/ttyS2`シリアルデバイスへボーレート9600で接続します。
前述したコンフィグレーションでデフォルトのシリアルデバイスとして`/dev/ttyS2`を指定している場合は、`-l /dev/ttyS2` は省略可能です。

```:nsh
nsh> cu -l /dev/ttyS2 -s 9600 -r
// ここで入力した文字をUART2デバイスへ送信します。
// 改行コードは Ctrlキー + j を入力します。
// ここにUART2デバイスから受信した文字列が表示されます。
// cuアプリを終了するときは、~(チルダ)のあとに.(ピリオド)を入力すると終了します。
```

* `AT` を入力すると、"OK" が返ってきます。
* `AT+HELP` を入力すると、ATコマンドのHELPが表示されます。

簡単にATコマンドによる制御ができました。実行した様子がこちらです。
![スクリーンショット 2022-08-14 15.08.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432852/61d3b924-fcf1-348c-f3e8-5b146edceed7.png)

# (番外編) ZS-040 Bluetooth シリアル通信

`AT+NAME`を入力すると、"+NAME="デバイス名が返ってきます。
デバイス名が空の場合はデフォルト名が使われるようで私がもっているデバイスの場合は"BT04-A"でした。

`AT+PIN`を入力すると、"+PIN=1234"のようにPINコードが返ってきます。

1. HostPCからBluetoothデバイスへ接続します。
2. PINコード入力を求められるので”1234”を入力します。
3. デバイス名に”/dev/tty.BT04-A”が現れるので、9600 baudで接続します。

```
$ minicom -D /dev/tty.BT04-A -b 9600
```

このターミナルからBluetoothモジュールを介してSpresenseと文字列のやり取りをすることができます。