macOSでSPRESENSE SDKを使った開発環境を用意する

SONYから発売されているSPRESENSEを使ってみたくなったので開発環境を用意しました。

公式には、Arduino LibraryとSPRESENSE SDKと2つの開発環境が用意されています。

Arduino Libraryの方はArduino IDEで開発するため、macOS、Linux、Windowsとマルチプラットフォームで開発ができます。
一方で、SPRESENSEのマルチコアを利用した開発など、高度な開発はできません。

SPRESENSE SDKを使うと、SPRESENSEの全ての機能が利用できる一方で、開発環境がUbuntuにしか対応していません。

今回はDockerを利用することで、macOSの上でビルドを行い、マイコンへの書き込みまでができるように試してみたいと思います。


基本的には、公式の[SPRESENSE SDKチュートリアル](https://developer.sony.com/ja/develop/spresense/developer-tools/get-started-using-nuttx/set-up-the-nuttx-environment#_spresense_sdk_%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)にしたがって作業を進めていきますが、Ubuntu向けの説明となっているため改変しながら進めていきます。


# 事前準備

* gitコマンドが必要です。Xcodeをインストールし、gitが使えるようにしてください。
* Homebrewが必要です。[こちら](https://brew.sh/index_ja)のドキュメントにしたがってインストールしてください。
* Dockerが必要です。[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/install/)をインストールしてください。
* USBシリアル変換チップのドライバが必要です。[こちら](https://developer.sony.com/ja/develop/spresense/developer-tools/get-started-using-arduino-ide/set-up-the-arduino-ide#_%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99)から、CP210x USB to serial driver for Macintosh OSXをダウンロードしてインストールしてください。
* Python3系

# kconfig-frontends のインストール

SPRESENSE SDKでは、ビルド環境の設定等にkconfigを利用しています。
Homebrewでインストールできたのでインストールします。

```bash
brew tap PX4/homebrew-px4
brew update
brew install kconfig-frontends
```

# SPRESENSE SDKをダウンロードする

```bash
git clone --recursive https://github.com/sonydevworld/spresense.git
```

# サンプルアプリケーションのビルド設定

コンフィギュレーションはmacで行います。

```bash
cd spresense/sdk
tools/config.py --kernel release
tools/config.py examples/hello
```

途中でunameのエラーが出ますが、問題ありません。(Cygwinかのチェックにしか `-o` オプションは使われていません)

うまくいくと最後に以下のようなファームウエアを書き込む指示が出力されます。

```
WARNING: New loader v1.2.1 is required, please download and install.
         Download URL   : https://developer.sony.com/file/download/download-spresense-firmware-v1-2-001
         Install command:
                          1. Extract loader archive into host PC.
                             ./tools/flash.sh -e <download zip file>
                          2. Flash loader into Board.
                             ./tools/flash.sh -l /Users/chibiegg/Downloads/spresense/firmware/spresense -c <port>
```


# サンプルアプリケーションのビルド

ビルドはDockerイメージと起動スクリプトが用意されているのでそちらを使います。

```bash
cd ../
source ./spresense_env.sh 
spresense make -j8 buildkernel
spresense make -j8
```

`spresense_env.sh` をロードすると `spresense` コマンドがAliasで用意されます。
`spresense` の後に実行するコマンドを指定すると、Dockerのイメージの中で実行されるように作られています。

実行する際には `./spresense` ディレクトリがカレントディレクトリである必要があります。

うまくいくと `sdk/nuttx.spk` ファイルが生成されています。

# ブートローダーの書き込み

先ほどの出力に表示されたURL (https://developer.sony.com/file/download/download-spresense-firmware-v1-2-001) からZIPをダウンロードします。

表示された通りコマンドを実行してブートローダーを書き込みます。

```bash
cd sdk
./tools/flash.sh -e /Users/chibiegg/Downloads/spresense-binaries-v1.2.1.zip
./tools/flash.sh -l /Users/chibiegg/Downloads/spresense/firmware/spresense -c /dev/tty.SLAB_USBtoUART
```

うまく書き込めた場合、以下のような出力が出ます。

```
>>> Install files ...
install -b 115200
Install /Users/chibiegg/Downloads/spresense/firmware/spresense/loader.espk
|0%-----------------------------50%------------------------------100%|
######################################################################

118832 bytes loaded.
Package validation is OK.
Saving package to "loader"
updater# install -b 115200
Install /Users/chibiegg/Downloads/spresense/firmware/spresense/AESM.espk
|0%-----------------------------50%------------------------------100%|
######################################################################

28944 bytes loaded.
Package validation is OK.
Saving package to "AESM"
updater# install -b 115200
Install /Users/chibiegg/Downloads/spresense/firmware/spresense/gnssfw.espk
|0%-----------------------------50%------------------------------100%|
######################################################################

450768 bytes loaded.
Package validation is OK.
Saving package to "gnssfw"
updater# install -b 115200
Install /Users/chibiegg/Downloads/spresense/firmware/spresense/dnnrt-mp.espk
|0%-----------------------------50%------------------------------100%|
######################################################################

88352 bytes loaded.
Package validation is OK.
Saving package to "dnnrt-mp"
updater# sync
updater# Restarting the board ...
reboot
```

# アプリケーションの書き込み

先ほどビルドしたサンプルプログラムを書き込みます。

```bash
./tools/flash.sh -c /dev/tty.SLAB_USBtoUART nuttx.spk 
```

こんな感じの出力が出ます。

```
>>> Install files ...
install -b 115200
Install nuttx.spk
|0%-----------------------------50%------------------------------100%|
######################################################################

154304 bytes loaded.
Package validation is OK.
Saving package to "nuttx"
updater# sync
updater# Restarting the board ...
reboot
```

# 実行

あとは、元のチュートリアルの通りminicomなどでシリアルポートに接続して、`hello`コマンドが実行できたらOKです。

minicomもbrewでインストールできます。

```bash
brew install minicom
```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73788/20a9c17a-a168-19c0-352f-ed724dbf86a6.png)