Spresense Header CodeSpresense Header Code

Spresense - エッジコンピューティングを低消費電力で

Spresense で乾電池でも動く本格的なエッジコンピューティングを体験してみませんか?

Spresense SDK

1. Spresense SDK の使い方

こちらは旧ドキュメントです。ドキュメントは以下のサイトに移行されました。 https://developer.sony.com/develop/spresense/docs/sdk_set_up_ja.html

この章は、 Spresense SDK のインストール、セットアップならびに簡単なサンプルアプリケーション Hello, World! の作成について解説しています。Spresense SDK の基本的な使い方を学ぶことができます。

1.1. ツールの準備

Spresense SDK はLinux/Windows/macOSで開発を行うことができます。ユーザーが使用する環境に応じて以下のセットアップを行ってください。

サポートされているオペレーティングシステム

  • Linux

    • Ubuntu 16.04以降 (64bit)

  • Windows

    • 8.1/10

  • macOS

    • High Sierra (10.13)以降

1.1.1. Linux向けセットアップ

  1. シリアル通信の設定

    以下のコマンドを実行し、使用するユーザーを dialout グループに追加します。

    $ sudo usermod -a -G dialout <user-name>

    コマンドを実行した後、再起動してください。再起動するまで設定は有効になりません。

  2. ビルドに必要なツールをインストールします。ターミナルを起動し、以下のコマンドを実行します。

    $ wget https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh
    $ bash install-tools.sh

    インストールしたツールを使用可能にするために、以下のコマンドを実行します。

    $ source ~/spresenseenv/setup

    このコマンドは、ターミナルを開くごとに実行する必要があります。このコマンドを省略したい場合は、ホームディレクトリ以下の .bashrc に上記コマンドを追加してください。

  3. Spresense SDK リポジトリからソースコードをダウンロードします。

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

1.1.2. Windows向けセットアップ

  1. 下記のサイトからMSYS2のインストーラをダウンロードし、インストールします。

  2. ビルドに必要なツールをインストールします。スタートメニューにある MSYS2 MSYS を起動し、以下のコマンドを実行します。

    一緒にインストールされる MSYS2 MinGW 64-bit など他のターミナルを使用するとエラーが発生し正しくビルドできません。
    $ curl -L https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh > install-tools.sh
    $ bash install-tools.sh

    インストールしたツールを使用可能にするために、以下のコマンドを実行します。

    $ source ~/spresenseenv/setup

    このコマンドは、ターミナルを開くごとに実行する必要があります。このコマンドを省略したい場合は、ホームディレクトリ以下の .bashrc に上記コマンドを追加してください。

  3. Spresense SDK リポジトリからソースコードをダウンロードします。

    $ git clone --recursive https://github.com/sonydevworld/spresense.git
  4. シリアルドライバのインストール

    シリアルドライバのインストールは、Spresense ボードをPCに接続する前に行ってください。

    Spresense ボードをUSBシリアルで接続するために、ドライバをインストールする必要があります。下記リンクよりドライバをダウンロードし、インストールしてください。

1.1.3. macOS向けセットアップ

  1. Appleが提供している開発ツールをインストールします。 ターミナルを起動し、以下のコマンドを実行します。

    $ xcode-select --install
  2. 以下のサイトからPython3のインストーラをダウンロードし、インストールします。

  3. ビルドに必要なツールをインストールします。ターミナルを起動し、以下のコマンドを実行します。

    $ curl -L https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh > install-tools.sh
    $ bash install-tools.sh

    インストールしたツールを使用可能にするために、以下のコマンドを実行します。

    $ source ~/spresenseenv/setup

    このコマンドは、ターミナルを開くごとに実行する必要があります。このコマンドを省略したい場合は、ホームディレクトリ以下の .bash_profile に上記コマンドを追加してください。

  4. ターミナルで以下のコマンドを実行し、Spresense SDK リポジトリからソースコードをダウンロードします。

    $ git clone --recursive https://github.com/sonydevworld/spresense.git
  5. シリアルドライバのインストール

    シリアルドライバのインストールは、Spresense ボードをMacに接続する前に行ってください。

    Spresense ボードをUSBシリアルで接続するために、ドライバをインストールする必要があります。下記リンクよりドライバをダウンロードし、インストールしてください。

    High Sierra (10.13)以降のmacOSにこのドライバをインストールする場合、インストール中にセキュリティに関する警告が表示されます。 「システム環境設定 > セキュリティ」 メニューを開き、「一般」にある「開発元"Silicon Laboratories Inc"のシステムソフトウェアの読み込みがブロックされました。」と表示されている右にある「許可」ボタンをクリックしてください。この操作が行われない場合、シリアルで接続することができません。

