1. Examples 一覧
Spresense SDKでは、NuttShell の Built-in コマンドとして各種 Example を用意しています。
初めてビルドする方は、はじめにスタートガイドを参照してください。 コンフィグレーションの方法や、ビルドしたプログラムを実行する手順についての詳しい説明があります。 |
カテゴリ | Example名 | 説明 |
---|---|---|
Hello |
||
C++言語による"Hello, World"を出力するサンプルです。 |
||
Peripheral |
||
GPS (GNSS) |
||
GNSS 評価用のサンプルです。 |
||
GNSS PVTログを出力するサンプルです。 |
||
Audio |
||
オーディオのパススルー機能を用いて、マイク入力、スピーカ出力、I2S入出力を使用したサンプルです。 |
||
PCMデータをキャプチャするサンプルです。 |
||
オーディオビープ音を再生するサンプルです。 |
||
オーディオのデュアルデコード再生のサンプルです。 |
||
オブジェクトインターフェース層を用いたオーディオプレーヤーのサンプルです。 |
||
オブジェクトインターフェース層を用いたオーディオレコーダーのサンプルです。 |
||
オブジェクトインターフェース層を用いたPCMキャプチャのサンプルです。 |
||
低遅延で音声エフェクトを行うサンプルです。 |
||
ASMP |
ASMPフレームワークによるマルチコアを使用したサンプルです。 |
|
マルチコアを使用して素数計算を行うサンプルです。 |
||
マルチコアを使用してFFT演算を行うサンプルです。 |
||
Sensor |
加速度センサからセンサ情報を取得するサンプルです。 |
|
ジャイロセンサからセンサ情報を取得するサンプルです。 |
||
照度センサからセンサ情報を取得するサンプルです。 |
||
地磁気センサからセンサ情報を取得するサンプルです。 |
||
気圧センサからセンサ情報を取得するサンプルです。 |
||
近接センサからセンサ情報を取得するサンプルです。 |
||
カラーセンサからセンサ情報を取得するサンプルです。 |
||
加速度センサを使用して傾き検出を行うサンプルです。 |
||
SCUによるデシメータ機能を使って間引き処理を行うサンプルです。 |
||
加速度/ジャイロの6軸センサを使用したサンプルです。 |
||
加速度センサによる歩数計及び行動認識を行うサンプルです。 |
||
Camera |
カメラ機能のサンプルです。 |
|
JPEG |
JPEGデコードのサンプルです。 |
|
LCD |
ILI9341のLCDに描画するサンプルです。 |
|
NX graphics機能を用いて、描画するサンプルです。 |
||
NX graphics機能を用いて、"Hello"を描画するサンプルです。 |
||
NX graphics機能を用いて、ビットマップを描画するサンプルです。 |
||
NX graphics機能を用いて、線を描画するサンプルです。 |
||
NX graphics機能を用いて、テキストを描画するサンプルです。 |
||
DNN |
DNN Runtime機能を使用して、数字認識を行うサンプルです。 |
|
LTE |
||
LTE通信機能を用いて、WebSocket通信を行うサンプルです。 |
||
LTE通信機能を用いて、Lightweight M2M(LWM2M)通信を行うサンプルです。 |
||
Battery |
充電機能のサンプルです。(Spresenseボードでは充電機能はサポートされていません) |
2. Peripheral Driver チュートリアル
2.1. RTC alarm サンプルアプリケーション
RTC alarm サンプルアプリケーションの動作について説明します。
2.1.1. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/alarm
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py examples/alarm make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
2.1.2. 動作確認
シリアルターミナルを開いて、alarm
コマンドを実行します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
alarm
コマンドを実行します。alarm
コマンドの使い方を以下に示します。nsh> alarm ERROR: Invalid number of arguments: 0 USAGE: alarm <seconds> Where: <seconds> The number of seconds until the alarm expires.
<seconds> には相対時間(秒)を指定します。例えば、
alarm 5
と入力すると、5 秒後にアラームが発火します。nsh> alarm 5 alarm_daemon started alarm_daemon: Running Opening /dev/rtc0 Alarm 0 set in 5 seconds nsh> alarm_demon: alarm 0 received
2.1.3. 省電力機能と組み合わせて使用する
alarm
コマンドと省電力機能を組み合わせて使用する例について紹介します。
Spresense には、Deep Sleep や Cold Sleep モードといった省電力機能が提供されています。
shutdown
や poweroff
コマンドを用いてこれらの Sleep 状態に入ることができます。
そして、RTC アラーム機能により、この Sleep 状態から起床することができます
Deep Sleep や Cold Sleep について、詳しくは スリープモード を参照してください。
shutdown
及び poweroff
コマンドの使い方を以下に示します。
nsh> help shutdown shutdown usage: shutdown [--reboot]
nsh> help poweroff poweroff usage: poweroff [--cold]
2.1.4. その他の RTC に関するコマンド
date
コマンドにより、RTC に時刻を設定したり、RTC に設定された現在時刻を表示することができます。
nsh> help date date usage: date [-s "MMM DD HH:MM:SS YYYY"]
例)RTC に 2019年12月1日23時34分56秒を設定する場合、
nsh> date -s "Dec 1 23:34:56 2019"
date コマンドにより現在時刻を表示します。
nsh> date Dec 01 23:35:14 2019
RTC は、Deep/Cold Sleep といったスリープ中や reboot
コマンドにより再起動した場合でも時刻を保持し続けます。ただし、電源供給がオフされたり、リセットボタンが押された場合は、RTC に設定された時刻はリセットされます。
以下に reboot
コマンドによる再起動後も時刻が保持されている例を示します。
nsh> date Dec 01 23:41:08 2019 nsh> reboot NuttShell (NSH) NuttX-7.22 nsh> date Dec 01 23:41:12 2019 nsh>
2.2. Watchdog サンプルアプリケーション
Watchdog サンプルアプリケーションの動作について説明します。
2.2.1. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/watchdog
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py examples/watchdog make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
2.2.2. 動作確認
シリアルターミナルを開いて、wdog
コマンドを実行します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
wdog
コマンドを実行します。wdog
コマンドの使い方を以下に示します。nsh> wdog -h Usage: wdog [-h] [-d <pingdelay>] [-p <pingtime>] [-t <timeout>] Initialize the watchdog to the <timeout>. Start the watchdog timer. Ping for the watchdog for <pingtime> seconds, then let it expire. Options include: [-d <pingdelay>] = Time delay between pings in milliseconds. Default: 500 [-p <pingtime>] = Selects the <pingtime> time in milliseconds. Default: 5000 [-t timeout] = Time in milliseconds that the example will ping the watchdog before letting the watchdog expire. Default: 2000 [-h] = Shows this message and exits
- -d
-
指定された周期 [msec] で ioctl(fd, WDIOC_KEEPALIVE, 0) を呼び出すことで watchdog タイマーをクリアします。
- -p
-
指定された期間中 [msec] は watchdog をクリアし続けます。
- -t
-
指定された値 [msec] で ioctl(fd, WDIOC_SETTIMEOUT, (unsigned long)wdog.timeout) を呼び出しwatchdog タイマーの周期を設定します。
本サンプルアプリケーションは、watchdog タイマーの発火に伴いシステムがリブートすることを確認できます。
wdog
コマンドを実行した例を以下に示します。
引数無しで動作させたときは、デフォルト値の 2 秒で watchdog タイマー周期を設定します。
5 秒間は 500 msec 周期で watchdog タイマーをクリアし続けます。
その後、watchdog タイマーをクリアしないままタイマーが満了してシステムがリブートします。
nsh> wdog ping elapsed=0 ping elapsed=500 ping elapsed=1000 ping elapsed=1500 ping elapsed=2000 ping elapsed=2500 ping elapsed=3000 ping elapsed=3500 ping elapsed=4000 ping elapsed=4500 NO ping elapsed=5000 NO ping elapsed=5500 NO ping elapsed=6000 up_assert: Assertion failed at file:irq/irq_unexpectedisr.c line: 65 task: Idle Task up_dumpstate: sp: 0d0279d4 up_dumpstate: IRQ stack: up_dumpstate: base: 0d027a00 up_dumpstate: size: 00000800 up_dumpstate: used: 00000120 up_stackdump: 0d0279c0: 00000000 0d003e3d 0d0291a8 0d02975c 00000000 00000002 466cc9d4 0d002f69 up_stackdump: 0d0279e0: 0d002f55 0d00703d 00000000 0d02975c 0d028a20 00000003 00000000 0d006fd5 up_dumpstate: sp: 0d029830 up_dumpstate: User stack: up_dumpstate: base: 0d029840 up_dumpstate: size: 00000400 up_dumpstate: used: 00000000 up_stackdump: 0d029820: 9b7feebc 1f86add5 00000000 0d002e75 0d029844 001567bc 2df7cabf 00000000 up_registerdump: R0: 00000000 0d026bcc 0d02df68 00000014 0d026b54 0d028a20 00000003 00000000 up_registerdump: R8: 0d026ca0 f0bbaf7f dc9161d8 466cc9d4 00000003 0d029830 0d002e79 0d008792 up_registerdump: xPSR: 21000000 BASEPRI: 00000000 CONTROL: 00000000 up_registerdump: EXC_RETURN: ffffffe9 up_taskdump: Idle Task: PID=0 Stack Used=0 of 0 up_taskdump: hpwork: PID=1 Stack Used=344 of 2028 up_taskdump: lpwork: PID=2 Stack Used=352 of 2028 up_taskdump: lpwork: PID=3 Stack Used=352 of 2028 up_taskdump: lpwork: PID=4 Stack Used=352 of 2028 up_taskdump: init: PID=5 Stack Used=1032 of 8172 up_taskdump: cxd56_pm_task: PID=6 Stack Used=320 of 996 up_taskdump: wdog: PID=8 Stack Used=528 of 2028 NuttShell (NSH) NuttX-7.22 nsh>
2.3. ADC サンプルアプリケーション
この章では、ADC サンプルアプリケーションの動作手順を示します。
2.3.1. ビルド手順
CLI 版を使ったビルド手順について書かれていますが、IDE 版でも同様のコンフィグレーションを選択することにより本サンプルアプリケーションをビルドすることができます。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、コンフィグレーションツールのTab補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel は release 版を使用しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/adc
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py examples/adc make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate として 500000 bps を設定しています。
tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
2.3.2. 動作確認
シリアルターミナルを開いて、adc コマンドを実行します。
-
シリアルターミナルを起動します。
以下は、minicom ターミナルを使用する例です。 シリアルポートとして /dev/ttyUSB0 を、baudrate として 115200 bps を設定しています。
minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
adc
コマンドを実行します。adc コマンドの Usage を以下に示します。
nsh> adc -h Usage: adc [OPTIONS] Arguments are "sticky". For example, once the ADC device is specified, that device will be re-used until it is changed. "sticky" OPTIONS include: [-p devpath] selects the ADC device. /dev/lpadc0, 1, 2, 3, /dev/hpadc0, 1 Current: /dev/lpadc0 [-n count] set the number of reads. Current: 10 [-h] shows this message and exits
- -p
-
全部で 6 つの ADC 専用端子があります。-p オプションにより、-p /dev/lpadc[0-3] もしくは /dev/hpadc[0-1] を指定します。 Spresense ボード上のピン番号とデバイスファイルの関係は下記の通りです。
ピン番号
A0
A1
A2
A3
A4
A5
/devファイル
/dev/lpadc0
/dev/lpadc1
/dev/lpadc2
/dev/lpadc3
/dev/hpadc0
/dev/hpadc1
- -n
-
測定回数を指定します。
例えば、HPADC0 (A4) に対して、10 回分の ADC データ取得を行います。 HPADC0 に対して、ADC データをバッファリングし、その平均値、最小値、最大値を表示します。 ADC データは 16bit の符号付きデータで、範囲は -32767 ~ 32767 です。
nsh> adc -p /dev/hpadc0 -n 10 ADC example - Name:/dev/hpadc0 bufsize:16 Ave:-32767 Min:-32767 Max:-32767 Cnt:8 Ave:-32767 Min:-32767 Max:-32767 Cnt:8 Ave:-32767 Min:-32767 Max:-32767 Cnt:8 Ave:14673 Min:14668 Max:14676 Cnt:8 Ave:14681 Min:14677 Max:14684 Cnt:8 Ave:14690 Min:14687 Max:14694 Cnt:8 Ave:14684 Min:14680 Max:14690 Cnt:8 Ave:14677 Min:14672 Max:14682 Cnt:8 Ave:14677 Min:14675 Max:14682 Cnt:8 Ave:14672 Min:14667 Max:14677 Cnt:8 ADC example end
2.3.3. ADC サンプリング周波数について
ADC のサンプリング周波数は SCU clock mode により選択されたクロックに依存します。
2.3.3.1. HPADC (High Performance ADC)
HPADC は高速サンプリングが可能な ADC です。
HPADC の クロック系統図を以下に示します。
クロックソースを固定分周して HPADC クロックが決まります。 その ADC クロックを 2 のべき乗で分周してサンプリング周波数が決定されます。
n の値は、次の SDK コンフィグレーションにより変更することができます。
CXD56xx Configuration -> HPADC0 -> Coefficient of sampling frequency (CONFIG_CXD56_HPADC0_FREQ) CXD56xx Configuration -> HPADC1 -> Coefficient of sampling frequency (CONFIG_CXD56_HPADC1_FREQ)
n の取りうる範囲は、SCU clock mode によって変わります。
-
SCU clock mode = RTC の場合
n 9 10 11 Fs(Hz)
64
32
16
Available
〇
〇
〇
-
SCU clock mode = RCOSC/XOSC の場合
n 0 1 2 3 4 5 6 7 Fs(Hz)
2M
1M
512K
256K
128K
64K
32K
16K
Available
×
×
×
×
×
〇
〇
〇
2.3.3.2. LPADC (Low Power ADC)
LPADC は HPADC に比べてサンプリングレートは低速ですが省電力で動作する ADC です。 LPADC のクロック系統図を以下に示します。
LPADC を RTC クロックをベースに動作します。そのクロックを 2 のべき乗で分周してサンプリング周波数が決定されます。
n の値は、次の SDK コンフィグレーションにより変更することができます。
CXD56xx Configuration -> LPADC0 -> Coefficient of sampling frequency (CONFIG_CXD56_LPADC0_FREQ) CXD56xx Configuration -> LPADC1 -> Coefficient of sampling frequency (CONFIG_CXD56_LPADC1_FREQ) CXD56xx Configuration -> LPADC2 -> Coefficient of sampling frequency (CONFIG_CXD56_LPADC2_FREQ) CXD56xx Configuration -> LPADC3 -> Coefficient of sampling frequency (CONFIG_CXD56_LPADC3_FREQ)
n の取りうる範囲は、SCU clock mode によって変わります。 また、LPADC は全部で 4 チャンネルありますが、1 ch のみ使用する場合、2ch で使用する場合、4ch で使用する場合 でもサンプリング周波数の上限値が変わります。それぞれのケースで、n の取りうる値を以下に示します。
-
SCU clock mode = RTC の場合
-
LPADC channel 0 ~ 3 のいずれか一つのチャンネルを選択した場合
n 11 12 13 14 15 Fs(Hz)
16
8
4
2
1
Available
〇
〇
〇
〇
〇
-
LPADC channel 0 and 1 の二つのチャンネルを選択した場合
n 12 13 14 15 Fs(Hz)
4
2
1
0.5
Available
〇
〇
〇
〇
-
LPADC channel 0 ~ 3 の四つのチャンネルを選択した場合
n 11 12 13 14 15 Fs(Hz)
4
2
1
0.5
0.25
Available
〇
〇
〇
〇
〇
-
-
SCU clock mode = RCOSC の場合
-
LPADC channel 0 ~ 3 のいずれか一つのチャンネルを選択した場合
n 3 4 5 6 7 8 9 10 11 12 13 14 15 Fs(Hz)
4K
2K
1K
512
256
128
64
32
16
8
4
2
1
Available
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
-
LPADC channel 0 and 1 の二つのチャンネルを選択した場合
n 6 7 8 9 10 11 12 13 14 15 Fs(Hz)
256
128
64
32
16
8
4
2
1
0.5
Available
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
-
LPADC channel 0 ~ 3 の四つのチャンネルを選択した場合
n 7 8 9 10 11 12 13 14 15 Fs(Hz)
64
32
16
8
4
2
1
0.5
0.25
Available
〇
〇
〇
〇
〇
〇
〇
〇
〇
-
-
SCU clock mode = XOSC の場合
-
LPADC channel 0 ~ 3 のいずれか一つのチャンネルを選択した場合
n 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Fs(Hz)
8K
4K
2K
1K
512
256
128
64
32
16
8
4
2
1
Available
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
-
LPADC channel 0 and 1 の二つのチャンネルを選択した場合
n 6 7 8 9 10 11 12 13 14 15 Fs(Hz)
256
128
64
32
16
8
4
2
1
0.5
Available
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
-
LPADC channel 0 ~ 3 の四つのチャンネルを選択した場合
n 7 8 9 10 11 12 13 14 15 Fs(Hz)
64
32
16
8
4
2
1
0.5
0.25
Available
〇
〇
〇
〇
〇
〇
〇
〇
〇
-
2.4. PWM サンプルアプリケーション
PWM サンプルアプリケーションの動作について説明します。
2.4.1. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/pwm
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py examples/pwm make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
2.4.2. 動作確認
シリアルターミナルを開いて、pwm
コマンドを実行します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
pwm
コマンドを実行します。pwm
コマンドの使い方を以下に示します。nsh> pwm -h Usage: pwm [OPTIONS] Arguments are "sticky". For example, once the PWM frequency is specified, that frequency will be re-used until it is changed. "sticky" OPTIONS include: [-p devpath] selects the PWM device. Default: /dev/pwm0 Current: /dev/pwm0 [-f frequency] selects the pulse frequency. Default: 1000 Hz Current: 1000 Hz [-d duty] selects the pulse duty as a percentage. Default: 50 % Current: 50 % [-t duration] is the duration of the pulse train in seconds. Default: 5 Current: 5 [-h] shows this message and exits
例)PWM1 に対して、周期 2000 Hz、デューティー比 30 % の PWM 信号を 10 秒間出力します。
nsh> pwm -p /dev/pwm1 -f 2000 -d 30 -t 10
- -p
-
全部で 4 つの PWM 専用端子があります。-p オプションにより、-p /dev/pwm[0-3] を指定します。
- -f
-
PWM 周期 [Hz] を設定します。
- -d
-
デューティー比(周期に対する High 期間の割り合い) [%] は、1 ~ 99 までの数字を指定します。
- -t
-
指定された時間 [s] の PWM 信号を出力します。
2.4.3. PWM 周波数とデューティー比について
PWM は SCU clock mode により選択されたクロックで動作します。
SCU clock を以下に示します。
-
Same with SCU32K → RTC 32.768kHz
-
RCOSC → 約8.2MHz
-
XOSC → TCXO 26MHz を CONFIG_CXD56_SCU_XOSC_DIV(=2) で分周した 13MHz
PWM 信号の波形は、下図で表されるように SCU clock の PWM_CYCLE カウント数により周期が決まり、 PWM_THRESH カウント数により Low 出力の期間が決定されます。カウント数の上限は 0xffff です。
PWM で設定できる周波数の範囲は、
1 <= PWM frequency <= SCU clock / 2
となり、例えば、SCU clock が RCOSC を選択した場合は、1Hz ~ 約 4MHz までとなります。
デューティー比について、-d
で指定された数字から計算上の近似値で Low, High の区間を決定するため、
出力される波形は正確なデューティー比にならず丸め誤差を含むことがあります。
3. GPS チュートリアル
3.1. GNSS サンプルアプリケーション
GNSS サンプルアプリケーションの動作について説明します。
3.1.1. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/gnss
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py examples/gnss make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
3.1.2. 動作確認
シリアルターミナルを開いて、gnss
コマンドを実行します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
gnss
コマンドを実行します。図 1. gnssコマンド起動時ログ
本アプリケーションを実行すると、はじめに /dev/gps
ドライバを open() します。
fd = open("/dev/gps", O_RDONLY);
openしたドライバに対して ioctl() を用いて、測定周期の設定や衛星システムの選択を行います。
ret = ioctl(fd, CXD56_GNSS_IOCTL_SET_OPE_MODE, (uint32_t)&set_opemode);
ret = ioctl(fd, CXD56_GNSS_IOCTL_SELECT_SATELLITE_SYSTEM, set_satellite);
ioctl() の CXD56_GNSS_IOCTL_START コマンドにより測位を開始します。
ret = ioctl(fd, CXD56_GNSS_IOCTL_START, CXD56_GNSS_STMOD_HOT);
測位結果は、read() を用いて読みだすことができます。
ret = read(fd, &posdat, sizeof(posdat));
本アプリケーションでは 1 秒周期で測位結果を表示します。
位置情報が取得できるまでの間は、"No Positioning Data"と表示されます。
Hour:0, minute:0, sec:3, usec:503 No Positioning Data
はじめに時刻情報を取得できたら、ターミナル上に UTC 時刻を表示します。
さらに位置情報を取得できたら次のように緯度、経度情報がターミナル上に表示されます。
Hour:9, minute:13, sec:20, usec:559 LAT 35.25.6303 LNG 139.22.1986
本アプリケーションは、位置情報を取得してから約200秒後に測位動作を終了します。
ioctl() の CXD56_GNSS_IOCTL_STOP コマンドにより測位を停止した後に、/dev/gps
ドライバを close() します。
ret = ioctl(fd, CXD56_GNSS_IOCTL_STOP, 0);
ret = close(fd);
上空がよく見える屋外など受信環境が良い場合は、約30秒~1分ぐらいで測位ができますが、 受信環境がよくない場合は測位するまでに数分かかる場合があります。
3.2. Geofence サンプルアプリケーション
Geofence サンプルアプリケーションの動作について説明します。
Geofence は、GNSS で取得される位置情報を使って、特定のリージョンに入る・抜ける・一定期間滞在している、 といったイベントを検出しアプリケーションに通知する機能を提供します。そのリージョンは、中心座標(緯度経度)とその半径によって 指定され、ユーザーが任意の位置を最大 20 地点まで登録することができます。
3.2.1. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/geofence
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py examples/geofence make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
3.2.2. 動作確認
シリアルターミナルを開いて、geofence
コマンドを実行します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
geofence
コマンドを実行します。nsh> geofence
本アプリケーションでは、まず現在位置の情報を測位によって取得します。
その現在位置と、そこを起点として東西南北方向にそれぞれ 50 m ずつ離れた場所の計 5 つのリージョンを登録します。
現在位置の測位が完了しリージョンが設定された後に、デバイスを持ち歩いて移動することにより、 特定のリージョンに入った"ENTER"/抜けた"EXIT"/滞在している"DWELL"、といったステータスの情報がログ上に表示されます。
具体的な Geofence 機能の使い方については以下の通りです。
/dev/gps
ドライバを open() して測位を行う方法は、
前述した GNSS サンプルアプリケーション を参照してください。
Geofence 機能を使用するためには /dev/geofence
ドライバを open() します。
g_fdgeo = open("/dev/geofence", O_RDONLY);
openしたドライバに対して ioctl() を用いて、Dead zone [m] や滞在通知期間 [s] を設定します。
mode.deadzone = 5;
mode.dwell_detecttime = 10;
ret = ioctl(g_fdgeo, CXD56_GEOFENCE_IOCTL_SET_MODE, (unsigned long)&mode);
ioctl() の CXD56_GEOFENCE_IOCTL_ADD コマンドにより、リージョンを追加します。
region_xxx.id = 0;
region_xxx.latitude = own_latitude;
region_xxx.longitude = own_longitude;
region_xxx.radius = GEOFENE_REGION_RADIUS;
ret = ioctl(g_fdgeo, CXD56_GEOFENCE_IOCTL_ADD, (unsigned long)®ion_xxx);
ioctl() の CXD56_GEOFENCE_IOCTL_START コマンドにより、Geofence 動作を開始します。
ret = ioctl(g_fdgeo, CXD56_GEOFENCE_IOCTL_START, 0);
Geofence イベントを poll() によって待ち受け、read() により情報を取得します。
ret = read(g_fdgeo, &g_geofence_status, sizeof(struct cxd56_geofence_status_s));
本アプリケーションは、トータル 10 個のイベント通知がきたら Geofence 動作を終了します。
ioctl() の CXD56_GEOFENCE_IOCTL_STOP コマンドにより停止した後に、/dev/geofence
ドライバを close() します。
ret = ioctl(g_fdgeo, CXD56_GEOFENCE_IOCTL_STOP, 0);
ret = close(g_fdgeo);
3.3. GNSS ATCMD アプリケーション
gnss_atcmd
は Spresense SDK 上で動作する GNSS 機能評価用のサンプルアプリケーションです。
PC 等のホストからシリアルポートを介してコマンドを送信すると、そのシリアルポートに NMEA センテンスの結果が出力されます。具体的なコマンドの仕様とアプリケーションの使用例について示します。
3.3.1. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
本アプリケーションを実行するためには、以下の SDK Configuration を有効にしてください。
CONFIG_CXD56_GNSS=y CONFIG_GPSUTILS_CXD56NMEA_LIB=y CONFIG_EXAMPLES_GNSS_ATCMD=y
下記のコマンド実行することでこれらの Configuration を自動的に有効にすることができます。
./tools/config.py examples/gnss_atcmd
また、コマンド入出力に使用するポートを、コンフィグレーション GNSS Command IO によって切り替えることができます。
│ Prompt: GNSS Command IO │ Location: │ -> Examples │ -> GNSS CXD5603 @command emulator example (EXAMPLES_GNSS_ATCMD [=y])
-
Example uses USB CDC tty : 拡張ボード上の USB ポートを使用 (デフォルト)
-
Example uses STDINOUT for nsh debug UART : メイン基板上の USB ポート (UART1)
-
Example uses UART ttyS0 : メイン基板上の USB ポート (UART1)
-
Example uses UART ttyS1 : 非サポート
-
Example uses UART ttyS2 : メインボード及び拡張ボード上の UART ポート (UART2)
ビルドに成功すると
sdk
フォルダ直下にnuttx.spk
というバイナリファイルが生成されます。
-
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
3.3.2. @コマンド仕様
ホストから送信するコマンドの仕様について説明します。
PC 等のホストから送信されたコマンドを gnss_atcmd アプリケーションが受信し、処理結果をホストに返します。コマンド送信から結果が応答されるまでの期間は、NMEA は出力されません。gnss_atcmd アプリケーションからコマンド完了を示す応答メッセージ (Done または Err ) が返ってくる前に別のコマンドを発行しないようにして下さい。なお、コマンド送信からコマンド応答が返るまでの時間はコマンドの種別およびその時の状態により異なりますが、ワーストケースで約 5 秒かかることがあります。ホストコントローラにてタイムアウトを検出する際は 5 秒にてタイムアウトと判断して下さい。
3.3.2.1. コマンドフォーマット
コマンドの書式は以下の通りです。"@" (アットマーク)に続いてコマンド文字列や引数を送信し、最後に改行コードを送ります。
@Command [Argument0] [Argument1]...<CR><LF>
- Command
-
4 文字以内の文字列です。詳細は下表 コマンド一覧 を参照してください。
- Argument
-
10 進数で表される数値です。文字列の先頭が "0x" の場合は 16 進数を表します。 コマンドによっては複数の引数をとります。
- <CR><LF>
-
改行コードを表します。コマンド行の終わりには CR (Carriage Return) + LF (Line Feed) を付けてください。
3.3.2.2. 正常応答フォーマット
正常応答結果の書式は以下の通りです。[送信したコマンド文字列]に続いて、"Done"の文字列が返ります。
[Command] Done<CR><LF>
- Command
-
受信したコマンド文字列を表します。
- <CR><LF>
-
改行を表します。応答行の終わりには CR (Carriage Return) + LF (Line Feed) が付加されています。
3.3.2.3. エラー応答フォーマット
エラー応答結果の書式は以下の通りです。[送信したコマンド文字列]に続いて、"Err"の文字列とエラーコードが返ります。
[Command] Err ErrorCode<CR><LF>
- Command
-
受信したコマンド文字列を表します。
- ErrorCode
-
負値のエラーコードを表します。
- <CR><LF>
-
改行を表します。応答行の終わりには CR (Carriage Return) + LF (Line Feed) が付加されています。
3.3.2.4. コマンドシーケンス
@GCD のような測位開始のコマンドを発行すると、"Done" の応答を返した後に、定期的に NMEA センテンスが Host へ送られます。
@VER コマンドを発行すると、バージョン情報が送られた後に、"Done" の応答が返ります。
3.3.2.5. コマンド一覧
gnss_atcmd が処理可能なコマンド一覧を下記に示します。
Command | Argument | Description | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@AEXT |
- |
アプリケーションを終了します。本コマンドは測位停止中に実行してください。 |
||||||||||||||||||||||||||||||
@BSSL |
NMEAマスク |
NMEA 0183 (ver 4.00) 規格で定義されているNMEAセンテンスのうち、 出力するNMEAセンテンスをビットマスク値で引数に指定します。 初期状態ではNMEAマスクには0xefが設定されています。
xx は、以下を表します。
コマンド例:
|
||||||||||||||||||||||||||||||
@BUP |
- |
受信済みのエフェメリス及び各種パラメータを Flash へセーブします。セーブされたデータは次回起動時に自動的にリストアされます。
本コマンドは測位停止中に実行して下さい。 |
||||||||||||||||||||||||||||||
@GCD |
- |
Cold Start による測位を開始し、NMEAセンテンスを周期的に出力します。出力されるNMEAセンテンスはNMEAマスクに従います。 |
||||||||||||||||||||||||||||||
@GNS |
衛星マスク |
測位に使用する衛星を引数のビットマスク値で選択します。
NOTE
補正信号は排他的使用が前提です。使用方法についてはSDKドキュメントをご参照ください。 コマンド例:
|
||||||||||||||||||||||||||||||
@GPOE |
<緯度[度]> |
楕円体座標の受信機現在位置を設定します。 コマンド例:
|
||||||||||||||||||||||||||||||
@GSR |
- |
Hot Start による測位を開始し、NMEAセンテンスを周期的に出力します。 |
||||||||||||||||||||||||||||||
@GSTP |
- |
測位を停止します。 |
||||||||||||||||||||||||||||||
@GSW |
- |
Warm Start による測位を開始し、NMEAセンテンスを周期的に出力します。 |
||||||||||||||||||||||||||||||
@GTIM |
<年> |
UTC時刻を設定します。 コマンド例:
|
||||||||||||||||||||||||||||||
@VER |
- |
ALLゼロのバージョン番号を返します。 |
3.3.3. 動作確認
シリアルターミナルを開いて、gnss_atcmd コマンドを実行します。
-
シリアルターミナルを起動します。
以下は、minicom ターミナルを使用する例です。 シリアルポートとして /dev/ttyUSB0 を、baudrate として 115200 bps を設定しています。
minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
gnss_atcmd
コマンドを実行します。以下に示す例は、コマンド入出力のターミナルとして NuttShell と同じメイン基板上の USB ポートを使用しています。 前述した GNSS Command IO のコンフィグレーションは、"Example uses STDINOUT for nsh debug UART" を選択しています。
-
Example uses USB CDC tty
-
Example uses STDINOUT for nsh debug UART
-
Example uses UART ttyS0
-
Example uses UART ttyS1
-
Example uses UART ttyS2
-
3.3.3.1. 例: Cold Start による測位の開始と停止
GPS、Glonass、QZSS L1C/A を測位衛星として選び、Cold Start で測位を開始します。 その後 NMEA センテンスが出力され、適当な期間の後、測位を停止して gnss_atcmd を終了します。
nsh> gnss_atcmd (アプリケーション開始)
@GNS 0x0b↵ (測位衛星の選択)
@GCD↵ (Cold Start測位開始)
----- <NMEA出力> ----
@GSTP↵ (測位停止)
@AEXT↵ (アプリケーション終了)
nsh>
3.3.3.2. 例: GNSS 終了後の Hot Start 測位
初めに GPS、Glonass、QZSS L1C/A を測位衛星として選び、Cold Start で測位を開始します。 測位された後に、Spresense の電源は保ちつつ GNSS を終了し、再度 Hot Start で測位を開始します。 Hot Start では測位開始から数秒後に測位が FIX します。
nsh> gnss_atcmd (アプリケーション開始)
@GNS 0x0b↵ (測位衛星の選択)
@GCD↵ (Cold Start測位開始)
----- <NMEA出力> ----
@GSTP↵ (測位停止)
@AEXT↵ (アプリケーション終了)
nsh> gnss_atcmd (アプリケーション開始)
@GSR↵ (Hot Start測位開始)
----- <NMEA出力> ----
@GSTP↵ (測位停止)
@AEXT↵ (アプリケーション終了)
nsh>
3.3.3.3. 例: Spresense 電源 OFF 後の Hot Start 測位
初めに GPS、Glonass、QZSS L1C/A を測位衛星として選び、Cold Start で測位を開始します。 その後、GNSS を終了した後に Spresense の電源を OFF します。
再度 Spresense の電源を入れた後、UTC 時刻と現在位置を入力して Hot Start で測位を開始します。 Hot Start では測位開始から数秒後に測位が FIX します。
nsh> gnss_atcmd (アプリケーション開始)
@GNS 0x0b↵ (測位衛星の選択)
@GCD↵ (Cold Start測位開始)
----- <NMEA出力> ----
@GSTP↵ (測位停止)
@BUP↵ (Flashへバックアップ)
@AEXT↵ (アプリケーション終了)
----- <Power OFF> -----
----- <Power ON> -----
nsh> gnss_atcmd (アプリケーション開始)
@GTIM 2018 11 09 02 45 05↵ (UTC 時刻設定)
@GPOE 35 39 31 139 44 05↵ (現在位置の設定)
@GSR↵ (Hot Start測位開始)
----- <NMEA出力> ----
@GSTP↵ (測位停止)
@AEXT↵ (アプリケーション終了)
nsh>
3.3.3.4. みちびきQZQSMセンテンスの出力
衛星マスクにQZSS L1/CAを選び、NMEAマスクでQZQSMセンテンスを有効にした後、測位を開始します。 受信条件が良ければ10秒弱で最初のQZQSMセンテンスが出力され、その後4秒毎に出力されます。
nsh> gnss_atcmd
@GNS 0x29↵
@BSSL 0x40ef↵
@GCD↵
$GPGGA,000001.00,,,,,0,00,,,,,,,*49
$GNGLL,,,,,000001.00,V,N*55
…
$GNZDA,000008.00,06,01,1980,,*77
$QZQSM,56,9AADF260540002C3F2587F8B101962082C41A588ACB1181623500011439023C*7B
$GPGGA,000009.00,,,,,0,00,,,,,,,*41
…
4. Audio チュートリアル
4.1. Audio Player サンプルアプリケーション
Audio Player サンプルアプリケーションの動作について説明します。
4.1.1. ビルド&ロード手順
ここではコマンドラインによるビルド手順を示します。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/audio_player
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py examples/audio_player make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
-
Audio Playerの場合、デコード処理を行うDSPバイナリのロードが必要です。 DSPバイナリの置き場所は、SDカードか、SPI-Flashのどちらかを選択できますが、 ここでは、SDカードからロードする方法を行います。
DSPバイナリのパスの指定は、アプリケーションコード(audio_player_main.cxx)内で指定します。
audio_player_main.cxx
ではDSPBIN_FILE_PATH
で指定しています。#define DSPBIN_FILE_PATH "/mnt/sd0/BIN"
であれば、SDカードが指定されています。
SPI-flashにしたい場合は、"/mnt/spif/BIN" を指定してください。 この "/mnt/sd0/BIN" は、SDカードをPCで読み込んだ時の、ルートディレクトリの下の
BIN/
です。
このディレクトリを作成し、ここに必要なコーデックのDSPを置きます。MP3を再生(デコード)する場合は、
spresense/sdk/modules/audio/dsp/
の下のMP3DEC
を選択してください。 -
同時に、再生したい音楽ファイルをSDカードに書き込みます。 audio_player_main.cxx では、
PLAYBACK_FILE_PATH
で指定しています。#define PLAYBACK_FILE_PATH "/mnt/sd0/AUDIO"
このため、SDカードをPC上で読み込んだ時に、ルートディレクトリの下の
AUDIO/
以下に、 再生したいオーディオファイルを置いて下さい。サブディレクトリに置くこともできます。 -
現在のAudio Playerサンプルでは、簡易PlayListを利用した再生を行っています。 このため、playlistファイルの置き場所とファイル名を指定して再生します。
audio_player_main.cxx
では、PLAYLIST_FILE_PATH
でパスを指定、PLAYLIST_FILE_NAME
でファイル名を指定しています。#define PLAYLIST_FILE_PATH "/mnt/sd0/PLAYLIST" #define PLAYLIST_FILE_NAME "TRACK_DB.CSV"
このため、SDカードをPC上で読み込んだ時の、ルートディレクトリの下の
PLAYLIST/
以下に、TRACK_DB.CSV
というファイルを作成してください。TRACK_DB.CSV
の中身は、spresense/sdk/modules/audio/playlist/
の下のREADME.txt
を参照してください。
これらすべてを用意することで、音楽再生が行えます。
4.1.2. Audio Playerの動作確認
この nuttx.spk
を実機へロードするとAudio Playerのプログラムが実行されます。
Helloサンプルと同様に、シリアルターミナルを開きます。
minicom -D /dev/ttyUSB0 -b 115200 -s
builtinされている、 audio_player
アプリを実行すると、
というログが表示され、音声が再生されます。
エラーが発生した場合は、オーディオサブシステムのエラーについて を参照してください。
4.1.3. 付録: 独自の信号処理を行う
これまでのチュートリアルで、オーディオプレーヤーとして十分な機能を実現することができました。 ここからは、より高度な処理を行う方法を説明していきます。 |
AudioPlayerでは、再生する音声に対してユーザー独自の信号処理を行うことが出来ます。
これを行いたい場合にはコンフィグメニューで [Use Postprocess]
を有効にする必要があります。
-
Postprocessを有効にします
tools/cofig.py -m
[Use Postprocess]
にチェックを入れます。[Examples] [Audio player example] [Use Postprocess] <= Y
Postrocessの詳細についてはSDKデベロッパーガイドの Set preprocess を参照して下さい。 -
ビルドを行います。
make
全ての手順がうまくいけば、
POSTPROC
バイナリがspresense/examples/audio_player/worker/
の下に作成されます。
これをSDカードの/mnt/sd0/BIN
(PCから見るとBIN/
)フォルダに置いてください。本サンプルアプリケーションでは、 POSTPROC
には簡単なRCfilterがデフォルトで組み込まれています。
独自の信号処理などにカスタムをしたい場合には こちら を参考にして下さい。[Use Postprocess]
の有効、無効で音声ファイルを再生し違いを確認してみてください。
再生方法はこちら を参考にして下さい。
4.1.4. DSPバイナリ(POSTPROC)のカスタムについて
DSPバイナリ(POSTPROC)のカスタム方法について記載します。
4.1.4.1. Step1. POSTPROCのコード編集
POSTPROCのコード構成と編集箇所について説明します。
コードは、ユーザー編集すべき部分とフレームワークとして提供される部分の2つに分かれます。
ユーザーが編集するコード
ユーザーが主に編集すべきコードです。
これらのコードを編集してDSPで信号処理を記述することが出来ます。
worker
ディレクトリの中にDSPのコードがまとまっており、その中に userproc
ディレクトリがあります。
ユーザが信号処理などを書くのは userproc
ディレクトリ内のみで、その他は基本的に変更の必要はありません。
main.cpp
には、起動処理~MainCPUとのデータ通信制御が書かれていますので変更しないで下さい。
起動処理やDSP通信処理などが書かれています。編集の必要は有りません。
DSPとの通信コマンドを定義するヘッダファイルです。
必要なパラメータはこのファイルに記載します。
ユーザーコードのヘッダファイルです。
ユーザーコード本体です。
このファイルに信号処理などを書く、または呼び出します。
ユーザーコードに用意されるインタフェース
userproc.cpp
には、 Init
, Exec
, Flush
, Set
コマンドの枠組みが用意されており
ユーザーコードはそれぞれに対応する中身を書いていくことでDSP内での処理を実現することが出来ます。
ユーザーが記述すべき処理について説明します。
(※デフォルトではサンプルとしてRCフィルタが組み込まれています。)
コマンドによるDSP内部の状態遷移は下図の通り行われます。
各コマンドを使い以下のような流れで処理を行います。
-
AUDCMD_INIT_OUTPUTMIXERがコールされるとDSPが起動します。
-
Init
コマンドで必要なパラメータ(ch数やビット長など)を設定します。 -
再生開始するとキャプチャした音声データが
Exec
コマンドで定期的にDSPに送られるので所望のフィルタ処理をしてください。 -
任意のタイミングでDSP内部のパラメータなどを変更したい場合には、
Set
コマンドを送ることで実装することを想定しています。このコマンドの実行タイミングは、Exec
を含めた受信順になります。+ -
再生停止すると最後の音声データの
Exec
の後、Flush
コマンドが送られるので終端処理の必要がある場合はここで処理をします。
各機能で使用するデータ型は userproc_command.h
に書かれており、中身は自由に書き換えることが出来ます。
各コマンドのフォーマットは下図の様になっています。
先頭の白抜きの部分には最低限必要なパラメータが固定で配置されています。これらは変更しないで下さい。
ユーザーが userproc_command.h
で定義するパラメータは下図の User param
(ピンク色箇所)にあたる部分です。
各コマンドについて説明します。
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_INITMPP コマンドで実行されます。
(デフォルトでは何もしていません。)
void UserProc::exec(ExecParam *)
-
ExecParamに従い信号処理を書いて下さい。
再生を開始するとSDK内部から定期的に呼ばれます。
1フレームはLPCMの場合には640サンプル、MP3の場合には1152(ただし16kHz時は1728)サンプルです。
入力データアドレスからデータを取得し、信号処理を行い、出力データアドレスへ書き出して下さい。
(デフォルトではRCフィルタ処理が書かれています。)
void UserProc::flush(FlushParam *)
-
FlushParamに従いFlush(終端)処理を書いて下さい。
再生の停止時にSDK内部から一度だけ呼ばれます。
IIRやFIRフィルタのように遅延が発生する場合は、最終フレームの後にflush
を行い、遅延分の出力を行います。
出力すべきデータがある場合には、出力データアドレスへ書き出して下さい。
(デフォルトでは何もしていません。)
void UserProc::set(SetParam *)
-
SetParamに従い設定処理を書いてください。
アプリケーションコードからの AUDCMD_SETMPPPARAM コマンドで実行されます。
(デフォルトではRCフィルタの係数を設定しています。)
4.1.4.2. Step2. POSTPROC
バイナリのビルド
Configuration で User Postprocess
を有効にしていれば、本アプリケーションのビルド時に自動で POSTPROC
バイナリが作成されます。
作成されるパスは spresense/examples/audio_player/worker/
の下の POSTPROC
です。
これをSDカードの /mnt/sd0/BIN
(PCから見ると \BIN
)フォルダに置いてください。
4.2. Audio Recorder サンプルアプリケーション
Audio Recorderのサンプルアプリケーションの動作について説明します。
4.2.1. ビルド&ロード手順
ここではコマンドラインによるビルド手順を示します。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/audio_recorder
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py examples/audio_recorder make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
-
Audio Recorderの場合、エンコード処理を行うDSPバイナリのロードが必要です。 DSPバイナリの置き場所は、SDカードか、SPI-Flashのどちらかを選択できますが、 ここでは、SDカードからロードする方法を行います。
DSPバイナリのパスの指定は、アプリケーションコード内で指定します。
audio_recorder_main.cxx
では、DSPBIN_PATH
で設定していますので必要に応じてアプリケーションコードを変更して下さい。#define DSPBIN_PATH "/mnt/sd0/BIN"
であれば、SDカードが指定されています。
この
/mnt/sd0/BIN
は、SDカードをPCで読み込んだ時の、ルートディレクトリの下のBIN/
です。
このディレクトリを作成し、ここに必要なコーデックのDSPを置きます。SPI-flashにしたい場合は、 /mnt/spif/BIN
を指定してください。MP3で録音(エンコード)する場合は、
spresense/sdk/modules/audio/dsp/
の下のMP3ENC
を選択してください。その他のエンコードをする場合のCodec種別とDSPバイナリの組み合わせは下表の通りです。
Codec DSPバイナリ MP3
MP3ENC
LPCM
SRC
4.2.2. Audio Recorderの動作確認
この nuttx.spk
をSpresenseへロードするとAudio Recorderのプログラムが実行されます。
Helloサンプルと同様に、シリアルターミナルを開きます。
minicom -D /dev/ttyUSB0 -b 115200 -s
builtinされている、 audio_recorder
アプリを実行すると、
というログが表示され、音声が記録されます。
記録された音声はPCで再生することが出来ます。その際にはSDカードルートディレクトリの下の REC/
に音声ファイルがあります。
audio_recorder_main.cxx では、 RECFILE_ROOTPATH
で設定していますので必要に応じてアプリケーションコードを変更して下さい。
#define RECFILE_ROOTPATH "/mnt/sd0/REC"
であればSDカードのルートの下の REC/
に音声ファイルが作られます。
エラーが発生した場合は、オーディオサブシステムのエラーについて を参照してください。
4.2.3. 付録: 独自の信号処理を行う
これまでのチュートリアルで、レコーダーとして十分な機能を実現することができました。 ここからは、より高度な処理を行う方法を説明していきます。 |
AudioRecorderでは記録する音声に対してユーザー独自の信号処理を行うことが出来ます。
これを行いたい場合にはコンフィグメニューで [Use preprocess]
を有効にする必要があります。
-
Preprocessを有効にします
コンフィグメニューを開きます。
tools/cofig.py -m
[Use preprocess]
にチェックを入れます。[Examples] [Audio recorder example] [Use preprocess] <= Y
Preprocessの詳細についてはSDKデベロッパーガイドの Set preprocess を参照して下さい。 -
ビルドを行います。
make
全ての手順がうまくいけば、
PREPROC
バイナリがspresense/examples/audio_recorder/worker/
の下に作成されます。
これをSDカードの/mnt/sd0/BIN
(PCから見るとBIN/
)フォルダに置いてください。本サンプルアプリケーションでは、 PREPROC
には簡単なRCfilterがデフォルトで組み込まれています。
独自の信号処理などにカスタムをしたい場合には こちら を参考にして下さい。Preprocessの有効、無効で記録した音声ファイルを再生して、違いを確認してみてください。
記録、再生方法はこちら を参考にして下さい。== DSPバイナリ(PREPROC)のカスタムについて
DSPバイナリ(PREPROC)のカスタム方法について記載します。
4.2.3.1. Step1. PREPROCのコード編集
PREPROCのコード構成と編集箇所について説明します。
コードは、ユーザー編集すべき部分とフレームワークとして提供される部分の2つに分かれます。
ユーザーが編集するコード
ユーザーが主に編集すべきコードです。
これらのコードを編集してDSPで信号処理を記述することが出来ます。
worker
ディレクトリの中にDSPのコードがまとまっており、その中に userproc
ディレクトリがあります。
ユーザが信号処理などを書くのは userproc
ディレクトリ内のみで、その他は基本的に変更の必要はありません。
main.cpp
には、起動処理~MainCPUとのデータ通信制御が書かれていますので変更しないで下さい。
起動処理やDSP通信処理などが書かれています。編集の必要は有りません。
DSPとの通信コマンドを定義するヘッダファイルです。
必要なパラメータはこのファイルに記載します。
ユーザーコードのヘッダファイルです。
ユーザーコード本体です。
このファイルに信号処理などを書く、または呼び出します。
ユーザーコードに用意されるインタフェース
userproc.cpp
には、 Init
, Exec
, Flush
, Set
コマンドの枠組みが用意されており
ユーザーコードはそれぞれに対応する中身を書いていくことでDSP内での処理を実現することが出来ます。
ユーザーが記述すべき処理について説明します。
(※デフォルトではサンプルとしてRCフィルタが組み込まれています。)
コマンドによるDSP内部の状態遷移は下図の通り行われます。
各コマンドを使い以下のような流れで処理を行います。
-
AUDCMD_INIT_MICFRONTENDがコールされるとDSPが起動します。
-
Init
コマンドで必要なパラメータ(ch数やビット長など)を設定します。 -
記録開始するとキャプチャした音声データが
Exec
コマンドで定期的にDSPに送られるので所望のフィルタ処理をしてください。 -
任意のタイミングでDSP内部のパラメータなどを変更したい場合には、
Set
コマンドを送ることで実装することを想定しています。このコマンドの実行タイミングは、Exec
を含めた受信順になります。+ -
記録停止すると最後の音声データの
Exec
の後、Flush
コマンドが送られるので終端処理の必要がある場合はここで処理をします。
各機能で使用するデータ型は userproc_command.h
に書かれており、中身は自由に書き換えることが出来ます。
各コマンドのフォーマットは下図の様になっています。
先頭の白抜きの部分には最低限必要なパラメータが固定で配置されています。これらは変更しないで下さい。
ユーザーが userproc_command.h
で定義するパラメータは下図の User param
(ピンク色箇所)にあたる部分です。
各コマンドについて説明します。
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_INIT_PREPROCESS_DSP コマンドで実行されます。
(デフォルトでは何もしていません。)
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_SET_PREPROCESS_DSP コマンドで実行されます。
(デフォルトではRCフィルタの係数を設定しています。)
4.2.3.2. Step2. PREPROC
バイナリのビルド
Configuration で Preprocess
を有効にしていれば、本アプリケーションのビルド時に自動で PREPROC
バイナリが作成されます。
作成されるパスは spresense/examples/audio_recorder/worker/
の下の PREPROC
です。
これをSDカードの /mnt/sd0/BIN
(PCから見ると \BIN
)フォルダに置いてください。
4.3. Audio Recognizer サンプルアプリケーション
Audio Recognizer サンプルアプリケーションの動作について説明します。
4.3.1. ビルド&ロード手順
ここではコマンドラインによるビルド手順を示します。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/audio_recognizer
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py examples/audio_recognizer make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
-
Audio Recognizerの場合、音声認識処理を行うDSPバイナリのロードが必要です。 DSPバイナリの置き場所は、SDカードかSPI-Flashのどちらかを選択できますが、 ここでは、SDカードからロードする方法を行いますので、 "/mnt/sd0/BIN" に置きます。
この
/mnt/sd0/BIN
は、SDカードをPCで読み込んだ時の、ルートディレクトリの下のBIN/
です。
このディレクトリを作成し、ここに音声認識に必要なDSPを置きます。本サンプルアプリケーションでは、音声認識のDSPバイナリは、ユーザーカスタムのものを使用する設定となっており、バイナリは spresense/examples/audio_recognizer/worker_recognizer/
の下にRCGPROC
として生成されます。認識処理をカスタムする場合には、RecognizerPROCのカスタムについてを参照してください。
4.3.2. Audio Recognizerの動作確認
ビルドした nuttx.spk
を実機へロードするとAudio Recognizerのプログラムが実行されます。
Helloサンプルと同様に、シリアルターミナルを開きます。
minicom -D /dev/ttyUSB0 -b 115200 -s
builtinされている、 audio_recognizer
アプリを実行すると、
というログが表示され、音声認識が開始されます。
認識結果はアプリケーションコード( audio_recognizer_main.cpp
)中にあるコールバック関数で受け取っています。
受け取るパラメータの構成は音声認識用DSPで決めています。 RecognizerPROC を参照して下さい。
データはMemoryHandleで受信していますので、下記の様に、そのアドレスを参照することでデータを取得することが出来ます。
static void recognizer_find_callback(AsRecognitionInfo info)
{
/* Get Recognition result */
MyRecognizerResultFormat *result =
static_cast<MyRecognizerResultFormat *>(info.getVa())
/* Print result */
...
printf("Data size %d byte\n", info.size);
printf("Data1 : %x, Data2 : %x\n", result->data1, result->data2);
...
}
エラーが発生した場合は、オーディオサブシステムのエラーについて を参照してください。
4.3.3. 付録: 独自の信号処理を行う
これまでのチュートリアルで、Recognizerとして十分な機能を実現することができました。 ここからは、より高度な処理を行う方法を説明していきます。 |
キャプチャした音声はサンプリング周波数が48kHzまたは192kHz、ビット長が16bitまたは32bitです。
Audio Recognizerではこれに対して、認識ライブラリの入力フォーマットに合わせ前処理を行うことが出来ます。
これを行いたい場合にはコンフィグメニューで [Use preprocess]
を有効にする必要があります。
-
Preprocessを有効にします
コンフィグメニューを開きます。
tools/cofig.py -m
[Use preprocess]
にチェックを入れます。[Examples] [Audio recognizer example] [Use preprocess] <= Y
Preprocessの詳細についてはSDKデベロッパーガイドの Set preprocess を参照して下さい。 -
ビルドを行います。
make
全ての手順がうまくいけば、
PREPROC
バイナリがspresense/examples/audio_recognizer/worker_preprocess/
の下に作成されます。
これをSDカードの/mnt/sd0/BIN
(PCから見るとBIN/
)フォルダに置いてください。本サンプルアプリケーションでは、 PREPROC
には簡単なRCfilterがデフォルトで組み込まれています。
独自の信号処理などにカスタムをしたい場合には こちら を参考にして下さい。
4.3.4. DSPバイナリのカスタムについて
audio_recognizerサンプルではPre処理用(以下 PREPROC
)、認識処理用(以下 RCGPROC
)の2つのDSPバイナリを使用します。
それらのカスタム方法について説明します。
4.3.4.1. Step1. PREPROC, RCGPROCのコード編集
PREPROC
, RCGPROC
のコード構成と編集箇所について説明します。
コードは、ユーザー編集すべき部分とフレームワークとして提供される部分の2つに分かれます。
ユーザーが編集するコード
ユーザーが主に編集すべきコードです。
これらのコードを編集してDSPで信号処理や認識処理を記述することが出来ます。
PREPROC
は worker_preprocess
ディレクトリの中に、 RCGPROC
は worker_recognizer
の中にDSPのコードがまとまっており、それぞれその中に userproc
ディレクトリがあります。
ユーザが信号・認識処理などを書くのは userproc
ディレクトリ内のみで、その他は基本的に変更の必要はありません。
main.cpp
には、起動処理~MainCPU(Supervisor)とのデータ通信制御が書かれていますので変更しないで下さい。
起動処理やDSP通信処理などが書かれています。編集の必要は有りません。
Pre処理用DSPとの通信コマンドを定義するヘッダファイルです。
必要なパラメータはこのファイルに記載します。
Pre処理用DSPのユーザーコードのヘッダファイルです。
Pre処理用DSPのユーザーコード本体です。
このファイルに信号処理などを書く、または呼び出します。
認識用DSPとの通信コマンドを定義するヘッダファイルです。
必要なパラメータはこのファイルに記載します。
認識用DSPのユーザーコードのヘッダファイルです。
認識用DSPのユーザーコード本体です。
このファイルに認識処理を書く、または呼び出します。
ユーザーコードに用意されるインタフェース
Init
, Exec
, Flush
, Set
コマンドの枠組みが用意されており
ユーザーコードはそれぞれに対応する中身を書いていくことでDSP内での処理を実現することが出来ます。
ユーザーが記述すべき処理について説明します。
(※デフォルトではサンプルとして PREPROC
にはRCフィルタが組み込まれています。)
コマンドによるDSP内部の状態遷移は下図の通り行われます。
各コマンドを使い以下のような流れで処理を行います。
-
AUDCMD_INIT_RECOGNIZERがコールされると認識用DSPが起動します。
-
Init
コマンドで必要なパラメータ(ch数やビット長など)を設定します。 -
認識処理を開始するとキャプチャした音声データが
Exec
コマンドで定期的にDSPに送られるので所望の認識処理をしてください。 -
任意のタイミングでDSP内部のパラメータなどを変更したい場合には、
Set
コマンドを送ることで実装することを想定しています。このコマンドの実行タイミングは、Exec
を含めた受信順になります。+ -
認識処理を停止すると最後の音声データの
Exec
の後、Flush
コマンドが送られるので終端処理の必要がある場合はここで処理をします。
各機能で使用するデータ型は、 PREPROC
では userproc_command.h
に、 RCGPROC
では rcgproc_command.h
に書かれており、中身は自由に書き換えることが出来ます。
各コマンドのフォーマットは下図の様になっており、これは PREPROC
RCGPROC
で同じです。
先頭の白抜きの部分には最低限必要なパラメータが固定で配置されています。これらは変更しないで下さい。
ユーザーが userproc_command.h
で定義するパラメータは下図の User param
(ピンク色箇所)にあたる部分です。
notification
は Exec
コマンドの応答(認識結果)フラグで、0以外の指定でアプリケーションまで応答を戻します。
例えば、通常は応答を戻さず認識結果の変化点(認識無し→有りになった点)などでのみ応答したい場合などに使用出来ます。
各コマンドについて説明します。
struct InitRcgParam : public CustomprocCommand::CmdBase
-
Init処理用のパラメータです。
デフォルトではch数とビット幅が設定されています。必要なパラメータに変更してください。
struct ExecRcgParam : public CustomprocCommand::CmdBase
-
Exec処理用のパラメータです。
音声データのアドレス・サイズは上図のExecParam
にある様に継承元のCustomprocCommand::ExecParamBase
に定義されています。
詳細は/sdk/modules/include/audio/dsp_framework/customproc_command_base.h
を参照してください。
struct FlushRcgParam : public CustomprocCommand::CmdBase
-
Flush処理用のパラメータです。
音声データのアドレス・サイズは上図のFlushParam
にある様に継承元のCustomprocCommand::FlushParamBase
に定義されています。
詳細は/sdk/modules/include/audio/dsp_framework/customproc_command_base.h
を参照してください。
struct SetRcgParam : public CustomprocCommand::CmdBase
-
Set処理用のパラメータです。
様々な動的に変更したいパラメータを定義します。デフォルトでは認識処理のOn/Offを定義しています。
下記の関数群は rcgproc.cpp
に書かれています。中身は自由に書き換えることが出来ます。
それぞれのコマンド定義に従い処理を行います。
void RcgProc::init(InitRcgParam *)
-
InitRcgParamに従い初期化を行う処理を書いて下さい。
アプリケーションコードからの AUDCMD_INIT_RECOGNIZER_DSP コマンドで実行されます。
(デフォルトではCh数とビット幅の設定をしています。)
void RcgProc::exec(ExecRcgParam *)
-
ExecRcgParamに従い信号処理を書いて下さい。
認識処理を開始するとSDK内部から定期的に呼ばれます。
当サンプルアプリケーションでは1フレームは320サンプルです(アプリケーションで自由に変更できます)。
入力データアドレスからデータを取得し、認識処理を行い、結果を出力データアドレスへ書き出して下さい。
(デフォルトでは入力フレーム内サンプル値の最大・最少・平均値を出力しています。)
void RcgProc::flush(FlushRcgParam *)
-
FlushRcgParamに従いFlush(終端)処理を書いて下さい。
認識処理の停止時にSDK内部から一度だけ呼ばれます。
認識処理にフレーム遅延が発生する場合は、最終フレームの後にflush
を行い遅延分の出力を行います。
出力すべきデータがある場合には、出力データアドレスへ書き出して下さい。
(デフォルトでは何もしていません。)
void RcgProc::set(SetRcgParam *)
-
SetRcgParamに従い設定処理を書いてください。
アプリケーションコードからの AUDCMD_SET_RECOGNIZER_DSP コマンドで実行されます。
(デフォルトでは認識処理のOn/Offを設定しています。)
4.3.4.2. Step2. PREPROC
, RCGPROC
バイナリのビルド
本アプリケーションのビルド時に自動で RCGPROC
バイナリが作成されます。
また、 Configuration で Preprocess
を有効にしていれば PREPROC
バイナリも作成されます。
作成されるパスは worker_recognizer/
の下に RCGPROC
、 worker_preprocess/
の下に PREPROC
です。
これをSDカードの /mnt/sd0/BIN
(PCから見ると \BIN
)フォルダに置いてください。
5. LTE チュートリアル
5.1. LTE HTTP GET サンプルアプリケーション
5.1.1. 概要
本サンプルプログラムは、LTE通信機能を用いて、HTTP GETを行うサンプルです。
5.1.1.1. 動作環境
-
Spresense メインボード
-
Spresense LTE拡張ボード
-
SIM カード
-
microSD カード
接続方法は、SpresenseメインボードとSpresense LTE拡張ボードの接続方法を参照してください。
本スケッチではネットワークに接続するため、SIM カードが必要です。
LTE-M 動作確認SIM Listをご確認ください。
5.1.2. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/lte_http_get
を指定してコンフィグレーションを実行します。tools/config.py examples/lte_http_get
サンプルアプリケーションのコンフィグレーションを変更します。
tools/config.py -m
-
APNのパラメータを設定します。(ご使用のSIMに合わせて設定してください。)
Examples -> HTTP GET method using LTE example -> Access Point Name (CONFIG_EXAMPLES_LTE_HTTP_GET_APN_NAME) Examples -> HTTP GET method using LTE example -> IP type Selection Examples -> HTTP GET method using LTE example -> Authentication type Selection Examples -> HTTP GET method using LTE example -> Username used for authentication (CONFIG_EXAMPLES_LTE_HTTP_GET_APN_USERNAME) Examples -> HTTP GET method using LTE example -> Password used for authentication (CONFIG_EXAMPLES_LTE_HTTP_GET_APN_PASSWD)
コンフィグレーション名 説明 Access Point Name
アクセスポイント名
IP type Selection
APNプロトコル。
IPv4
、IPv6
、IPv4/v6
から選択します。Authentication type Selection
認証タイプ。
None
、PAP
、CHAP
から選択します。Username used for authentication
ユーザ名。 認証タイプに
None
を選択した場合、設定は無視されます。Password used for authentication
パスワード。 認証タイプに
None
を選択した場合、設定は無視されます。 -
HTTPSの設定します。(必要に応じて設定してください。)
モデムのTLSプロトコルはサポートしておりません。
Externals -> mbed TLS Library (CONFIG_EXTERNALS_MBEDTLS)
System tools -> Network Utilities -> Directory path for TLS certification files (CONFIG_NETUTILS_WEBCLIENT_TLS_CERTS_PATH)
HTTPSで使用するサーバのルート証明書を格納するディレクトリを指定します。
デフォルトの設定では/mnt/spif/CERTSとなっています。ルート証明書の取得方法についてはルート証明書のエクスポート手順を参考にしてください。
SPI-Flashへのファイル転送方法はZmodem を使ったファイル転送を参照してください。
ディレクトリのパスを
/mnt/sd0/CERTS
にすると microSD カードに変更することができます。
microSD カードに変更した場合はCONFIG_CXD56_SDIO
のコンフィグレーションを有効にする必要があります。ビルドに成功すると
sdk
フォルダ直下にnuttx.spk
ファイルが生成されます。make
-
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
5.1.3. 動作確認
シリアルターミナルを開いて、lte_http_get
コマンドを実行します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
lte_http_get
コマンドを実行します。lte_http_get コマンドの使い方を以下に示します。
nsh> lte_http_get <url>
- url
-
インターネット上に置かれているファイルのURLを指定します。
http://
もしくはhttps://
から始まる必要があります。urlを指定しない場合、http://example.com/index.html
となります。https://
のURLを指定する場合、事前にHTTPSの設定を行ってください。サーバのルート証明書をコンフィグレーションで記述したディレクトリに格納する必要があります。
本サンプルアプリケーションはurlに指定されたファイルをダウンロードしシリアルターミナルに出力します。
lte_http_get
コマンドを実行した例を以下に示します。
nsh> lte_http_get app_restart_cb called. reason:Modem restart by application. pdn.session_id : 1 pdn.active : 1 pdn.apn_type : 0x202 pdn.ipaddr[0].addr : 10.212.60.255 app_localtime_report_cb called: localtime : "19/12/06 : 18:24:33" set localtime completed: 2019/12/06,18:24:33 <!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { div { margin: 0 auto; width: auto; } } </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html> nsh>
本サンプルアプリケーションの、wget
を wget_post
に変更することによりHTTPのPOSTメソッドが使用できます。
以下の例を参考に wget_post
の第2引数にPOSTするデータを設定してください。
wget_post(url, "Hello spresense world!!" ,g_app_iobuffer, APP_IOBUFFER_LEN, app_wget_cb, NULL);
また、本サンプルアプリケーションはダウンロードしたファイルをシリアルターミナルに出力しますが、
以下の様に app_wget_cb()
関数を一部変更することにより、ファイルに保存することができます。
static void app_wget_cb(FAR char **buffer, int offset, int datend,
FAR int *buflen, FAR void *arg)
{
int fd;
fd = open("/mnt/spif/index.html", (O_WRONLY | O_APPEND));
if ((fd < 0) && (errno == ENOENT))
{
fd = open("/mnt/spif/index.html", (O_CREAT | O_WRONLY), 0666);
}
/* Write HTTP data to local file */
(void)write(fd, &((*buffer)[offset]), datend - offset);
close(fd);
}
上記の例では、 |
5.2. LTE TLS サンプルアプリケーション
5.2.1. 概要
本サンプルプログラムは、LTE通信機能を用いて、TLSプロトコルでサーバに接続し、HTTP POSTを行うサンプルです。
5.2.1.1. 動作環境
-
Spresense メインボード
-
Spresense LTE拡張ボード
-
SIM カード
-
microSD カード
接続方法は、SpresenseメインボードとSpresense LTE拡張ボードの接続方法を参照してください。
本スケッチではネットワークに接続するため、SIM カードが必要です。
LTE-M 動作確認SIM Listをご確認ください。
5.2.2. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/lte_tls
を指定してコンフィグレーションを実行します。tools/config.py examples/lte_tls
サンプルアプリケーションのコンフィグレーションを変更します。
tools/config.py -m
-
APNのパラメータを設定します。(ご使用のSIMに合わせて設定してください。)
Examples -> TLS data communication over LTE network example -> Access Point Name (CONFIG_EXAMPLES_LTE_TLS_APN_NAME) Examples -> TLS data communication over LTE network example -> IP type Selection Examples -> TLS data communication over LTE network example -> Authentication type Selection Examples -> TLS data communication over LTE network example -> Username used for authentication (CONFIG_EXAMPLES_LTE_TLS_APN_USERNAME) Examples -> TLS data communication over LTE network example -> Password used for authentication (CONFIG_EXAMPLES_LTE_TLS_PASSWD)
コンフィグレーション名 説明 Access Point Name
アクセスポイント名
IP type Selection
APNプロトコル。
IPv4
、IPv6
、IPv4/v6
から選択します。Authentication type Selection
認証タイプ。
None
、PAP
、CHAP
から選択します。Username used for authentication
ユーザ名。 認証タイプに
None
を選択した場合、設定は無視されます。Password used for authentication
パスワード。 認証タイプに
None
を選択した場合、設定は無視されます。 -
HTTPSの設定をします。
モデムのTLSプロトコルを使用することが可能です。
使用する場合は、 モデムのTLSプロトコルを使用する を参照してください。Examples -> TLS data communication over LTE network example -> Directory for server certification files (CONFIG_EXAMPLES_LTE_TLS_CERTS_PATH)
HTTPSで使用するサーバのルート証明書を格納するディレクトリを指定します。
デフォルトの設定では/mnt/sd0/CERTSとなっています。ディレクトリのパスを
/mnt/spif/CERTS
にするとSPI-Flashに変更することができます。ビルドに成功すると
sdk
フォルダ直下にnuttx.spk
ファイルが生成されます。make
-
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
5.2.3. 動作確認
シリアルターミナルを開いて、lte_tls
コマンドを実行します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
lte_tls
コマンドを実行します。lte_tls コマンドの使い方を以下に示します。
nsh> lte_tls <url>
- url
-
インターネット上に置かれているファイルのURLを指定します。
https://
から始まる必要があります。urlを指定しない場合、https://example.com/post
となります。事前にサーバのルート証明書をコンフィグレーションで記述したディレクトリに格納する必要があります。
本サンプルアプリケーションはHTTPのPOSTメソッドを使用して指定されたurlに任意のデータを送信します。
lte_tls
コマンドを実行した例を以下に示します。正常にデータを送信できた場合は "HTTP status code = 200" が出力されます。
nsh> lte_tls https://httpbin.org/post app_restart_cb called. reason:Modem restart by application. app_radio_on_cb called. result: 0 app_activate_pdn_cb called. result: 0 pdn.session_id : 1 pdn.active : 1 pdn.apn_type : 0x202 pdn.ipaddr[0].addr : 10.212.60.255 app_localtime_report_cb called: localtime : "19/12/10 : 17:26:18" set localtime completed: 2019/12/10,17:26:18 HTTP status code = 200 app_deactivate_pdn_cb called. result: 0 app_radio_off_cb called. result: 0 nsh>
本サンプルアプリケーションでは、 create_http_post()
の関数でPOSTするデータを作成しています。
static int create_http_post(const char *host,
const char *path,
char *buffer,
size_t buffer_size)
{
const char *post_data = "Spresense!";
const char http_post_request[] = "POST %s HTTP/1.1\r\n"
"HOST: %s\r\n"
"Connection: close\r\n"
"Content-Length: %d\r\n"
"\r\n"
"%s";
return snprintf(buffer, buffer_size,
http_post_request,
path,
host,
strlen(post_data),
post_data);
}
5.3. LTE MQTT サンプルアプリケーション
5.3.1. 概要
本サンプルプログラムは、LTE通信機能を用いて、MQTTブローカに接続し、指定したトピック名に対してサブスクライブするサンプルです。
5.3.1.1. 動作環境
-
Spresense メインボード
-
Spresense LTE拡張ボード
-
SIM カード
接続方法は、SpresenseメインボードとSpresense LTE拡張ボードの接続方法を参照してください。
本スケッチではネットワークに接続するため、SIM カードが必要です。
LTE-M 動作確認SIM Listをご確認ください。
5.3.2. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/lte_mqtt
を指定してコンフィグレーションを実行します。tools/config.py examples/lte_mqtt
サンプルアプリケーションのコンフィグレーションを変更します。
tools/config.py -m
-
APNのパラメータを設定します。(ご使用のSIMに合わせて設定してください。)
Examples -> MQTT using LTE example -> Access Point Name (CONFIG_EXAMPLES_LTE_MQTT_APN_NAME) Examples -> MQTT using LTE example -> IP type (CONFIG_EXAMPLES_LTE_MQTT_APN_IPTYPE) Examples -> MQTT using LTE example -> Authentication type (CONFIG_EXAMPLES_LTE_MQTT_APN_AUTHTYPE) Examples -> MQTT using LTE example -> Username used for authentication (CONFIG_EXAMPLES_LTE_MQTT_APN_USERNAME) Examples -> MQTT using LTE example -> Password used for authentication (CONFIG_EXAMPLES_LTE_MQTT_APN_PASSWD)
コンフィグレーション名 説明 Access Point Name
アクセスポイント名
IP type
APNプロトコル。0~2の値を設定します。0:
IPv4
, 1:IPv6
2:IPv4/v6
から選択します。Authentication type
認証タイプ。0~2の値を設定します。 0:
None
、1:PAP
、2:CHAP
から選択します。Username used for authentication
ユーザ名。 認証タイプに
None
を選択した場合、設定は無視されます。Password used for authentication
パスワード。 認証タイプに
None
を選択した場合、設定は無視されます。ビルドに成功すると
sdk
フォルダ直下にnuttx.spk
ファイルが生成されます。make
-
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
5.3.3. 動作確認
シリアルターミナルを開いて、lte_mqtt
コマンドを実行します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
lte_mqtt
コマンドを実行します。lte_mqtt コマンドの使い方を以下に示します。
nsh> lte_mqtt topicname <options>
- topicname
-
サブスクライブするトピック名
- options
オプション 説明 --host
MQTTブローカのホスト名。デフォルトは
localhost
です。--port
接続先ポート番号。デフォルトは
1883
です。--qos
QOS。0~2の値を指定します。デフォルトは
2
です。--delimiter
区切り文字。 デフォルトは
\n
です。--clientid
クライアントID。 デフォルトは
stdout_subscriber
です。--username
ユーザ名。 デフォルトは 未設定 です。
--password
パスワード。 デフォルトは 未設定 です。
--showtopics
トピック名の表示有無。
on
またはoff
を指定します。デフォルトはoff
です。Spresenseでは
localhost
をサポートしていません。必ず--host
でホスト名を指定してください。
本サンプルアプリケーションはMQTTブローカに接続し、指定したトピック名に対してサブスクライブします。
サブスクライブ完了後、シリアルポートにパブリッシュされたメッセージを表示します。
当該トピック名に対してメッセージをパブリッシュするためには、別途操作が必要です。このアプリケーションでは操作できません。操作の例は後述します。 |
lte_mqtt
コマンドを実行した例を以下に示します。正常にサブスクライブが完了した場合は "Subscribed 0" が出力されます。
nsh> lte_mqtt /test --host test.mosquitto.org --clientid test app_restart_cb called. reason:Modem restart by application. app_radio_on_cb called. result: 0 app_activate_pdn_cb called. result: 0 pdn.session_id : 1 pdn.active : 1 pdn.apn_type : 0x202 pdn.ipaddr[0].addr : 10.212.60.255 app_localtime_report_cb called: localtime : "19/12/11 : 11:36:39" set localtime completed: 2019/12/11,11:36:39 Connecting to test.mosquitto.org 1883 Connected 0 Subscribing to /test Subscribed 0
サブスクライブしているトピック名に対してパブリッシュします。
ここではUbuntu 16.04で mosquitto_pub
コマンドを実行してパブリッシュする例を示します。
-
以下のコマンドを実行し
mosquitto-clients
をインストールします。
sudo apt-get install mosquitto-clients
-
mosquitto_pub
コマンドを実行してメッセージをパブリッシュします。
mosquitto_pub -t /test -m "Hello Spresense world" -h test.mosquitto.org
-
パブリッシュに成功するとシリアルポートに以下のメッセージが出力されます。
Hello Spresense world
5.4. LTE AWS-IoT サンプルアプリケーション
5.4.2. 動作環境
-
Spresense メインボード
-
Spresense LTE拡張ボード
-
SIM カード
-
microSD カード
-
AWS-IoT Core
接続方法は、SpresenseメインボードとSpresense LTE拡張ボードの接続方法を参照してください。
本スケッチではネットワークに接続するため、SIM カードが必要です。
LTE-M 動作確認SIM Listをご確認ください。
また、AWS-IoTを利用するには、AWS-IoTの使用開始および、AWS-IoTへのデバイスの登録が必要です。
開始手順については AWS IoT の使用開始 を参考にしてください。
デバイスの登録については、 Registry でデバイスを登録する の手順で登録し、発行した証明書をダウンロードします。ダウンロードするファイルは以下の3つです。
-
ルート証明書:Amazon_Root_CA_1.pem
-
クライアント証明書:c3c4ff2375.cert.pem
-
秘密鍵:c3c4ff2375.private.key
ダウンロードしたファイルは使用するmicroSD カードにCERTSディレクトリを生成して格納します。
ファイル名は上記リンク先に表示されている例で記載しています。環境によって異なるため適宜読み替えてください。 |
5.4.3. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
examples/lte_awsiot device/sdcard
を指定してコンフィグレーションを実行します。tools/config.py examples/lte_awsiot device/sdcard
サンプルアプリケーションのコンフィグレーションを変更します。
tools/config.py -m
-
APNのパラメータを設定します。(ご使用のSIMに合わせて設定してください。)
Examples -> AWS IoT using LTE example -> Access Point Name (CONFIG_EXAMPLES_LTE_AWSIOT_APN_NAME) Examples -> AWS IoT using LTE example -> IP type (CONFIG_EXAMPLES_LTE_AWSIOT_APN_IPTYPE) Examples -> AWS IoT using LTE example -> Authentication type (CONFIG_EXAMPLES_LTE_AWSIOT_APN_AUTHTYPE) Examples -> AWS IoT using LTE example -> Username used for authentication (CONFIG_EXAMPLES_LTE_AWSIOT_APN_USERNAME) Examples -> AWS IoT using LTE example -> Password used for authentication (CONFIG_EXAMPLES_LTE_AWSIOT_APN_PASSWD)
コンフィグレーション名 説明 Access Point Name
アクセスポイント名
IP type
APNプロトコル。0~2の値を設定します。0:
IPv4
, 1:IPv6
2:IPv4/v6
から選択します。Authentication type
認証タイプ。0~2の値を設定します。 0:
None
、1:PAP
、2:CHAP
から選択します。Username used for authentication
ユーザ名。 認証タイプに
None
を選択した場合、設定は無視されます。Password used for authentication
パスワード。 認証タイプに
None
を選択した場合、設定は無視されます。 -
AWS-IoTを利用するためのパラメータを設定します。(ご使用の環境にあわせて設定してください。)
Examples -> AWS IoT using LTE example -> AWS IoT server host name (CONFIG_EXAMPLES_LTE_AWSIOT_HOST) Examples -> AWS IoT using LTE example -> AWS IoT server port number (CONFIG_EXAMPLES_LTE_AWSIOT_PORT) Examples -> AWS IoT using LTE example -> AWS IoT cert folder (CONFIG_EXAMPLES_LTE_AWSIOT_CERT)
コンフィグレーション名 説明 AWS IoT server host name
MQTTブローカー名。ご使用のAWS-IoT環境のエンドポイントを設定します。
AWS IoT server port number
MQTTブローカーのポート番号。デフォルト値8883。AWS-IoTはデフォルト値で接続可能です。
AWS IoT cert folder
AWS-IOTと接続する際に必要な認証用ファイルの置き場所を設定します。デフォルト値は"/mnt/sd0/CERTS"です。
-
aws_iot_config.h を編集します。
../examples/lte_awsiot/aws_iot_config.hの以下のデファインを設定します。
デファイン名 デフォルト値 説明 AWS_IOT_MQTT_CLIENT_ID
"c-sdk-client-id"
MQTTのクライアントID。デバイス毎にユニークである必要があります。
AWS_IOT_MY_THING_NAME
"AWS-IoT-C-SDK"
モノの名前。
AWS_IOT_ROOT_CA_FILENAME
"rootCA.crt"
ルート証明書のファイル名。AWS-IoTサイトからダウンロードしたファイルを指定します。
AWS_IOT_CERTIFICATE_FILENAME
"cert.pem"
クライアント証明書のファイル名。AWS-IoTサイトからダウンロードしたファイルを指定します。
AWS_IOT_PRIVATE_KEY_FILENAME
"privkey.pem"
クライアント認証で用いる秘密鍵のファイル名。AWS-IoTサイトからダウンロードしたファイルを指定します。
ビルドに成功すると
sdk
フォルダ直下にnuttx.spk
ファイルが生成されます。make
-
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
5.4.4. 動作確認
シリアルターミナルを開いて、lte_awsiot
コマンドを実行します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
NuttShell から
lte_awsiot
コマンドを実行します。lte_awsiot コマンドの使い方を以下に示します。
nsh> lte_awsiot <options>
- options
オプション 説明 -x
パブリッシュの繰り返し回数。デフォルト値は無限回です。
本サンプルアプリケーションはAWS-IoTにMQTTで接続し、"sdkTest/sub"トピックにサブクライブします。
サブスクライブ完了後、"sdkTest/sub"トピックにパブリッシュします。
lte_awsiot
コマンドを実行した例を以下に示します。
nsh> lte_awsiot -x 1 app_restart_cb called. reason:Modem restart by application. app_radio_on_cb called. result: 0 app_activate_pdn_cb called. result: 0 pdn.session_id : 1 pdn.active : 1 pdn.apn_type : 0x202 pdn.ipaddr[0].addr : 10.212.60.255 app_localtime_report_cb called: localtime : "19/12/13 : 14:15:16" set localtime completed: 2019/12/13,14:15:16 app_deactivate_pdn_cb called. result: 0 app_radio_off_cb called. result: 0
送信したパブリッシュメッセージはAWS-IoTコンソール上で確認できます。
動作環境によっては通信状態が不安定になり、正しく動作しないことがあります。 |
6. System tools 一覧
Spresense SDKでは、NuttShell から 各種 System tools を利用することができます。
カテゴリ | System tool名 | 説明 |
---|---|---|
LOG |
ログレベルを動的に変更します。 |
|
BackupSRAMに保存されたロギング情報をダンプします。 |
||
BackupSRAMに保存されたロギング情報をSPI-Flashに保存します。 |
||
GPIO |
Pin情報を取得/設定します。 |
|
GPIO割り込みを確認するためのテストコマンドです。 |
||
I2C |
I2Cデバイスとの通信を確認するためのユーティリティツールです。 |
|
PMIC |
PMIC(PowerManagement IC)を制御するためのユーティリティツールです。 |
|
USB |
||
Zmodem |
||
Stack |
Stack使用量をモニタするためのツールです。 |
7. USB MSC 機能を使う
USB MSC (Mass Storage Class) 機能を使うためのユーティリティコマンドについて説明します。
USB MSC 機能を有効にするとホスト PC からSpresense ボード上の SD カードへ直接アクセスすることができます。
7.1. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
SD カードを USB MSC としてマウントするので SD カード機能を有効化した状態で menuconfig を開きます。
./tools/config.py device/sdcard -m
System tools > USB Mass Storage Device Commands を有効にして、コンフィグレーションを終了します。
make
ビルドに成功すると
sdk
フォルダ直下にnuttx.spk
ファイルが生成されます。 -
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
7.2. 動作確認
拡張ボードに SD カードが挿入されている状態で、拡張ボードの USB 端子とホスト PC とを USB ケーブルで接続します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
USB MSC 機能を開始する場合、NuttShell から
msconn
コマンドを実行します。nsh> msconn mcsonn_main: Creating block drivers mcsonn_main: Configuring with NLUNS=1 mcsonn_main: handle=d038d50 mcsonn_main: Bind LUN=0 to /dev/mmcsd0 mcsonn_main: Connected
ホスト PC に新たなリムーバブルディスクが認識され、 ホスト PC から拡張ボードの SD カードの内容にアクセスすることができます。
-
USB MSC 機能を終了する場合、NuttShell から
msdis
コマンドを実行します。nsh> msdis msdis: Disconnected
8. USB CDC/ACM 機能を使う
USB CDC/ACM 機能を使うためのユーティリティコマンドについて説明します。
USB CDC/ACM 機能を有効にすると拡張ボードの USB をシリアルポートとして使用することができます。
8.1. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
menuconfig を開きます。
./tools/config.py -m
System tools > USB CDC/ACM Device Commands を有効にして、コンフィグレーションを終了します。
make
ビルドに成功すると
sdk
フォルダ直下にnuttx.spk
ファイルが生成されます。 -
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
8.2. 動作確認
拡張ボードの USB 端子とホスト PC とを USB ケーブルで接続します。
-
シリアルターミナルを起動します。
シリアルポートに
/dev/ttyUSB0
を、baudrate に115200
bps を指定して、 minicom ターミナルを使用する例を示します。minicom -D /dev/ttyUSB0 -b 115200
-
USB CDC/ACM 機能を開始する場合、NuttShell から
sercon
コマンドを実行します。nsh> sercon sercon: Registering CDC/ACM serial driver sercon: Successfully registered the CDC/ACM serial driver
Spresense ボード上に
/dev/ttyACM0
が追加され、ホスト PC には新たな COM ポートが見つかります。 そのポートを使って、USB 経由でシリアル通信をすることができるようになります。 -
USB CDC/ACM 機能を終了する場合、NuttShell から
serdis
コマンドを実行します。nsh> serdis serdis: Disconnected
9. Zmodem を使ったファイル転送
この章では、Zmodem 転送を利用して HostPC と Spresense ボードとの間でファイルを送受信する方法について示します。
9.1. ビルド手順
ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。
-
sdk
ディレクトリへ移動します。build-env.sh
スクリプトを読み込むことで、config.py
ツールの Tab 補完機能が有効になります。cd spresense/sdk source tools/build-env.sh
-
Kernel のコンフィグレーションとビルドを行います。
この例では Kernel configuration は release-defconfig を選択しています。
Kernel を既にビルド済みの場合は、この作業を省略することができます。tools/config.py --kernel release make buildkernel
-
SDK のコンフィグレーションとビルドを行います。
引数に
feature/zmodem
を指定してコンフィグレーションを実行します。
ビルドに成功するとsdk
フォルダ直下にnuttx.spk
ファイルが生成されます。tools/config.py feature/zmodem make
-
nuttx.spk
を Spresense ボードへ書き込みます。この例では シリアルポートとして
/dev/ttyUSB0
を、書き込み速度の baudrate に500000
bps を設定しています。お使いの環境に合わせて変更してください。tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
9.2. 動作手順
Zmodem 転送機能に対応したシリアルターミナルを使用してください。
ここでは、minicom を例にとって説明します。
minicom や lrzsz がインストールされていない場合は事前にインストールしてください。
sudo apt install minicom lrzsz
minicom を起動します。
minicom -D /dev/ttyUSB0 -b 115200
NuttShell から Zmodem の rz (受信), sz (送信) コマンドを使用することができます。
- rz コマンドの使い方
-
- sz コマンドの使い方
-
9.2.1. HostPC から Spresense ボードへのファイル転送
HostPC から Spresense ボードへファイルを転送する手順を以下に示します。
-
minicom 上で
CTRL-a
を押下した後にz
キーを押してメニューを開きます。(このショートカットキーの割り当てはユーザー側で変更可能です。詳細は minicom のマニュアルを参照してください。)
続けてs
キーを押して Send files (ファイル送信) を選択します。 -
カーソルキーで zmodem を選択して
Enter
キーで実行します。 -
カーソルキーとスペースキーでフォルダを移動をして転送したいファイルを選択します。
カーソルキーでフォルダを選びスペースキーを2回押すとフォルダへ移動できます。
カーソルキーでファイルを選びスペースキーで選択した後にEnter
キーを押すと転送を開始します。もしくは、
Enter
キーを押してファイル名を入力して転送を実行することもできます。 -
ファイル転送が始まり、Transfer complete と表示されれば転送完了です。
-
Spresense ボード上のファイルの転送先は、CONFIG_SYSTEM_ZMODEM_MOUNTPOINT で変更することができます。
デフォルトのコンフィギュレーションでは、Flash 上の/mnt/spif
以下にファイルが転送されます。
TeraTerm を使用する場合は、TeraTerm メニューから ファイル → 転送 → ZMODEM → 送信 から選択したファイルを送信することができます。
|
9.2.2. Spresense ボードから HostPC へのファイル転送
Spresense ボードから HostPC へファイルを転送する手順を以下に示します。
-
NuttShell 上で、
sz
コマンドの引数に転送したいファイルを指定して実行します。
ファイル名は / から始まるフルパス名を入力してください。
以下の例は、-x 1
バイナリ転送オプションを付けています。nsh> sz -x 1 /mnt/spif/test00.dat
-
ファイル転送が始まり、Transfer complete と表示されれば転送完了です。
-
HostPC 上の minicom を実行したフォルダにファイルが転送されます。
TeraTerm を使用する場合は、NuttShell から sz コマンドを入力した後に、ファイル → 転送 → ZMODEM → 受信 によりファイルを受信することができます。HostPC 側のファイル受信ディレクトリは、ファイル → ディレクトリを変更 によって指定可能です。
|
10. アプリケーションの自動起動方法
この章では、電源投入時に NuttShell プロンプトではなくユーザーアプリケーションを自動的に起動する方法について記述します。
10.1. スタートアップスクリプト
スタートアップスクリプトを用意することで、システムが起動する際にそのスクリプトにしたがった動作を行います。
この機能を利用して、電源投入時に自動的に任意のユーザーアプリケーションを実行させることができます。
スタートアップスクリプトには、ユーザーアプリケーションを含む NuttShell コマンドや簡単な if, while といった制御構文を記述することができます。
詳細は、NuttShell (NSH) documentation を参照してください。
10.1.1. スタートアップスクリプトの使い方
ここでは例として、examples/hello アプリケーションを自動起動するように設定してみます。
(NuttX Kernel のコンフィギュレーション及びビルドに関する説明は省略しています。)
-
hello アプリケーションを有効にして、menuconfig コンフィギュレーションメニューを開きます。
./tools/config.py -m examples/hello
-
Support ROMFS start-up script
を有効にします。System tools --> NSH Library ---> Scripting Support
-
ROMFS header location
としてCustom ROMFS header path
を選択し、
Custom ROMFS header file path
には../../nsh_romfsimg.h
と記述してコンフィギュレーションを保存終了します。nsh_romfsimg.h
の場所を sdk/system/nshlib ディレクトリからの相対パスで指定してください。 -
続いて、sdk ディレクトリ直下に
rcS.template
というファイル名のスタートアップスクリプトを作成します。
ここでは例として、以下のようにecho
コマンドとhello
コマンドを記述しています。cat spresense/sdk/rcS.template echo Start-up hello application hello
-
mkromfsimg.sh ツールを使用して、
rcS.template
からnsh_romfsimg.h
を生成します。cd spresense/sdk ./tools/mkromfsimg.sh . ls nsh_romfsimg.h nsh_romfsimg.h
-
いつもの手順でビルドしたバイナリを Spresense ボードに書き込んでください。
make tools/flash.sh -c /dev/ttyUSB0 nuttx.spk
-
電源を投入すると NuttShell が表示される前にスクリプトに記述した hello アプリケーションが起動されていることが確認できます。
10.1.2. スクリプト配置場所の変更
rcS.template
の置き場所を変更する場合は以下を参考にしてください。
-
例として spresense/examples/hello 以下に
rcS.template
を配置します。cat spresense/examples/hello/rcS.template echo Start-up hello application hello
-
rcS.template
が置かれているディレクトリで mkromfsimg.sh ツールを使用してnsh_romfsimg.h
を生成します。cd spresense/examples/hello ../../sdk/tools/mkromfsimg.sh ../../sdk ls nsh_romfsimg.h nsh_romfsimg.h
-
コンフィギュレーションメニューを開き、
Custom ROMFS header file path
には../../../examples/hello/nsh_romfsimg.h
と記載します。nsh_romfsimg.h
の場所を sdk/system/nshlib ディレクトリからの相対パスで指定します。 -
あとのビルド手順はさきほどと同様です。
10.2. SDK エントリーポイント
スタートアップスクリプトとは別に CONFIG_SDK_USER_ENTRYPOINT を変更するという方法もあります。
デフォルトのコンフィギュレーションでは、CONFIG_SDK_USER_ENTRYPOINT=nsh_main となっています。
これを例えば hello_main に変更すると、起動時に hello アプリケーションを起動するように変更できます。
起動時にアプリケーションの初期化処理が必要です。以下を参考に、#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;
}