Developer World Spresense
English 中文
目次

1. Examples 一覧

Spresense SDKでは、NuttShell の Built-in コマンドとして各種 Example を用意しています。

初めてビルドする方は、はじめにスタートガイドを参照してください。 コンフィグレーションの方法や、ビルドしたプログラムを実行する手順についての詳しい説明があります。

カテゴリ Example名 説明

Hello

hello

C言語による"Hello, World"を出力するサンプルです。

helloxx

C++言語による"Hello, World"を出力するサンプルです。

Peripheral
Driver

alarm

RTC(リアルタイムクロック)によるアラーム機能を使用したサンプルです。

watchdog

WDTウォッチドッグタイマーを使用したサンプルです。

adc

A/Dコンバータを使用してアナログ入力値を表示するサンプルです。

pwm

PWM出力を行うサンプルです。

GPS (GNSS)

gnss

GNSS機能を用いて位置情報を取得するサンプルです。

geofence

GNSS Geofence機能を使用したサンプルです。

gnss_atcmd

GNSS ATコマンドを使用したサンプルです。ターミナル上にNMEAセンテンスを表示します。

gnss_factory

GNSS 評価用のサンプルです。

gnss_pvtlog

GNSS PVTログを出力するサンプルです。

Audio

audio_player

オーディオプレーヤーのサンプルです。

audio_recorder

オーディオレコーダーのサンプルです。

audio_through

オーディオのパススルー機能を用いて、マイク入力、スピーカ出力、I2S入出力を使用したサンプルです。

audio_pcm_capture

PCMデータをキャプチャするサンプルです。

audio_recognizer

音声認識フレームワークのサンプルです。

audio_beep

オーディオビープ音を再生するサンプルです。

audio_dual_players

オーディオのデュアルデコード再生のサンプルです。

audio_player_objif

オブジェクトインターフェース層を用いたオーディオプレーヤーのサンプルです。

audio_recorder_objif

オブジェクトインターフェース層を用いたオーディオレコーダーのサンプルです。

audio_pcm_capture_objif

オブジェクトインターフェース層を用いたPCMキャプチャのサンプルです。

audio_sound_effector

低遅延で音声エフェクトを行うサンプルです。

ASMP

asmp

ASMPフレームワークによるマルチコアを使用したサンプルです。

prime

マルチコアを使用して素数計算を行うサンプルです。

fft

マルチコアを使用してFFT演算を行うサンプルです。

Sensor

accel

加速度センサからセンサ情報を取得するサンプルです。

gyro

ジャイロセンサからセンサ情報を取得するサンプルです。

light

照度センサからセンサ情報を取得するサンプルです。

mag

地磁気センサからセンサ情報を取得するサンプルです。

press

気圧センサからセンサ情報を取得するサンプルです。

proximity

近接センサからセンサ情報を取得するサンプルです。

colorsensor

カラーセンサからセンサ情報を取得するサンプルです。

tilt

加速度センサを使用して傾き検出を行うサンプルです。

decimator

SCUによるデシメータ機能を使って間引き処理を行うサンプルです。

sixaxis

加速度/ジャイロの6軸センサを使用したサンプルです。

step_counter

加速度センサによる歩数計及び行動認識を行うサンプルです。

Camera

camera

カメラ機能のサンプルです。

JPEG

jpeg_decode

JPEGデコードのサンプルです。

LCD

lcdrw

ILI9341のLCDに描画するサンプルです。

nx

NX graphics機能を用いて、描画するサンプルです。

nxhello

NX graphics機能を用いて、"Hello"を描画するサンプルです。

nximage

NX graphics機能を用いて、ビットマップを描画するサンプルです。

nxlines

NX graphics機能を用いて、線を描画するサンプルです。

nxtext

NX graphics機能を用いて、テキストを描画するサンプルです。

DNN

dnnrt_lenet

DNN Runtime機能を使用して、数字認識を行うサンプルです。

LTE

lte_http_get

LTE通信機能を用いて、HTTP GETを行うサンプルです。

lte_tls

LTE通信機能を用いて、TLS通信を行うサンプルです。

lte_websocket

LTE通信機能を用いて、WebSocket通信を行うサンプルです。

lte_mqtt

LTE通信機能を用いて、MQTT通信を行うサンプルです。

lte_lwm2m

LTE通信機能を用いて、Lightweight M2M(LWM2M)通信を行うサンプルです。