1.2. USB接続

Spresense メインボードへUSBを接続します。

spresense musb connect
図 1. メインボードへのUSBの接続

1.3. サンプルアプリケーション "Hello, World!" のビルド手順

ダウンロードしたSpresense SDKフォルダに移動し、次の手順でビルドします。

  1. sdk ディレクトリへ移動します。

    $ cd spresense/sdk
  2. NuttX Kernelのコンフィギュレーションを行います。

    $ tools/config.py --kernel release
  3. SDKのコンフィギュレーションを行います。

    今回は hello というExampleアプリケーションをビルドするので examples/hello を指定します。

    $ tools/config.py examples/hello
    コンフィギュレーションについての詳細はコンフィギュレーションを参照してください。
  4. ビルドを行います。

    $ make buildkernel
    $ make
    ビルドについての詳細はビルドを参照してください。

全ての手順がうまくいけば、 nuttx.spk というバイナリイメージが、 sdk フォルダに作成されます。このバイナリイメージは Spresense で、実行可能なアプリケーションであり、そのまま Spresenseメインボードにアップロードすることができます。

1.4. Spresense メインボードへのブートローダーのインストール

Spresense メインボードを正しく動作させるためにはバージョンに合わせたブートローダーのインストールが必要になります。

Spresense ボードは出荷状態ではローダーはインストールされていません。
Spresenseのローダーを利用するためにはEnd User License Agreementの同意が必要です。

SDKのコンフィギュレーション 及び Spresense メインボードへのバイナリイメージのロード 時にバージョンに合わせたブートローダーが見つからない場合は次のような WARNING が出るのでそれに従ってインストールを行います。

WARNING: New loader v1.0.003 is required, please download and install.
         Download URL   : https://developer.sony.com/file/download/spresense-binaries-vx.x.x.zip
         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 /home/user/mySpresense/spresense/firmware/spresense -c <port>
  1. バイナリのダウンロード

    WARNING 上の Download URL に記載されているリンクを開きバイナリのZIPファイルをダウンロードします。

  2. バイナリのPCへのインストール

    ダウンロードしたZIPファイルで次のコマンドを使いPCにインストールします。

    $ ./tools/flash.sh -e spresense-binaries-vx.x.x.zip
  3. バイナリのSpresense メインボードへのロード

    WARNING 上で表示されたコマンドをそのまま実行します。

    $ ./tools/flash.sh -l ../firmware/spresense -c <port>
  4. ロードが完了し自動で再起動されます。

1.5. Spresense メインボードへのバイナリイメージのロード

ビルドしたバイナリイメージ nuttx.spk をSpresenseにロードするためには tools/flash.sh を用います。

  1. Spresense メインボードとPCをUSBケーブルで接続します。

    Spresense メインボードが接続されるシリアルポートは、使用するOSによって指定の仕方が変わります。以降の説明では、Linuxで使用する場合のポート名を記載しています。使用するOSによって適宜読み替えてください。

    それぞれのOSでのシリアルポート名の特定の仕方は以下のようになります。

    • Linux

      Linux上では以下のコマンドでSpresense メインボードが接続されているシリアルポートを特定することができます。

      $ dmesg | grep "cp21.*attached"
      [12220.625979] usb 1-1: cp210x converter now attached to ttyUSB0

      この場合は、 ポート名は /dev/ttyUSB0 になります。

    • Mac

      Macの場合は、/dev/tty.SLAB_USBtoUART というポート名になります。

    • Windows

      Windowsの場合は、「設定」メニューから「デバイス」を選択すると、「その他のデバイス」の中に Silicon Labs CP210x USB to UART Bridge (COM3) のように表示されます。この場合、COM3 がポート名となります。

  2. 次のコマンドを使い nuttx.spk をSpresenseへロードします。

    $ tools/flash.sh -c /dev/ttyUSB0 nuttx.spk

    ロード中は以下のようなログが出力されます。

    >>> Install files ...
    install -b 115200
    Install nuttx.spk
    |0%-----------------------------50%------------------------------100%|
    ######################################################################
    
    252480 bytes loaded.
    Package validation is OK.
    Saving package to "nuttx"
    updater# sync
    updater# Restarting the board ...
    reboot
  3. ロードが完了し自動で再起動されます。

1.6. シリアルターミナル上での動作確認

ビルドしたイメージ nuttx.spk を実機へロードすると作成したプログラムが実行されます。 ここでは実行されているプログラムの動作確認をシリアルターミナルで行うための一例を説明します。

