Spresenseの魅力を語る!!!

この記事は[spresense Advent Calendar 2022](https://qiita.com/advent-calendar/2022/spresense)の1日目です。

# はじめに
Spresenseの存在・魅力を知り趣味の個人開発を続けて得た知見を共有したいと思い先日イベントを開催しました。

 * [Spresense night #1 〜推しマイコンボード【Spresense】の魅力を語る!!!〜](
https://k-abe.connpass.com/event/265694/)

そのときに考えたSpresenseの魅力、これまで書いた技術書・技術記事、コンテストに出品した経験を共有できればと思い記事にしました。


# Spresenseの概要
Spresenseはソニーが開発したボードコンピュータの名称でつぎの特徴があります。

 * ソニー独自のセンシングプロセッサ CXD5602を搭載
 * Arduino 互換
 * GPSによる測位機能、ハイレゾリューションオーディオの再生・録音機能、低消費電力のマルチコアを内蔵

> [Spresenseについて -> 1. はじめに](https://developer.sony.com/develop/spresense/docs/introduction_ja.html)より引用

## ハードウェア編
Spresenseは各種ボードから構成されますが、今回は中心となるメインボードと拡張ボードを紹介します。

### Spresense メインボード
下図がメインボードの写真・ピン配置です。
プロセッサCXD5602が搭載されています。
文字通りメインボードですがIO点数が少ないため後述の拡張ボードと組み合わせて使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/911ee27d-e327-6c11-cc85-3ce2398a1364.png)

> [Spresense について -> 2. Spresense ハードウェアについて -> 2.1. Spresense ボードについて -> 2.1.1. Spresense メインボード](https://developer.sony.com/develop/spresense/docs/introduction_ja.html#_spresense_%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%89)より引用


### Spresense 拡張ボード
下図が下図が拡張ボードの写真・ピン配置です。
メインボードを装着して使います。
ピン配置がArduinoと互換性あることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/fe71e7a5-30a7-d715-889b-185c107cd466.png)

> [Spresense について -> 2. Spresense ハードウェアについて -> 2.1. Spresense ボードについて -> 2.1.2. Spresense 拡張ボード](https://developer.sony.com/develop/spresense/docs/introduction_ja.html#_spresense_%E6%8B%A1%E5%BC%B5%E3%83%9C%E3%83%BC%E3%83%89)より引用


## ソフトウェア編
Spresenseは2つの開発環境を提供しています。

 1. Spresense Arduino Library
 1. Spresense SDK

用途に合わせて最適な開発環境を選択できます。


## Spresense Arduino Library
下図がSpresense Arduino Libraryの構造です。
お馴染みのArduinoライブラリ関数(digitalRead(), digitalWrite()など)があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/5a8680b0-e9eb-5469-5308-75c6e2e4eb10.png)

> [Spresense について -> 3. Spresense ソフトウェアについて -> 3.1. Spresense Arduino Libraryを用いた開発環境 -> 3.1.1. Spresense Arduino Libraryの構造](https://developer.sony.com/develop/spresense/docs/introduction_ja.html#_spresense_arduino_library%E3%81%AE%E6%A7%8B%E9%80%A0)より引用


## Spresense SDK
下図がSpresense SDKの構造です。
今回の記事ではSpresense SDKに注目します。
私がSpresense SDKをメインで使っており、Spresense Arduino Libraryをあまり使ったことがないためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/41751bdf-ecd0-9fc1-5bfa-bb5abfdeb773.png)

> [Spresense について -> 3. Spresense ソフトウェアについて -> 3.2. Spresense SDKを用いた開発環境 -> 3.2.1. Spresense SDKの構造](https://developer.sony.com/develop/spresense/docs/introduction_ja.html#_spresense_sdk%E3%81%AE%E6%A7%8B%E9%80%A0)より引用


# 最近のSpresense NEWS
Spresenseを搭載した装置・活用したプロダクトがいろんなところで活躍中です!!!

 * [【宇宙】衛星技術実証](https://www.kenkai.jaxa.jp/kakushin/kakushin02.html)
 * [【宇宙・玩具】SORA Q](https://www.takaratomy.co.jp/products/sora-q/)
 * [【エンタメ】大阪音楽大学　「電気楽器のオーケストラ」公開へ](https://www.daion.ac.jp/media/20221102_release.pdf)
 * [【ロボット・IoT・エンタメ】elchika 2022年 SPRESENSE™ 活用コンテスト](https://elchika.com/promotion/spresense2022/winner/#nav)


# Spresenseの魅力
Spresenseの魅力を個人的に書きます。

 * **マルチコア**
 * **OSがNuttX**
   * POSIX対応
 * 開発スタイルがArduino・Spresense SDKから選択可能
 * **サンプル、チュートリアルあり**
 * **ドキュメントがある**
   * 開発環境構築(スタートガイド)、チュートリアル、開発ガイド、APIリファレンス、その他
 * コミュニティがある。
   * stack overflow,フォーラム(Sony's Developer World forum)

この中からつぎの項目について掘り下げます。

## マルチコア
Spresenseの魅力を考えたときに一番最初に思ったのは**マルチコア**でした。
下図はプロセッサCXD5602内部ブロック図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/f163aeff-7f4e-cce4-b105-b020de7ad9d9.png)

> [Spresense SDK 開発ガイド -> 1. Spresense SDKの概要 -> 図 1. CXD5602 内部フロック図](https://developer.sony.com/develop/spresense/docs/sdk_developer_guide_ja.html#_spresense_sdk%E3%81%AE%E6%A6%82%E8%A6%81)

**Application Domain**の **Application Processor(Cortex-M4 x 6)** がマルチコアのプロセッサです。
これらのプロセッサを負荷を分散したり、並列に実行したりします。
ASMP（Asymmetric Multi-Processing：非対称型マルチプロセッシング）の構成をとっているそうです。
また、マルチコアを簡単に扱えるフレームワークもあります。

 > [Spresense SDK 開発ガイド -> 5. Spresense SDKが提供する機能 -> 5.7. ASMP Framework](https://developer.sony.com/develop/spresense/docs/sdk_developer_guide_ja.html#_asmp_framework)

:::note info
(マルチコアに限らずですが)APSさんのSpresense連載記事(第1回〜第20回)は非常に参考になります。
[APS Spresense 連載記事リンク](https://www.aps-web.jp/academy/amp/8214/)
:::



## OSがNuttX
OSがNuttXだと何が嬉しいでしょうか?考えてみました。

 * POSIXインタフェースが使えるのでラズパイ(OSはLinuxとする)の開発資産を移植する場合、比較的容易に移植可能かと思う。
 * シェルが使える
 * Linuxライクなコマンドが使える

下図はSpresense SDKでmakeしたイメージを書き込み、シェルからhelpコマンドを実行したときの表示です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/f328bfbc-f118-5b0f-eff9-8f45723fbf19.png)

お馴染みのLinuxコマンドが多く組み込まれていることがわかります。


## サンプル、チュートリアルあり
日本語チュートリアルがあり、試したい機能をサクッと試せます。
下図はSpresense SDKチュートリアルのWebページから引用しました。
多くのチュートリアル・サンプルプログラムが掲載されています。
私の場合、ここに掲載してあるチュートリアル・サンプルプログラムから制御したい機能の動きを試します。その後、自分がつくりたいアプリケーション向けにカスタマイズしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/c8856b77-4984-c375-bed0-d69ed39e4c2a.png)

> [Spresense SDKチュートリアル](https://developer.sony.com/develop/spresense/docs/sdk_tutorials_ja.html)

## ドキュメントがある
ドキュメントが日本語で揃っていてすぐに開発スタートできます。
下図はSpresense DocumentsのWebページから引用です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/8090a72a-ae23-63d5-f5ed-5f02495a6973.png)

> [Spresense Documents](https://developer.sony.com/develop/spresense/docs/home_ja.html)


# 個人的に試したこと
## デジタルカメラ
つぎの簡易的な機能をもつデジタルカメラアプリをつくりました。

 * カメラのプレビューをLCDに表示する。
   * サンプルアプリ【examples/camera】を流用した。

 * 外部基板のスイッチ押下でLCDのプレビューをSDカードに保存する。

:::note info
開発の一連の手順を技術書に書いたので参照ください。
[Spresenseデジタルカメラ開発](https://techbookfest.org/product/6145133823131648?productVariantID=6677722182975488)
:::


## オリジナルゲーム
オリジナルの簡易ゲームをつくりました。

 1. 椅子取りゲーム
 2. 連射測定ゲーム
 3. エレキギター

### 椅子取りゲーム
 * 音楽ファイルをランダムな時間で再生⇄停止を繰り返す。
 * 【examples/audio_player】サンプルアプリを流用した。 

### 連射測定ゲーム
10秒間外部基板のスイッチを連射し結果を表示する。シュウォッチをイメージしてつくってみた。

> [シュウォッチ](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A5%E3%82%A6%E3%82%A9%E3%83%83%E3%83%81)

### エレキギター
 * ジャイロセンサーの傾きによりドレミを発音する。
 * 【examples/sixaxis 】・【examples/audio_beep】サンプルアプリを流用した。 

:::note info
これら簡易ゲーム開発の一連の手順を技術書に書いたので参照ください。
[Spresenseでオリジナルゲームをつくる](https://techbookfest.org/product/1TUdP91Knfjxd7DBLpZvKh?productVariantID=6hn3WTAWnkNpVGed9uvZfR)
:::


# お薦め開発手法
Spresense SDKでいくつかアプリをつくり、このような流れでアプリをつくるのが良いのでは?、と感じることありました。

 1. チュートリアルで所望のデバイス制御ができていることを確認する。
 1. チュートリアルで使用しているサンプルアプリを雛形にして、自身のアプリを作る。

上の流れの中でSpresense SDKベースに開発する一番の壁は【コンフィグレーション】と感じた。

下図はコンフィグレーション画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/eda8c169-e89d-8454-67cb-e7e709852c04.png)

　【サンプルアプリで所望のデバイス制御を確認できたらサンプルアプリのコンフィギュレーションを流用し、自身のオリジナリアプリをつくる、というスタイルが良さそう】

　↑についてざっくり書くとつぎの手順になります。　

 * 公式のチュートリアル・サンプルアプリで希望するデバイス制御を確認する。
 * デバイス制御を確認できたサンプルプログラム・チュートリアルが自分がつくりたいアプリケーションの動きを達成できそうか判断する。もし達成できそうであれば公式のチュートリアル・サンプルアプリをベースにしてアプリケーションを作るプロジェクトのベースとして使う。
 * アプリケーションを作り込む
 * コンフィグレーションはベースにしたチュートリアル・サンプルアプリの設定をそのまま使う。但し、ベースにしたチュートリアル・サンプルアプリは組み込まないように設定変更する(自身がつくったアプリケーションのみを組み込みたい)。ベースにしたチュートリアル・サンプルアプリのコンフィグレーションのデバイス制御周りのコンフィグレーションは流用する。
 * コンフィグレーション完了後、make・書き込む。


より具体的な方法を技術書に書いたので良かったら参照してください。

:::note info
[Spresenseデジタルカメラ開発](https://techbookfest.org/product/6145133823131648?productVariantID=6677722182975488)
-> 第6章 Spresense SDK 開発手順

基本的につぎのWebドキュメントの内容をベースにしています。

> [Spresense SDK スタートガイド (CLI 版)-> 6. ユーザーアプリの追加方法](https://developer.sony.com/develop/spresense/docs/sdk_set_up_ja.html#_%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0%E6%96%B9%E6%B3%95)
:::


# 今後やってみたいこと
最後にこれからやってみたいことを魅力的なことを書きます。

 * マルチコアを体感できるアプリをつくる。
   * 6つのコアを使い倒してみたい!!!
   * 魅力的なことと書きましたがマルチコアのアプリケーションをつくったことがないのでこれから体験したいと考えています。

 * ライブラリ作成・リンク
   * 複数アプリの共通処理をライブラリにする。

 * GNSSサンプルアプリ確認

 * Audio Recorderサンプルアプリ確認

 * SCU(Sensor Control Unit)の理解・アプリ作成
   * センサーデータ取得に関わるCPUの負荷を減らしたい。

 * C++アプリ作成


記事は以上になります。
最後まで読んでいただきありがとうございました。


:::note info
**明日のspresense Advent Calendar 2022は?**
[spresense Advent Calendar 2022](https://qiita.com/advent-calendar/2022/spresense)の2日目は@cmm614さんによる**丸型液晶ネタその１**です。
:::