lte_awsiot

LTE通信機能を用いて、AWS IoTと接続するサンプルです。

Battery

charger

充電機能のサンプルです。(Spresenseボードでは充電機能はサポートされていません)

2. Peripheral Driver チュートリアル

2.1. RTC alarm サンプルアプリケーション

RTC alarm サンプルアプリケーションの動作について説明します。

2.1.1. ビルド手順

ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/alarm を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py examples/alarm
    make
    
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

2.1.2. 動作確認

シリアルターミナルを開いて、alarm コマンドを実行します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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 モードといった省電力機能が提供されています。 shutdownpoweroff コマンドを用いてこれらの 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.3.1. Deep Sleep モードからの起床

以下の例では、10 秒後にアラームを設定してから shutdown コマンドにより Deep Sleep モードに入ります。
10 秒後にアラームが発火して Deep Sleep 状態から起床します。

nsh> alarm 10
alarm_daemon started
alarm_daemon: Running
Opening /dev/rtc0
Alarm 0 set in 10 seconds
nsh> shutdown

NuttShell (NSH) NuttX-7.22
nsh>
2.1.3.2. Cold Sleep モードからの起床

以下の例では、10 秒後にアラームを設定しておいて、poweroff --cold により Cold Sleep モードに入ります。
10 秒後にアラームが発火して Cold Sleep 状態から起床します。

nsh> alarm 10
alarm_daemon started
alarm_daemon: Running
Opening /dev/rtc0
Alarm 0 set in 10 seconds
nsh> poweroff --cold

NuttShell (NSH) NuttX-7.22
nsh>

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 を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/watchdog を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py examples/watchdog
    make
    
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

2.2.2. 動作確認

シリアルターミナルを開いて、wdog コマンドを実行します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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 版でも同様のコンフィグレーションを選択することにより本サンプルアプリケーションをビルドすることができます。

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

    build-env.sh スクリプトを読み込むことで、コンフィグレーションツールのTab補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel は release 版を使用しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/adc を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py examples/adc
    make
    
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate として 500000 bps を設定しています。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

2.3.2. 動作確認

シリアルターミナルを開いて、adc コマンドを実行します。

  1. シリアルターミナルを起動します。

    以下は、minicom ターミナルを使用する例です。 シリアルポートとして /dev/ttyUSB0 を、baudrate として 115200 bps を設定しています。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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 により選択されたクロックに依存します。

tutorial scu clock
2.3.3.1. HPADC (High Performance ADC)

HPADC は高速サンプリングが可能な ADC です。

HPADC の クロック系統図を以下に示します。

Diagram

クロックソースを固定分周して 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)
tutorial hpadc coef

n の取りうる範囲は、SCU clock mode によって変わります。

  1. SCU clock mode = RTC の場合

    n 9 10 11

    Fs(Hz)

    64

    32

    16

    Available

  2. 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 のクロック系統図を以下に示します。

Diagram

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)
tutorial lpadc coef

n の取りうる範囲は、SCU clock mode によって変わります。 また、LPADC は全部で 4 チャンネルありますが、1 ch のみ使用する場合、2ch で使用する場合、4ch で使用する場合 でもサンプリング周波数の上限値が変わります。それぞれのケースで、n の取りうる値を以下に示します。

tutorial lpadc ch
  1. SCU clock mode = RTC の場合

    1. LPADC channel 0 ~ 3 のいずれか一つのチャンネルを選択した場合

      n 11 12 13 14 15

      Fs(Hz)

      16

      8

      4

      2

      1

      Available

    2. LPADC channel 0 and 1 の二つのチャンネルを選択した場合

      n 12 13 14 15

      Fs(Hz)

      4

      2

      1

      0.5

      Available

    3. LPADC channel 0 ~ 3 の四つのチャンネルを選択した場合

      n 11 12 13 14 15

      Fs(Hz)

      4

      2

      1

      0.5

      0.25

      Available

  2. SCU clock mode = RCOSC の場合

    1. 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

    2. 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

    3. 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

  3. SCU clock mode = XOSC の場合

    1. 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

    2. 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

    3. 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 を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/pwm を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py examples/pwm
    make
    
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

2.4.2. 動作確認

シリアルターミナルを開いて、pwm コマンドを実行します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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 により選択されたクロックで動作します。

tutorial scu clock

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 です。