Linux/Macでは screenminicom などのシリアルターミナルが使用できます。 WindowsではTera Termなどのシリアル通信ソフトを使用してください。シリアル通信設定は以下のようになります。

表 1. シリアル通信設定

ボーレート

115200

データ

8 bit

パリティ

none

ストップ

1 bit

フロー制御

none

シリアルターミナルの使用方法に関する詳細は、それぞれのマニュアルなどを参照してください。

ここでは screen コマンドを使用する際の例を挙げます。Linuxの場合は、以下のコマンドで screen コマンドをインストールしてください。

$ sudo apt install screen
  1. 次のコマンドでシリアルターミナルを開きます。

    $ screen /dev/ttyUSB0 115200

    以下のようにNSHプロンプトが表示されればSpresense メインボードは正しく起動しています。

    NuttShell (NSH)
    nsh>
  2. hello コマンドを実行し Hello, World! と表示されれば完了です。

    NuttShell (NSH)
    nsh> hello
    Hello, World!!
    nsh>
    シリアルターミナルを開くたびにSpresense メインボードはリセットされます

Spresense SDK の基本的な使い方は以上です。

2. サンプルアプリケーション GPS(GNSS)

こちらは旧ドキュメントです。ドキュメントは以下のサイトに移行されました。 https://developer.sony.com/develop/spresense/docs/sdk_tutorials_ja.html

この章では、GPS(GNSS)のサンプルアプリケーションの動作手順を示します。

2.1. ビルド&ロード手順

ダウンロードしたSpresense SDKフォルダに移動し、次の手順でビルドします。

  1. sdk ディレクトリへ移動します。

    $ cd spresense/sdk
  2. NuttX Kernelのコンフィギュレーションを行います。

    $ tools/config.py --kernel release
  3. SDKのコンフィギュレーションを行います。
    今回は gnss というExampleアプリケーションをビルドするので examples/gnss を指定します。

    $ tools/config.py examples/gnss
    コンフィギュレーションについての詳細はコンフィギュレーションを参照してください。
  4. ビルドを行います。

    $ make buildkernel
    $ make
    ビルドについての詳細はビルドを参照してください。

    全ての手順がうまくいけば、 nuttx.spk というバイナリイメージが、 sdk フォルダに作成されます。

  5. Helloのサンプルと同様、ビルドしたイメージ nuttx.spk をSpresenseに tools/flash.sh を用いてロードします。

    $ tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
  6. ロードが完了し自動で再起動されます。

2.2. GPS動作確認

この nuttx.spk をSpresenseへロードするとGPSのプログラムが実行できます。

Helloサンプルと同様に、シリアルターミナルを開きます。

$ minicom -D /dev/ttyUSB0 -b 115200 -s

builtinされている、 gnss というアプリを実行すると、

tutorial gnss log1
図 2. GPS起動時ログ

というログが表示されます。

測位ができていないうちは、

> No Positioning Data

という表示と、起動時を0時とした時刻が表示されます。 見晴らしの良い場所であれば、およそ、1分ぐらいで、グリニッジ標準時での時刻が表示されます。 およそ、3分ぐらいで、測位ができるはずです。

測位ができた場合は、

> Hour:9, minute:13, sec:20, usec:559
> LAT 35.25.6303
> LNG 139.22.1986

このような表示が行われ、緯度経度が取得できます。

3. サンプルアプリケーション Audio Player

この章では、Audio Playerのサンプルアプリケーションの動作手順を示します。

3.1. ビルド&ロード手順

