SONY SPRESENSEボードを使ってみる

SONYから組込用ボードSPRESENSEボードが出ていたので、どんなものやらと購入していろいろ調査してみることにしました。普段はRas.PI一辺倒のユーザーですが、Ras.PI, Arduinoなどとの比較をしてみたいと思います。

購入した理由としては、GPS（QZSS/GLONASSにも対応：GPS(L1-C/A), QZSS(L1-C/A), GLONASS(L1), WAAS, QZSS(L1-S)）が使えるのと、Arm Cortex-M4F 6コア搭載ということで、結構、処理能力がありそうなこと、さらにSONYセンサーのカメラモジュール（5MP,RAW撮影可能）があるということです。いろいろ遊べそうなボードです（全体的にやや高いですが....）。

なお、Spresense 拡張ボードはArduino Unoとの互換性がありますが、ピン仕様についてはArduino Uno と一部異なる部分がありますのでご注意下さい（https://developer.sony.com/ja/develop/spresense/developer-tools/hardware-documentation#_spresense_%E3%81%A8_arduino_uno_%E3%81%AE%E9%81%95%E3%81%84 ）。

# 購入したもの（from Switch Science）
- SONY SPRESENSEメインボード
- SONY SPRESENSE拡張ボード（メインボードを取り付けるタイプ）
- SONY SPRESENSEカメラ拡張ボード
- WiFi Add-on for SPRESENSE
- SPRESENSE用ピンヘッダ＆ユニバーサル基盤少々
- その他、転がってたもの(USBケーブル、センサー類)

開発サイトを見ると、加速度、気圧、地磁気などいろいろセンサー類は出ているようです。
https://developer.sony.com/ja/develop/spresense/
Digi-keyなどからは手配できるようですが、とりあえず手持ちの中華IMUセンサを使ってみることにします。