tutorial pwm

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 を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/gnss を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py examples/gnss
    make
    
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

3.1.2. 動作確認

シリアルターミナルを開いて、gnss コマンドを実行します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. NuttShell から gnss コマンドを実行します。

    tutorial gnss log1
    図 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.1.3. 参考

GNSS 機能の詳細は、開発ガイドを参照してください。

3.2. Geofence サンプルアプリケーション

Geofence サンプルアプリケーションの動作について説明します。

Geofence は、GNSS で取得される位置情報を使って、特定のリージョンに入る・抜ける・一定期間滞在している、 といったイベントを検出しアプリケーションに通知する機能を提供します。そのリージョンは、中心座標(緯度経度)とその半径によって 指定され、ユーザーが任意の位置を最大 20 地点まで登録することができます。

3.2.1. ビルド手順

ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/geofence を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py examples/geofence
    make
    
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

3.2.2. 動作確認

シリアルターミナルを開いて、geofence コマンドを実行します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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)&region_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.2.3. 参考

Geofence 機能の詳細は、開発ガイドを参照してください。

3.3. GNSS ATCMD アプリケーション

gnss_atcmd は Spresense SDK 上で動作する GNSS 機能評価用のサンプルアプリケーションです。 PC 等のホストからシリアルポートを介してコマンドを送信すると、そのシリアルポートに NMEA センテンスの結果が出力されます。具体的なコマンドの仕様とアプリケーションの使用例について示します。

3.3.1. ビルド手順

ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. 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 というバイナリファイルが生成されます。

  4. 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 へ送られます。

Diagram

@VER コマンドを発行すると、バージョン情報が送られた後に、"Done" の応答が返ります。

Diagram
3.3.2.5. コマンド一覧

gnss_atcmd が処理可能なコマンド一覧を下記に示します。

Command Argument Description

@AEXT

-

アプリケーションを終了します。本コマンドは測位停止中に実行してください。

@BSSL

NMEAマスク

NMEA 0183 (ver 4.00) 規格で定義されているNMEAセンテンスのうち、 出力するNMEAセンテンスをビットマスク値で引数に指定します。 初期状態ではNMEAマスクには0xefが設定されています。

NMEA Bit Description

$xxGGA

0

時刻、緯度経度、標高、測位状態、DGPS基地局番号などの基本情報

$xxGLL

1

時刻、緯度経度、測位状態などGGAの簡易版

$xxGSA

2

衛星毎の使用不使用、DOP値

$xxGSV

3

可視衛星の衛星番号、仰角、方位角、信号強度

$xxGNS

4

時刻、緯度経度、測位状態

$xxRMC

5

時刻、緯度経度、速度、時期偏差

$xxVTG

6

移動速度に関する詳細情報

$xxZDA

7

年月日を含む時刻情報

$QZQSM

14

災害危機管理通報サービスメッセージ(QZSS独自センテンス)

xx は、以下を表します。

  • GP:GPS衛星のみで測位している場合

  • GL:GLONASS衛星のみで測位している場合

  • QZ:QZS衛星のみで測位している場合

  • GN:複数の衛星システムを利用して測位している場合

コマンド例:

$xxGGAのみ出力を設定

@BSSL 0x1<CR><LF>

$xxRMCと$QZQSMの出力を設定

@BSSL 0x4020<CR><LF>

@BUP

-

受信済みのエフェメリス及び各種パラメータを Flash へセーブします。セーブされたデータは次回起動時に自動的にリストアされます。 本コマンドは測位停止中に実行して下さい。

@GCD

-

Cold Start による測位を開始し、NMEAセンテンスを周期的に出力します。出力されるNMEAセンテンスはNMEAマスクに従います。

@GNS

衛星マスク

測位に使用する衛星を引数のビットマスク値で選択します。
例)GPSの場合は 0x1、Hybridの場合は0x3を指定

Bit Satellite

0

GPS

1

GLONASS

2

SBAS(WAAS)補強

3

QZSS L1C/A補完(みちびき)

4

予約

5

QZSS L1S補強(みちびき)

NOTE
補正信号は排他的使用が前提です。使用方法についてはSDKドキュメントをご参照ください。

コマンド例:

GPSを選択

@GNS 0x1<CR><LF>

GPS+GLONASS+QZSS L1C/Aを選択

@GNS 0xb<CR><LF>

