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です(カメラモジュールはまだ届いてなかったので後から追記します。)
PCとの接続&開発環境
一般的なマイクロUSB-Bでシリアル接続します。開発環境は、Arduino IDEもしくはオリジナルのSPRESENCE SDKが使えるようです。また、開発PCとの接続にはCP210x USB to serial driverが必要となります。デバイスマネージャのポート(COMとLPT)に、CP210xUSB to UART Bridge (COM6)などと出てくれば認識されています。COMポート番号は後で利用しますので確認しておきます(今回はCOM6でした)。
ピンヘッダなどは、開発サイトに掲載されていた以下の図をご覧ください。
(出典: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カードをストレージとして活用でき、計測データのやりとりを行うことができるとのことです。後から試してみよう。
開発環境:Arduino IDE(最新1.8.8@2019/1)を利用する場合
Arduino IDEを開発PCにインストールし、提供されているArduino互換ライブラリをArduino IDE Board Manager経由でインストールして利用します。現状の開発サイトでは、Spresense Arduino Library specific libraryとしてAudioとGNSSの2つのライブラリが示されています。
- Arduino IDEの起動
- ファイル→環境設定: "追加のボードマネージャのURL"に以下のURLを入力してOK
https://github.com/sonydevworld/spresense-arduino-compatible/releases/download/generic/package_spresense_index.json - ツール→ボード→ボードマネージャを選択
- Spresenseを検索して出てきた”Spresense Reference Board”を選択してインストールします(現在ver.1.1.2)。
- 以上でIDE側の設定は完了です。
Boot loaderのインストール
いわゆるファームウェアの更新方法です。
- ツール→ボード→Spresenseを選択
- ツール→ポートで上述のCOMポートを指定(COM6)
- ツール→書込装置→Spresense Firmware Updaterを選択
- ツール→ブートローダを書き込むを選択
- 画面が出てきて、ファームウエアのzipファイルをダウンロードして、ドラッグ&ドロップするよう指示されますので、従います。zipファイルは解凍する必要はないようです。また、ファームウェアのバージョンはver.1.1.0でした。
- 書き込みが終われば、自動的にrebootされます。
サンプルスケッチ:メインボード上の4つのLEDのLチカ
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のサンプルもありました。
開発環境: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という記事がありましたので、参考にさせて頂きます。
1.WSLを起動し、必要なパッケージをインストールします。
$ sudo apt-get install git gperf libncurses5-dev flex bison gcc-arm-none-eabi genromfs pkg-config autoconf automake cmake
2. nuttx-tools から kconfig-frontends を取得してインストールします。
$ git clone https://bitbucket.org/nuttx/tools.git
$ cd tools/kconfig-frontends/
$ ./configure --disable-shared
$ make
$ sudo make install
3. Spresense SDkを取得します。
$ git clone --recursive https://github.com/sonydevworld/spresense.git
4. 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!と返ってきます。
サンプルアプリケーション(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カードにしたら書き込んでくれました。
レンズカバーシールをはがしてから撮影してみました。
なぜか周辺が暗いのですが、レンズ調整とか必要なんでしょうか?