# 開封の儀
左から、メインボード、拡張ボード、WiFi Add-onです（カメラモジュールはまだ届いてなかったので後から追記します。）
![P_20190107_204606.jpg](https://qiita-image-store.s3.amazonaws.com/0/74247/5c8f9d56-df69-a57f-5618-3e565b07b988.jpeg)

# PCとの接続＆開発環境
一般的なマイクロUSB-Bでシリアル接続します。開発環境は、Arduino IDEもしくはオリジナルのSPRESENCE SDKが使えるようです。また、開発PCとの接続にはCP210x USB to serial driverが必要となります。デバイスマネージャのポート(COMとLPT)に、CP210xUSB to UART Bridge (COM6)などと出てくれば認識されています。COMポート番号は後で利用しますので確認しておきます（今回はCOM6でした）。

ピンヘッダなどは、開発サイトに掲載されていた以下の図をご覧ください。
![Main-Board.jpg](https://qiita-image-store.s3.amazonaws.com/0/74247/dce59eb6-fb06-4b07-ec6b-92d54ef219cd.jpeg)
![Extention-Board.jpg](https://qiita-image-store.s3.amazonaws.com/0/74247/b88286fc-c4c3-5657-e49d-cc9982d7d232.jpeg)
（出典：https://developer.sony.com/ja/develop/spresense/specifications）

# 拡張ボードとの接続
PWMや3.3V/5VでのI/Oに必要なボードです。マイク入力、microSDカードも使えます。
メインボードのみでは、"All Spresense main board pins operate at 1.8V"と1.8V入出力のようなので、市販のセンサー類をGPIOで制御したい場合は、やはり拡張ボード経由が必要と思われます。

ホームページに”Do not separate the Spresense main board from the extension board by force once mounted.”とかいう記載があったので、1回付けたら外せないようになってるのかもしれません。

また、拡張ボードにもマイクロUSBで接続できますが、通常は拡張ボードに取り付けたメインボードのマイクロUSBと開発PCを接続すればよいようです。拡張ボード上にあるUSBコネクタを利用した場合は、Mass Storage Classとして認識され、SDカードをストレージとして活用でき、計測データのやりとりを行うことができるとのことです。後から試してみよう。

![P_20190107_215209[1].jpg](https://qiita-image-store.s3.amazonaws.com/0/74247/056f9cd2-4ec1-04f4-92a7-36b1d5685771.jpeg)

# 開発環境：Arduino IDE（最新1.8.8＠2019/1）を利用する場合
Arduino IDEを開発PCにインストールし、提供されているArduino互換ライブラリをArduino IDE Board Manager経由でインストールして利用します。現状の開発サイトでは、Spresense Arduino Library specific libraryとしてAudioとGNSSの2つのライブラリが示されています。

1. Arduino IDEの起動
1. ファイル→環境設定: "追加のボードマネージャのURL"に以下のURLを入力してOK
https://github.com/sonydevworld/spresense-arduino-compatible/releases/download/generic/package_spresense_index.json
1. ツール→ボード→ボードマネージャを選択
    1. Spresenseを検索して出てきた”Spresense Reference Board”を選択してインストールします(現在ver.1.1.2)。
    2. 以上でIDE側の設定は完了です。

## Boot loaderのインストール
いわゆるファームウェアの更新方法です。

1. ツール→ボード→Spresenseを選択
1. ツール→ポートで上述のCOMポートを指定（COM6）
1. ツール→書込装置→Spresense Firmware Updaterを選択
1. ツール→ブートローダを書き込むを選択
    1. 画面が出てきて、ファームウエアのzipファイルをダウンロードして、ドラッグ&ドロップするよう指示されますので、従います。zipファイルは解凍する必要はないようです。また、ファームウェアのバージョンはver.1.1.0でした。
    2. 書き込みが終われば、自動的にrebootされます。

## サンプルスケッチ：メインボード上の4つのLEDのLチカ

```ino:LED.ino
void setup() {
    pinMode(LED0, OUTPUT);
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
}

void loop() {
    digitalWrite(LED0, HIGH);
    delay(100);
    digitalWrite(LED1, HIGH);
    delay(100);
    digitalWrite(LED2, HIGH);
    delay(100);
    digitalWrite(LED3, HIGH);
    delay(1000);

    digitalWrite(LED0, LOW);
    delay(100);
    digitalWrite(LED1, LOW);
    delay(100);
    digitalWrite(LED2, LOW);
    delay(100);
    digitalWrite(LED3, LOW);
    delay(1000);
}
```

## サンプルスケッチ：その他の例
上述のライブラリを導入すると、ファイル→スケッチ例→Spresenseのスケッチ例から、様々なスケッチを参考にすることが可能です。GNSSのサンプルもありました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/74247/da0965ae-0e79-c41e-c3ca-554e33f4c628.png)

# 開発環境：SPRESENSE SDKを利用する場合
チップの性能を発揮するには、こちらを使用することが望ましいようです。
https://developer.sony.com/ja/develop/spresense/developer-tools/get-started-using-nuttx
に使用方法が書かれていますので、順に追っていきます。

## 使用OSでの設定(WSL on Windows 10)
SDKを導入するOSは64bit LinuxでUbuntuのみ動作確認されているようです。Windows10上のWSLからできないかと思い調べたところ、すでに、https://qiita.com/FlyingYacht/items/0f49ed82b4912381ffe7という記事がありましたので、参考にさせて頂きます。

１．WSLを起動し、必要なパッケージをインストールします。

```
$ sudo apt-get install git gperf libncurses5-dev flex bison gcc-arm-none-eabi genromfs pkg-config autoconf automake cmake
```

２. nuttx-tools から kconfig-frontends を取得してインストールします。

```
$ git clone https://bitbucket.org/nuttx/tools.git
$ cd tools/kconfig-frontends/
$ ./configure --disable-shared
$ make
$ sudo make install
```

３. Spresense SDkを取得します。

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

４. WSLのユーザー"user"をdialoutのグループに追加します。

```
$ sudo usermod -a -G dialout user
```

### ブートローダーのインストール

Arduiono IDEから書き込んだはずだが、なぜかWarningが出たので、以下のようにしてダウンロード＆インストールします。

```
https://developer.sony.com/file/download/download-spresense-firmware-v1-1-000でEULAに同意してzipファイルをダウンロード
$ tools/flash.sh -e spresense-binaries-1.1.0.zip　（WSLへのインストール）
Update succeed.と表示されれば成功（この時点ではWSL上に展開されただけ）
```

→ ここからWSLに特有の作業です。ボードはWindows上ではCOM11として認識されているとします(デバイスマネージャ上で115200bps, データビット8bit, パリティなし、ストップビット1, フロー制御なし)。
Windows10のFall creators updateからWSLからCOMポートのデバイスとシリアル通信ができるようになったはずなので（http://matsuneko22.hateblo.jp/entry/2017/12/09/144803）、以下のような設定を行います。

```
$ sudo chmod 666 /dev/ttyS11
$ stty -F /dev/ttyS11 -a 
speed 115200 baud; rows 0; columns 0; line = 0; ....と出てくれば接続OK
$ ./tools/flash.sh -l ../firmware/spresense -c /dev/ttyS11　(ブートローダーのボードへの書き込み)
→ こんな感じで書き込みが終われば成功です。
>>> Install files ...
install -b 115200
Install ../firmware/spresense/gnssfw.espk
Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel.
..............................................................................................................................................................................4
50336 bytes loaded.
Package validation is OK.
Saving package to "gnssfw"
updater# install -b 115200
Install ../firmware/spresense/loader.espk
Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel.
....................................................................................................................115856 bytes loaded.
Package validation is OK.
Saving package to "loader"
updater# sync
updater# Restarting the board ...
reboot

```

### サンプルコード（Hello World）のビルド＆実行

nuttx.spk というバイナリイメージがsdkフォルダに作成され、Spresenseメインボードにアップロードして実行する流れになります。

```
$ cd spresense/sdk
$ tools/config.py --kernel release   (NuttX Kernelのコンフィグレーション)
$ tools/config.py examples/hello (SDKのコンフィグレーション)
$ make buildkernel
$ make
$ tools/flash.sh -c /dev/ttyS11 nuttx.spk
```

### シリアルターミナルでの動作確認
Window上の適当なターミナルソフトウェアからアクセスしてみます。今回は、mobaXtermのシリアル通信(minicomの設定でハードウエアフロー制御なしで接続)してみました。NuttX上のnshで、helloコマンドを打てば、Hello, World!と返ってきます。![SnapCrab_NoName_2019-1-8_10-45-28_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/74247/8ceecd53-eeae-a8fb-f808-af1bf2ce1aa3.png)

### サンプルアプリケーション(GNSS)のビルド＆実行

```
$ cd spresense/sdk
$ tools/config.py --kernel release　(Kernelコンフィグ)
$ tools/config.py examples/gnss　（SDKコンフィグ）
$ make buildkernel　（イメージビルド）
$ make
# tools/flash.sh -c /dev/ttyS11 nuttx.spk (イメージアップロード)
>>> Install files ...
install -b 115200
Install nuttx.spk
Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel.
.................................................................................................................................................1
58960 bytes loaded.
Package validation is OK.
Saving package to "nuttx"
updater# sync
updater# Restarting the board ...
reboot
```

Windows側のmobaXtermからシリアル接続します。
nshプロンプトでgnssと入力します。
測位ができていないと、

> No Positioning Data

という表示と、起動時を0時とした時刻が表示されます。
測位できた場合、およそ1分ぐらいで、グリニッジ標準時での時刻が表示されます。 
アンテナの大きさのせいか、衛星をつかむのに窓際では難しいようで、
少し外に出してやると測位できました。
また、いったん衛星をつかむことができれば、窓際でも再補足は容易です。

>Hour:2, minute:2, sec:7, usec:568
>LAT 38.55.4741
>LNG 141.6.4415
>Hour:2, minute:2, sec:8, usec:571
>LAT 38.55.4741
>LNG 141.6.4417

# カメラボードを使ってみる
カメラボードを取り付けてArduinoのCameraサンプルスケッチを利用して画像取得してみました。SDカードに書き込むのですが、最初そこらに転がってた512MBのマイクロSDカードを使ったら書き込みされず、32GB microSDHCカードにしたら書き込んでくれました。
レンズカバーシールをはがしてから撮影してみました。
なぜか周辺が暗いのですが、レンズ調整とか必要なんでしょうか？
![P_20190118_085728.jpg](https://qiita-image-store.s3.amazonaws.com/0/74247/bc7b3f39-a363-eaae-a2cd-2ee2cb1bb84b.jpeg)
![PICT011.JPG](https://qiita-image-store.s3.amazonaws.com/0/74247/6a6b6a3c-7885-a2e9-a2fd-2fdd33f57865.jpeg)


# 参考サイト
- https://www.switch-science.com/catalog/list/776/
- https://developer.sony.com/ja/develop/spresense/
- https://qiita.com/FlyingYacht/items/0f49ed82b4912381ffe7
- https://blogs.msdn.microsoft.com/wsl/2017/04/14/serial-support-on-the-windows-subsystem-for-linux/