@GPOE

<緯度[度]>
<緯度[分]>
<緯度[秒]>
<経度[度]>
<経度[分]>
<経度[秒]>

楕円体座標の受信機現在位置を設定します。

コマンド例:

北緯35°37’09”,東経139°43’51”

@GPOE 35 37 09 139 43 51<CR><LF>

北緯33°07’19”,西経117°19’18”

@GPOE 33 07 19 -117 19 18<CR><LF>

@GSR

-

Hot Start による測位を開始し、NMEAセンテンスを周期的に出力します。
出力されるNMEAセンテンスはNMEAマスクに従います。

@GSTP

-

測位を停止します。

@GSW

-

Warm Start による測位を開始し、NMEAセンテンスを周期的に出力します。
出力されるNMEAセンテンスはNMEAマスクに従います。

@GTIM

<年>
<月>
<日>
<時>
<分>
<秒>

UTC時刻を設定します。

コマンド例:

2018/2/1 13:30'30"

@GTIM 2018 02 01 13 30 30<CR><LF>

2018/7/10 00:00'00”

@GTIM 2018 07 10 00 00 00<CR><LF>

@VER

-

ALLゼロのバージョン番号を返します。

3.3.3. 動作確認

シリアルターミナルを開いて、gnss_atcmd コマンドを実行します。

  1. シリアルターミナルを起動します。

    以下は、minicom ターミナルを使用する例です。 シリアルポートとして /dev/ttyUSB0 を、baudrate として 115200 bps を設定しています。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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. ビルド&ロード手順

ここではコマンドラインによるビルド手順を示します。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/audio_player を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py examples/audio_player
    make
    
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    
  5. 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 を選択してください。

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

    #define PLAYBACK_FILE_PATH "/mnt/sd0/AUDIO"

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

  7. 現在の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 アプリを実行すると、

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

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

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

4.1.3. 付録: 独自の信号処理を行う

これまでのチュートリアルで、オーディオプレーヤーとして十分な機能を実現することができました。
ここからは、より高度な処理を行う方法を説明していきます。

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

  1. Postprocessを有効にします

    tools/cofig.py -m
    

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

    [Examples]
      [Audio player example]
        [Use Postprocess]        <= Y
    Postrocessの詳細についてはSDKデベロッパーガイドの Set preprocess を参照して下さい。
  2. ビルドを行います。

    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とのデータ通信制御が書かれていますので変更しないで下さい。

Diagram
図 3. コード構成
main.cpp

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

userproc_command.h

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

userproc.h

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

userproc.cpp

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

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

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

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

コマンドによるDSP内部の状態遷移は下図の通り行われます。

Diagram
図 4. DSPの状態遷移

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

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

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

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

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

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

コマンドの定義

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

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

Diagram
図 5. コマンドフォーマット

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

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 バイナリのビルド

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

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

Audio Recorderのサンプルアプリケーションの動作について説明します。

4.2.1. ビルド&ロード手順

ここではコマンドラインによるビルド手順を示します。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/audio_recorder を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py examples/audio_recorder
    make
    
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    
  5. 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 アプリを実行すると、

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

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

記録された音声はPCで再生することが出来ます。その際にはSDカードルートディレクトリの下の REC/ に音声ファイルがあります。
audio_recorder_main.cxx では、 RECFILE_ROOTPATH で設定していますので必要に応じてアプリケーションコードを変更して下さい。

#define RECFILE_ROOTPATH "/mnt/sd0/REC"

であればSDカードのルートの下の REC/ に音声ファイルが作られます。

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

4.2.3. 付録: 独自の信号処理を行う

これまでのチュートリアルで、レコーダーとして十分な機能を実現することができました。
ここからは、より高度な処理を行う方法を説明していきます。

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

  1. Preprocessを有効にします

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

    tools/cofig.py -m
    

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

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

    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とのデータ通信制御が書かれていますので変更しないで下さい。

Diagram
図 7. コード構成
main.cpp

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

userproc_command.h

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

userproc.h

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

userproc.cpp

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

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

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

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

コマンドによるDSP内部の状態遷移は下図の通り行われます。

Diagram
図 8. DSPの状態遷移

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

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

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

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

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

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

コマンドの定義

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

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

Diagram
図 9. コマンドフォーマット

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

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 バイナリのビルド

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

4.3. Audio Recognizer サンプルアプリケーション