ダウンロードしたSpresense SDKフォルダに移動し、次の手順でビルドします。

  1. sdk ディレクトリへ移動します。

    $ cd spresense/sdk
  2. NuttX Kernelのコンフィギュレーションを行います。

    $ tools/config.py --kernel release
  3. SDKのコンフィギュレーションを行います。
    今回は audio_player というExampleアプリケーションをビルドするので examples/audio_player を指定します。

    $ tools/config.py examples/audio_player
    コンフィギュレーションについての詳細はコンフィギュレーションを参照してください。
  4. ビルドを行います。

    $ make buildkernel
    $ make
    ビルドについての詳細はビルドを参照してください。

    全ての手順がうまくいけば、 nuttx.spk というバイナリイメージが、 sdk フォルダに作成されます。

  5. Helloのサンプルと同様、ビルドしたイメージ nuttx.spk をSpresenseに tools/flash.sh を用いて、ロードします。

    $ tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
  6. ロードが完了し自動で再起動されます。

  7. Audio Playerの場合、デコード処理を行うDSPバイナリのロードが必要です。 DSPバイナリの置き場所は、SDカードか、SPI-Flashのどちらかを選択できますが、 ここでは、SDカードからロードする方法を行います。

    DSPバイナリのパスの指定は、アプリケーションコード(audio_player_main.cxx)内で指定します。 audio_player_main.cxx では、DSPBIN_PATH で指定しています。

    #define DSPBIN_PATH "/mnt/sd0/BIN"

    であれば、SDカードになります。

    SPI-flashにしたい場合は、"/mnt/spif/BIN" を指定してください。 また、nullを指定すると、Configで設定されたパスになります。

    この "/mnt/sd0/BIN" は、PCで読み込んだ時に、ルートディレクトリの下の BIN/ になります。
    このディレクトリを作成し、ここに必要なコーデックのDSPを置きます。

    MP3でデコードする場合は、
    spresense/sdk/modules/audio/dsp/ の下の MP3DEC を選択してください。

  8. 同時に再生したい音楽ファイルをSDカードに書き込みます。 audio_player_main.cxx では、AUDIOFILE_ROOTPATH で指定しています。

    #define AUDIOFILE_ROOTPATH "/mnt/sd0/AUDIO"

    このため、PC上で読み込んだ時に、ルートディレクトリの下の AUDIO/ 以下に、 再生したいオーディオファイルを置いて下さい。サブディレクトリに置くこともできます。

  9. 現在のAudio Playerサンプルでは、簡易PlayListを利用した再生を行っています。 このため、playlistファイルの置き場所とファイル名を指定して再生します。 audio_player_main.cxx では、PLAYLISTFILE_PATH でパスを指定、 PLAY_LIST_NAMEでファイル名を指定しています。

    #define PLAYLISTFILE_PATH "/mnt/sd0/PLAYLIST"
    #define PLAY_LIST_NAME "TRACK_DB.CSV"

    このため、PC上で読み込んだ時に、ルートディレクトリの下の PLAYLIST/ 以下に、 TRACK_DB.CSV というファイルを作成してください。

    TRACK_DB.CSV の中身は、spresense/sdk/modules/audio/playlist/ の下の README.txt を参照してください。

これらすべてを用意することで、音楽再生が行えます。

3.2. Audio Playerの動作確認

この nuttx.spk を実機へロードするとAudio Playerのプログラムが実行されます。

Helloサンプルと同様に、シリアルターミナルを開きます。

$ minicom -D /dev/ttyUSB0 -b 115200 -s

builtinされている、 player というアプリを実行すると、

tutorial player log
図 3. 音楽再生時ログ

というログが表示され、音声が再生されます。

エラーが発生した場合は、オーディオサブシステムのエラーについてを参照してください。

4. サンプルアプリケーション Audio Recorder

この章では、Audio Recorderのサンプルアプリケーションの動作手順を示します。

コードの構造、データフロー、APIリファレンスなどはAudio Recorder Functionsを参照して下さい。

4.1. ビルド&ロード手順