Audio Recognizer サンプルアプリケーションの動作について説明します。

4.3.1. ビルド&ロード手順

ここではコマンドラインによるビルド手順を示します。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/audio_recognizer を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py examples/audio_recognizer
    make
    
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    
  5. 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 アプリを実行すると、

tutorial recognizer log
図 10. 音声認識動作時ログ

というログが表示され、音声認識が開始されます。

認識結果はアプリケーションコード( 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] を有効にする必要があります。

  1. Preprocessを有効にします

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

    tools/cofig.py -m
    

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

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

    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で信号処理や認識処理を記述することが出来ます。

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

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

Diagram
図 11. PREPROC, RCGPROCコード構成
main.cpp

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

userproc_command.h

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

userproc.h

Pre処理用DSPのユーザーコードのヘッダファイルです。

userproc.cpp

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

rcgproc_command.h

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

rcgproc.h

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

rcgproc.cpp

認識用DSPのユーザーコード本体です。
このファイルに認識処理を書く、または呼び出します。

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

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

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

コマンドによるDSP内部の状態遷移は下図の通り行われます。

Diagram
図 12. DSPの状態遷移

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

  1. AUDCMD_INIT_RECOGNIZERがコールされると認識用DSPが起動します。

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

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

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

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

コマンドの定義

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

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

notificationExec コマンドの応答(認識結果)フラグで、0以外の指定でアプリケーションまで応答を戻します。
例えば、通常は応答を戻さず認識結果の変化点(認識無し→有りになった点)などでのみ応答したい場合などに使用出来ます。

Diagram
図 13. コマンドフォーマット

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

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 バイナリが作成されます。
また、 ConfigurationPreprocess を有効にしていれば PREPROC バイナリも作成されます。
作成されるパスは worker_recognizer/ の下に RCGPROCworker_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 を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/lte_http_get を指定してコンフィグレーションを実行します。

    tools/config.py examples/lte_http_get
    

    サンプルアプリケーションのコンフィグレーションを変更します。

    tools/config.py -m
    
    1. 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)
      tutorial lte http get apn
      コンフィグレーション名 説明

      Access Point Name

      アクセスポイント名

      IP type Selection

      APNプロトコル。IPv4IPv6IPv4/v6 から選択します。

      Authentication type Selection

      認証タイプ。 NonePAPCHAP から選択します。

      Username used for authentication

      ユーザ名。 認証タイプに None を選択した場合、設定は無視されます。

      Password used for authentication

      パスワード。 認証タイプに None を選択した場合、設定は無視されます。

    2. HTTPSの設定します。(必要に応じて設定してください。)

      モデムのTLSプロトコルはサポートしておりません。

      Externals -> mbed TLS Library (CONFIG_EXTERNALS_MBEDTLS)
      tutorial lte http get mbedtls
      System tools -> Network Utilities -> Directory path for TLS certification files (CONFIG_NETUTILS_WEBCLIENT_TLS_CERTS_PATH)
      tutorial lte http get certs

      HTTPSで使用するサーバのルート証明書を格納するディレクトリを指定します。
      デフォルトの設定では/mnt/spif/CERTSとなっています。

      ルート証明書の取得方法についてはルート証明書のエクスポート手順を参考にしてください。

      SPI-Flashへのファイル転送方法はZmodem を使ったファイル転送を参照してください。

      ディレクトリのパスを /mnt/sd0/CERTS にすると microSD カードに変更することができます。
      microSD カードに変更した場合は CONFIG_CXD56_SDIO のコンフィグレーションを有効にする必要があります。

      ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

      make
      
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

5.1.3. 動作確認

シリアルターミナルを開いて、lte_http_get コマンドを実行します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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>

本サンプルアプリケーションの、wgetwget_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);
}

上記の例では、 /mnt/spif/index.html にダウンロードしたデータを保存します。
ファイルは追加書き込みモードで保存されるため、必要に応じて lte_http_get のコマンドを実行する前に
NuttShell から rm /mnt/spif/index.html のコマンドを実行しファイルを削除してください。
保存したファイルの内容は cat /mnt/spif/index.html のコマンドを実行すると確認できます。

5.1.4. 参考

LTE 機能の詳細は、開発ガイドを参照してください。

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 を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/lte_tls を指定してコンフィグレーションを実行します。

    tools/config.py examples/lte_tls
    

    サンプルアプリケーションのコンフィグレーションを変更します。

    tools/config.py -m
    
    1. 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)
      tutorial lte tls apn
      コンフィグレーション名 説明

      Access Point Name

      アクセスポイント名

      IP type Selection

      APNプロトコル。IPv4IPv6IPv4/v6 から選択します。

      Authentication type Selection

      認証タイプ。 NonePAPCHAP から選択します。

      Username used for authentication

      ユーザ名。 認証タイプに None を選択した場合、設定は無視されます。

      Password used for authentication

      パスワード。 認証タイプに None を選択した場合、設定は無視されます。

    2. HTTPSの設定をします。

      モデムのTLSプロトコルを使用することが可能です。
      使用する場合は、 モデムのTLSプロトコルを使用する を参照してください。

      Examples -> TLS data communication over LTE network example -> Directory for server certification files (CONFIG_EXAMPLES_LTE_TLS_CERTS_PATH)
      tutorial lte tls certs

      HTTPSで使用するサーバのルート証明書を格納するディレクトリを指定します。
      デフォルトの設定では/mnt/sd0/CERTSとなっています。

      ディレクトリのパスを /mnt/spif/CERTS にするとSPI-Flashに変更することができます。

      ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

      make
      
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

5.2.3. 動作確認

シリアルターミナルを開いて、lte_tls コマンドを実行します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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.2.4. 参考

LTE 機能の詳細は、開発ガイドを参照してください。

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 を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/lte_mqtt を指定してコンフィグレーションを実行します。

    tools/config.py examples/lte_mqtt
    

    サンプルアプリケーションのコンフィグレーションを変更します。

    tools/config.py -m
    
    1. 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)
      tutorial lte mqtt apn
      コンフィグレーション名 説明

      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
      
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

5.3.3. 動作確認

シリアルターミナルを開いて、lte_mqtt コマンドを実行します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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.3.4. 参考

LTE 機能の詳細は、開発ガイドを参照してください。

5.4. LTE AWS-IoT サンプルアプリケーション

5.4.1. 概要

本サンプルプログラムは、LTE通信機能とAWS-IoT device SDK for embedded Cを用いて、AWS-IoTサーバに接続し、MQTT通信を行うサンプルです。

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 を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に examples/lte_awsiot device/sdcard を指定してコンフィグレーションを実行します。

    tools/config.py examples/lte_awsiot device/sdcard
    

    サンプルアプリケーションのコンフィグレーションを変更します。

    tools/config.py -m
    
    1. 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)
      tutorial lte awsiot apn
      コンフィグレーション名 説明

      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 を選択した場合、設定は無視されます。

    2. 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"です。

    3. 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
      
  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

5.4.4. 動作確認

シリアルターミナルを開いて、lte_awsiot コマンドを実行します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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コンソール上で確認できます。

動作環境によっては通信状態が不安定になり、正しく動作しないことがあります。
詳細はFAQを確認してください。

5.4.5. 参考

LTE 機能の詳細は、開発ガイドを参照してください。

6. System tools 一覧

Spresense SDKでは、NuttShell から 各種 System tools を利用することができます。

カテゴリ System tool名 説明

LOG

setlogmask

ログレベルを動的に変更します。

logdump

BackupSRAMに保存されたロギング情報をダンプします。

logsave

BackupSRAMに保存されたロギング情報をSPI-Flashに保存します。

GPIO

gpio

Pin情報を取得/設定します。

gpioint

GPIO割り込みを確認するためのテストコマンドです。

I2C

i2c

I2Cデバイスとの通信を確認するためのユーティリティツールです。

PMIC

pmic

PMIC(PowerManagement IC)を制御するためのユーティリティツールです。

USB

usbmsc

USB MSC機能を使用するためのコマンドです。

cdcacm

USB CDC/ACM機能を使用するためのコマンドです。

Zmodem

zmodem

Zmodem転送を使用するためのコマンドです。

Stack

stackmonitor

Stack使用量をモニタするためのツールです。

7. USB MSC 機能を使う

USB MSC (Mass Storage Class) 機能を使うためのユーティリティコマンドについて説明します。
USB MSC 機能を有効にするとホスト PC からSpresense ボード上の SD カードへ直接アクセスすることができます。