ダウンロードしたSpresense SDKフォルダに移動し、次の手順でビルドします。

  1. sdk ディレクトリへ移動します。

    $ cd spresense/sdk
  2. NuttX Kernelのコンフィギュレーションを行います。

    $ tools/config.py --kernel release
  3. SDKのコンフィギュレーションを行います。

    1. 今回は audio_recorder というExampleアプリケーションをビルドするので examples/audio_recorder を指定します。

      $ tools/config.py examples/audio_recorder

      このコンフィギュレーションを行うことによって、audio_recorder用の設定が行われます。
      そのうち、下記の項目については必要に応じて変更が可能です。その他は変更しないで下さい。

      [SDK audio]                    <= Y
        [Audio Recorder]             <= Y
          [DSP imange mount path]    <= /mnt/sd0/BIN  (1)
      1 DSPバイナリのデフォルトの置き場所をSDカードにします。SPI-flashにする場合は /mnd/spif/BIN
      コンフィギュレーション機能そのものについての詳細はコンフィギュレーションを参照してください。
    2. 記録する音声にユーザー独自の信号処理を行いたい場合はPreprocess を設定します。

      AudioRecorderでは記録する音声に対してユーザー独自の信号処理を行うことが出来ます。
      これを行いたい場合にはコンフィグメニューで [Use preprocess] を有効にする必要があります。

      コンフィグメニューを開きます。

      $ tools/cofig.py -m

      [Use preprocess] にチェックを入れます。

      [Examples]
        [Audio recorder example]
          [Use preprocess]        <= Y  (1)
      1 Preprocessを有効にします
      Preprocessの詳細についてはSDKデベロッパーガイドの Set preprocess を参照して下さい。
  4. ビルドを行います。

    $ make buildkernel
    $ make
    ビルドについての詳細はビルドを参照してください。

    全ての手順がうまくいけば、 nuttx.spk というバイナリイメージが、 sdk フォルダに作成されます。

  5. Helloのサンプルと同様、ビルドしたイメージ nuttx.spk をSpresenseに tools/flash.sh を用いて、ロードします。

    $ tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
  6. ロードが完了し自動で再起動されます。

  7. Audio Recorderの場合、エンコード処理を行うDSPバイナリのロードが必要です。 DSPバイナリの置き場所は、SDカードか、SPI-Flashのどちらかを選択できますが、 ここでは、SDカードからロードする方法を行います。

    DSPバイナリのパスの指定は、アプリケーションコード(audio_recorder_main.cxx)内のマクロ値で設定しています。
    audio_recorder_main.cxx では、 DSPBIN_PATH で設定していますので必要に応じてアプリケーションコードを変更して下さい。

    #define DSPBIN_PATH "/mnt/sd0/BIN"

    であれば、SDカード上の BIN ディレクトリになります。

    この "/mnt/sd0/BIN" は、PCで読み込んだ時に、ルートディレクトリの下の BIN/ になります。
    このディレクトリを作成し、ここに必要なコーデックのDSPを置きます。

    SPI-flashにしたい場合は、"/mnt/spif/BIN" を指定してください。 また、nullを指定すると、Configで設定されたパスになります。

    MP3でエンコードする場合は、
    spresense/sdk/modules/audio/dsp/ の下の MP3ENC を選択してください。
    その他のエンコードをする場合のCodec種別とDSPバイナリの組み合わせは下表の通りです。

    Codec DSPバイナリ

    MP3

    MP3ENC

    LPCM

    SRC

    また、Preprocess を設定している場合は、下記のPreprocess 用バイナリも同様にSDカードに置いてください。
    バイナリは spresense/examples/audio_recorder/worker/srcの下の PREPROC です。

    本サンプルアプリケーションでは、 PREPROC には簡単なRCfilterがデフォルトで組み込まれています。
    独自の信号処理などにカスタムをしたい場合には こちらを参考にして下さい。
  8. 記録した音声はSDカードに記録されます。 記録パスもアプリケーションコード(audio_recorder_main.cxx)内のマクロ値で設定しています。
    audio_recorder_main.cxx では、 RECFILE_ROOTPATH で設定していますので必要に応じてアプリケーションコードを変更して下さい。

    #define RECFILE_ROOTPATH "/mnt/sd0/REC"

    であればSDカードに記録されます。

4.2. Audio Recorderの動作確認

この nuttx.spk を実機へロードするとAudio Recorderのプログラムが実行されます。

Helloサンプルと同様に、シリアルターミナルを開きます。

$ minicom -D /dev/ttyUSB0 -b 115200 -s

builtinされている、 recorder というアプリを実行すると、

tutorial recorder log
図 4. 音声記録時ログ

というログが表示され、音声が記録されます。

記録された音声はPCで再生することが出来ます。その際にはSDカードルートディレクトリの下の REC/ に音声ファイルがあります。

エラーが発生した場合は、オーディオサブシステムのエラーについてを参照してください。

4.3. DSPバイナリ(PREPROC)のカスタムについて

DSPバイナリ(PREPROC)のカスタム方法について記載します。

4.3.1. Step1. PREPROCのコード編集

PREPROCのコード構成と編集箇所について説明します。
コードは、ユーザー編集すべき部分とフレームワークとして提供される部分の2つに分かれます。

ユーザーが編集するコード

ユーザーが主に編集すべきコードです。
これらのコードを編集してDSPで信号処理を記述することが出来ます。

woker ディレクトリの中にDSPのコードがまとまっており、その中に userproc ディレクトリがあります。
ユーザが信号処理などを書くのは userproc ディレクトリ内のみで、その他は基本的に変更の必要はありません。

main.cpp には、起動処理~MainCPUとのデータ通信制御が書かれていますので変更しないで下さい。

diag c218e3632dfa916b571321d164d9dfb5
図 5. コード構成
main.cpp

起動処理やDSP通信処理などが書かれています。編集の必要は有りません。

userproc_command.h

DSPとの通信コマンドを定義するヘッダファイルです。
必要なパラメータはこのファイルに記載します。