7.1. ビルド手順

ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    SD カードを USB MSC としてマウントするので SD カード機能を有効化した状態で menuconfig を開きます。

    ./tools/config.py device/sdcard -m
    

    System tools > USB Mass Storage Device Commands を有効にして、コンフィグレーションを終了します。

    tutorial usbmsc
    make
    

    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

7.2. 動作確認

拡張ボードに SD カードが挿入されている状態で、拡張ボードの USB 端子とホスト PC とを USB ケーブルで接続します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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 カードの内容にアクセスすることができます。

  3. USB MSC 機能を終了する場合、NuttShell から msdis コマンドを実行します。

    nsh> msdis
    msdis: Disconnected

8. USB CDC/ACM 機能を使う

USB CDC/ACM 機能を使うためのユーティリティコマンドについて説明します。
USB CDC/ACM 機能を有効にすると拡張ボードの USB をシリアルポートとして使用することができます。

8.1. ビルド手順

ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    menuconfig を開きます。

    ./tools/config.py -m
    

    System tools > USB CDC/ACM Device Commands を有効にして、コンフィグレーションを終了します。

    tutorial cdcacm
    make
    

    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

  4. nuttx.spk を Spresense ボードへ書き込みます。

    この例では シリアルポートとして /dev/ttyUSB0 を、書き込み速度の baudrate に 500000 bps を設定しています。お使いの環境に合わせて変更してください。

    tools/flash.sh -c /dev/ttyUSB0 -b 500000 nuttx.spk
    

8.2. 動作確認

拡張ボードの USB 端子とホスト PC とを USB ケーブルで接続します。

  1. シリアルターミナルを起動します。

    シリアルポートに /dev/ttyUSB0 を、baudrate に 115200 bps を指定して、 minicom ターミナルを使用する例を示します。

    minicom -D /dev/ttyUSB0 -b 115200
    
  2. 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 経由でシリアル通信をすることができるようになります。

  3. USB CDC/ACM 機能を終了する場合、NuttShell から serdis コマンドを実行します。

    nsh> serdis
    serdis: Disconnected

9. Zmodem を使ったファイル転送

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

9.1. ビルド手順

ここではコマンドラインによるビルド手順を示します。
IDE を使用してビルドする場合、以下に示すコンフィグレーション情報を参考にしてください。

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

    build-env.sh スクリプトを読み込むことで、config.py ツールの Tab 補完機能が有効になります。

    cd spresense/sdk
    source tools/build-env.sh
    
  2. Kernel のコンフィグレーションとビルドを行います。

    この例では Kernel configuration は release-defconfig を選択しています。
    Kernel を既にビルド済みの場合は、この作業を省略することができます。

    tools/config.py --kernel release
    make buildkernel
    
  3. SDK のコンフィグレーションとビルドを行います。

    引数に feature/zmodem を指定してコンフィグレーションを実行します。
    ビルドに成功すると sdk フォルダ直下に nuttx.spk ファイルが生成されます。

    tools/config.py feature/zmodem
    make
    
  4. 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 コマンドの使い方
tutorial zmodem1 rz
sz コマンドの使い方
tutorial zmodem1 sz

9.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 → 送信 から選択したファイルを送信することができます。

9.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 側のファイル受信ディレクトリは、ファイル → ディレクトリを変更 によって指定可能です。

10. アプリケーションの自動起動方法

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

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

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

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

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

  1. hello アプリケーションを有効にして、menuconfig コンフィギュレーションメニューを開きます。

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

    System tools --> NSH Library ---> Scripting Support
    tutorial autostart menuconfig1
  3. ROMFS header location として Custom ROMFS header path を選択し、
    Custom ROMFS header file path には ../../nsh_romfsimg.h と記述してコンフィギュレーションを保存終了します。

    nsh_romfsimg.h の場所を sdk/system/nshlib ディレクトリからの相対パスで指定してください。
    tutorial autostart menuconfig2
  4. 続いて、sdk ディレクトリ直下に rcS.template というファイル名のスタートアップスクリプトを作成します。
    ここでは例として、以下のように echo コマンドと hello コマンドを記述しています。

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

    cd spresense/sdk
    ./tools/mkromfsimg.sh .
    ls nsh_romfsimg.h
    nsh_romfsimg.h
    
  6. いつもの手順でビルドしたバイナリを Spresense ボードに書き込んでください。

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

    tutorial autostart log

10.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. あとのビルド手順はさきほどと同様です。

10.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;
}