userproc.h

ユーザーコードのヘッダファイルです。

userproc.cpp

ユーザーコード本体です。
このファイルに信号処理などを書く、または呼び出します。

ユーザーコードに用意されるインタフェース

userproc.cppには、 Init , Exec , Flush , Set コマンドの枠組みが用意されており
ユーザーコードはそれぞれに対応する中身を書いていくことでDSP内での処理を実現することが出来ます。

ユーザーが記述すべき処理について説明します。
(※デフォルトではサンプルとしてRCフィルタが組み込まれています。)

コマンドによるDSP内部の状態遷移は下図の様な作りとなることを想定しています。

diag 8dd0a34e45b35a83ecce77f22a3332c0
図 6. 想定するDSP状態遷移

各コマンドを使い以下のような流れで処理を行います。

  1. AUDCMD_SETRECORDERSTATUSがコールされるとDSPが起動します。

  2. Init コマンドで必要なパラメータ(ch数やビット長など)を設定します。

  3. 記録開始するとキャプチャした音声データが Exec コマンドで定期的にDSPに送られるので所望のフィルタ処理をしてください。

  4. 任意のタイミングでDSP内部のパラメータなどを変更したい場合には、 Set コマンドを送ることで実装することを想定しています。このコマンドの実行タイミングは、 Exec を含めた受信順になります。+

  5. 記録停止すると最後の音声データの Exec の後、 Flush コマンドが送られるので終端処理の必要がある場合はここで処理をします。

コマンドの定義

各機能で使用するデータ型は userproc_command.h に書かれており、中身は自由に書き換えることが出来ます。

各コマンドのフォーマットは下図の様になっています。
先頭の白抜きの部分には最低限必要なパラメータが固定で配置されています。これらは変更しないで下さい。
ユーザーが userproc_command.h で定義するパラメータは下図の User param (ピンク色箇所)にあたる部分です。

diag 3d57cbbb80b2fb16206e83f6942e25e8
図 7. コマンドフォーマット

各コマンドについて説明します。

struct InitParam : public CustomprocCommand::CmdBase
  • Init処理用のパラメータです。
    デフォルトではすべてreserveとなっていますが、ch数やビット長など、必要なパラメータに変更してください。

struct ExecParam : public CustomprocCommand::CmdBase
  • Exec処理用のパラメータです。
    音声データのアドレス・サイズは上図の ExecParam にある様に継承元の CustomprocCommand::ExecParamBase に定義されています。
    詳細は /sdk/modules/include/audio/dsp_framework/customproc_command_base.h を参照してください。

struct FlushParam : public CustomprocCommand::CmdBase
  • Flush処理用のパラメータです。
    音声データのアドレス・サイズは上図の ExecParam にある様に継承元の CustomprocCommand::FlushParamBase に定義されています。
    詳細は /sdk/modules/include/audio/dsp_framework/customproc_command_base.h を参照してください。

struct SetParam : public CustomprocCommand::CmdBase
  • Set処理用のパラメータです。
    様々な動的に変更したいパラメータを定義します。デフォルトではRCフィルタのOn/Offや係数を定義しています。

各機能に対応する関数

下記の関数群は userproc.cpp に書かれています。中身は自由に書き換えることが出来ます。
それぞれのコマンド定義に従い処理を行います。

void UserProc::init(InitParam *)
  • InitParamに従い初期化を行う処理を書いて下さい。
    アプリケーションコードからの AUDCMD_INITMFE コマンドで実行されます。
    (デフォルトでは何もしていません。)

void UserProc::exec(ExecParam *)
  • ExecParamに従い信号処理を書いて下さい。
    記録を開始するとSDK内部から定期的に呼ばれます。
    1フレームは記録の設定がLPCMの場合には768サンプル、MP3の場合には1152(ただし16kHz時は1728)サンプルです。
    入力データアドレスからデータを取得し、信号処理を行い、出力データアドレスへ書き出して下さい。
    (デフォルトではRCフィルタ処理が書かれています。)

void UserProc::flush(FlushParam *)
  • FlushParamに従いFlush(終端)処理を書いて下さい。
    記録の停止時にSDK内部から一度だけ呼ばれます。
    IIRやFIRフィルタのように遅延が発生する場合は、最終フレームの後に flush を行い、遅延分の出力を行います。
    出力すべきデータがある場合には、出力データアドレスへ書き出して下さい。
    (デフォルトでは何もしていません。)

void UserProc::set(SetParam *)
  • SetParamに従い設定処理を書いてください。
    アプリケーションコードからの AUDCMD_SETMFE コマンドで実行されます。
    (デフォルトではRCフィルタの係数を設定しています。)

4.3.2. Step2. PREPROC バイナリのビルド

ConfigurationPreprocess を有効にしていれば、本アプリケーションのビルド時に自動で PREPROC バイナリが作成されます。
作成されるパスは spresense/examples/audio_recorder/worker/srcの 下の PREPROC です。
これをSDカードの /mnt/sd0/BIN (PCから見ると \BIN )フォルダに置いてください。

5. [TIPS] Zmodem 転送

この章では、Zmodem 転送を利用して HostPC と Spresense ボードとの間でファイルを送受信する方法について示します。

5.1. ビルド&ロード手順

Spresense SDKフォルダに移動し、次の手順でビルドします。

  1. sdk ディレクトリへ移動します。

    $ cd spresense/sdk
  2. NuttX Kernelのコンフィギュレーションを行います。

    $ tools/config.py --kernel release
  3. SDKのコンフィギュレーションを行います。
    今回は zmodem というSystem toolsをビルドするので feature/zmodem を指定します。

    $ tools/config.py feature/zmodem
    コンフィギュレーションについての詳細はコンフィギュレーションを参照してください。
  4. ビルドを行います。

    $ make buildkernel
    $ make
    ビルドについての詳細はビルドを参照してください。

    全ての手順がうまくいけば、 nuttx.spk というバイナリイメージが、 sdk フォルダに作成されます。

  5. ビルドしたイメージ nuttx.spktools/flash.sh を用いて Spresense ボードにロードします。

    $ tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
  6. ロードが完了し自動で再起動されます。

5.2. 動作手順

Zmodem 転送機能に対応したシリアルターミナルを使用してください。

ここでは、minicom を例にとって説明します。
minicom や lrzsz がインストールされていない場合は事前にインストールしてください。

$ sudo apt install minicom lrzsz

minicom を起動します。

$ minicom -D /dev/ttyUSB0 -b 115200

NuttShell から Zmodem の rz (受信), sz (送信) コマンドを使用することができます。

rz コマンドの使い方
tutorial zmodem1 rz
sz コマンドの使い方
tutorial zmodem1 sz

5.2.1. HostPC から Spresense ボードへのファイル転送

HostPC から Spresense ボードへファイルを転送する手順を以下に示します。

  1. minicom 上で CTRL-a を押下した後に z キーを押してメニューを開きます。(このショートカットキーの割り当てはユーザー側で変更可能です。詳細は minicom のマニュアルを参照してください。)
    続けて s キーを押して Send files (ファイル送信) を選択します。

    tutorial zmodem2 menu
  2. カーソルキーで zmodem を選択して Enter キーで実行します。

    tutorial zmodem2 upload
  3. カーソルキーとスペースキーでフォルダを移動をして転送したいファイルを選択します。
    カーソルキーでフォルダを選びスペースキーを2回押すとフォルダへ移動できます。
    カーソルキーでファイルを選びスペースキーで選択した後に Enter キーを押すと転送を開始します。

    tutorial zmodem2 dir

    もしくは、Enter キーを押してファイル名を入力して転送を実行することもできます。

    tutorial zmodem2 file
  4. ファイル転送が始まり、Transfer complete と表示されれば転送完了です。

    tutorial zmodem2 complete
  5. Spresense ボード上のファイルの転送先は、CONFIG_SYSTEM_ZMODEM_MOUNTPOINT で変更することができます。
    デフォルトのコンフィギュレーションでは、Flash 上の /mnt/spif 以下にファイルが転送されます。

TeraTerm を使用する場合は、TeraTerm メニューから ファイル → 転送 → ZMODEM → 送信 から選択したファイルを送信することができます。

5.2.2. Spresense ボードから HostPC へのファイル転送

Spresense ボードから HostPC へファイルを転送する手順を以下に示します。

  1. NuttShell 上で、sz コマンドの引数に転送したいファイルを指定して実行します。
    ファイル名は / から始まるフルパス名を入力してください。
    以下の例は、-x 1 バイナリ転送オプションを付けています。

    nsh> sz -x 1 /mnt/spif/test00.dat
  2. ファイル転送が始まり、Transfer complete と表示されれば転送完了です。

    tutorial zmodem3 complete
  3. HostPC 上の minicom を実行したフォルダにファイルが転送されます。

TeraTerm を使用する場合は、NuttShell から sz コマンドを入力した後に、ファイル → 転送 → ZMODEM → 受信 によりファイルを受信することができます。HostPC 側のファイル受信ディレクトリは、ファイル → ディレクトリを変更 によって指定可能です。
現状、Spresense ボードの Flash 上のファイルを送信する場合に非常に時間がかかります。
以下の変更を行うことで転送速度を向上できます。この問題は次期バージョンで修正予定です。 tutorial zmodem patch

6. [TIPS] アプリケーション自動起動方法

この章では、電源投入時に NuttShell プロンプトではなくユーザーアプリケーションを自動的に起動する方法について記述します。

6.1. スタートアップスクリプト

スタートアップスクリプトを用意することで、システムが起動する際にそのスクリプトにしたがった動作を行います。 この機能を利用して、電源投入時に自動的に任意のユーザーアプリケーションを実行させることができます。 スタートアップスクリプトには、ユーザーアプリケーションを含む NuttShell コマンドや簡単な if, while といった制御構文を記述することができます。
詳細は、NuttShell ドキュメント を参照してください。

6.1.1. スタートアップスクリプトの使い方

ここでは例として、examples/hello アプリケーションを自動起動するように設定してみます。
(NuttX Kernel のコンフィギュレーション及びビルドに関する説明は省略しています。)

  1. sdk ディレクトリ直下に rcS.template というファイル名のスタートアップスクリプトを作成します。
    rcS.template には、次のような内容を記述します。

    $ cat spresense/sdk/rcS.template
    echo Start-up hello application
    hello
  2. mkromfsimg.sh ツールを使用して、rcS.template から nsh_romfsimg.h を生成します。

    $ cd spresense/sdk
    $ ./tools/mkromfsimg.sh .
    $ ls nsh_romfsimg.h
    nsh_romfsimg.h
  3. hello アプリケーションを有効にして、menuconfig コンフィギュレーションメニューを開きます。

    $ ./tools/config.py -m examples/hello
  4. Support ROMFS start-up script を有効にします。

    System tools --> NSH Library ---> Scripting Support
    tutorial autostart menuconfig1
  5. ROMFS header location として Custom ROMFS header path を選択し、
    Custom ROMFS header file path には ../../nsh_romfsimg.h と記載します。

    nsh_romfsimg.h の場所を sdk/system/nshlib ディレクトリからの相対パスで指定してください。
    tutorial autostart menuconfig2
  6. コンフィギュレーションを終了し、いつもの手順でビルドしたバイナリを Spresense ボードに書き込んでください。

    $ make
    $ tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
  7. 電源を投入すると NuttShell が表示される前にスクリプトに記述した hello アプリケーションが起動されています。

    tutorial autostart log

必要な処理をスクリプト化して確認してみてください。

6.1.2. スクリプト配置場所の変更

rcS.template の置き場所を変更する場合は以下を参考にしてください。

  1. 例として spresense/examples/hello 以下に rcS.template を配置します。

    $ cat spresense/examples/hello/rcS.template
    echo Start-up hello application
    hello
  2. rcS.template が置かれているディレクトリで mkromfsimg.sh ツールを使用して nsh_romfsimg.h を生成します。

    $ cd spresense/examples/hello
    $ ../../sdk/tools/mkromfsimg.sh ../../sdk
    $ ls nsh_romfsimg.h
    nsh_romfsimg.h
  3. コンフィギュレーションメニューを開き、
    Custom ROMFS header file path には ../../../examples/hello/nsh_romfsimg.h と記載します。

    nsh_romfsimg.h の場所を sdk/system/nshlib ディレクトリからの相対パスで指定します。
  4. あとのビルド手順はさきほどと同様です。

6.2. SDK エントリーポイント

スタートアップスクリプトとは別に CONFIG_SDK_USER_ENTRYPOINT を変更するという方法もあります。

デフォルトのコンフィギュレーションでは、CONFIG_SDK_USER_ENTRYPOINT=nsh_main となっています。

これを例えば hello_main に変更すると、起動時に hello アプリケーションを起動するように変更できます。

tutorial autostart entrypoint
起動時にアプリケーションの初期化処理が必要です。以下を参考に、#include <sys/boardctl.h> を追加し、ユーザーエントリーポイント関数の中から boardctl(BOARDIOC_INIT, 0); を呼び出してください。
#include <sys/boardctl.h>

#ifdef CONFIG_BUILD_KERNEL
int main(int argc, FAR char *argv[])
#else
int hello_main(int argc, char *argv[])
#endif
{
  /* Initialize apllication */
  boardctl(BOARDIOC_INIT, 0);

  printf("Hello, World!!\n");
  return 0;
}