IoT×AI時代の今、センシングした情報を解析しリアルタイムに可視化できるスマートエッジや、エッジの情報を圧縮しクラウドと最適な通信量で情報を交換するコンピューティングエッジ、エッジの情報とクラウドの解析アルゴリズムを柔軟に結び付けるスマートゲートウェイといった製品が注目を集めています。これらの製品に共通していることは、旧来の組み込みシステムには要求されなかった「一般的なネットワーク網への参加機能」が統合されていることです。開発者はエッジを、独自のプロトコルで会話する専用のネットワークではなく、汎用的で仕様が公開されているWi-Fiなどオープンなネットワークに参加させることで、汎用機器で充分に検証されているハードウェア/ソフトウェア資産を活用し、安定したシステムを実現。エッジとクラウドが連携するリッチなサービスを早期リリース可能です。
SPRESENSE SDKに同梱されたリアルタイムOS「NuttX」は、超低消費電力のエッジにネットワーク接続機能を簡単に統合できる無償の製品です。NuttXはネットワーク通信に不可欠な「デバイスドライバ」や「プロトコルスタック」を内蔵しているため、開発者はコードを一行も書くことなく、コンフィグレーションするだけで、SPRESENSEをWi-Fi(無線LAN)ネットワーク網に参加させることができます。今回の初心者講座では、まず前半でNuttXに同梱されたネットワーク機能の概要を紹介し、後半では動画を交えてビルド手順に加え、SPRESENSEがWi-Fi通信する様子を紹介します。
超低消費電力なネットワーク製品を開発することの難しさ
現在、多くの組み込みシステムがWi-Fiに対応しています。組み込みシステムにWi-Fi接続機能を付加できる代表的なソリューションが「組み込みLinux」です。組み込みLinuxはArm® Cortex®-AベースのCPU上で動作し、Wi-Fiのハードウェアモジュールを制御する「デバイスドライバ」や、TCP/IPを代表とする様々なネットワーク通信の規約を実装した「プロトコルスタック」を提供。開発者は、簡単にエッジをネットワーク網へ参加させることができます(図1)。
一方で、近年のIoTに求められている「超低消費電力」を達成しながらWi-Fi通信を行うエッジを実現することは、非常に難しい課題です。乾電池のみで駆動できる程に優れた低消費電力特性を達成するためには、CPUとしてArm Cortex-Mを選択しなければなりません。しかし、Cortex-MはLinuxに対応していないことから、Wi-Fi通信に必要とされるデバイスドライバやプロトコルスタックをすべて自社で実装しなければなりません(図2)。これは非常に大変な開発となります。なぜなら、汎用的なWi-Fiのネットワークにエッジを参加させるためには、様々なプロトコル(ICMP、ARP、IP、TCP、UDP、DHCP、DNS、HTTPなど)に対応する必要があるためです。プロトコルの詳細は下記の書籍をご参照ください。
プロトコルスタックを提供するリアルタイムOS「NuttX」の魅力
こうした課題を解決し、超低消費電力のエッジをWi-Fiのネットワークへ簡単に接続させることのできるソリューションが、SPRESENSE SDKに同梱された「NuttX」です。NuttXは、第13回にて紹介したようにCortex-Mに対応し、従来型のリアルタイムOSの提供するスケジューリング機能やリソース管理機能に加えて、デバイスドライバやプロトコルスタックを備え、アプリケーションからはLinuxライクなPOSIXインタフェースを介して豊富なソフトウェアリソースが利用できる、非常に軽量なリアルタイムOSです。
SPRESENSE SDKとNuttXを活用することにより、CPUに超低消費電力なCortex-Mを採用しながら、既存のソフトウェア資産を活用してWi-Fiネットワークへ参加できるエッジを、簡単に実装することができます(図3)。なお、SPRESENSE SDKに同梱されているNuttXは、デバイスドライバとプロトコルスタックのソースコードを下記のGitHubページにて無償公開しています。
NuttXに統合されたWi-Fiのデバイスドライバ NuttXに統合されたプロトコルスタック
SPRESENSEをWi-Fiに接続する
それでは、実際にSPRESENSE SDKを操作して、SPRESENSEを使ったWi-Fiシステムを構築してみましょう。
Wi-Fi接続に利用するハードウェア
Wi-Fiへの接続にはSPRESENSEメインボードに加えて、無線LAN機能を備えた拡張ボードが必要となります。今回の初心者講座では、図4に示すIDY社製の「 SPRESENSE Wi-Fi Add-onボード iS110B」を利用しました。このAdd-OnボードにはTelit社のGS22000Mが搭載されているため、NuttXは同梱のGS22000Mのデバイスドライバを使ってデバイスを制御します。GS2200Mは、Wi-Fiの子機(ステーションモード)として機能するだけでなく、Wi-Fiの親機(アクセスポイントモード)にもなることのできる、柔軟性に富んだ扱いやすいデバイスです。
開発をはじめる前に
SPRESENSE Wi-Fi Add-onボードとSPRESENSEメインボードの接続方法はIDY社のHPをご参照ください。以降の手順は、①SPRESENSEメインボードとWi-Fi Add-Onボードが接続され、②SPRESENSE SDK v2.0.1がセットアップされた開発用PCが準備できている状態からのものとなります。SPRESENSE SDK v2.0.1のセットアップ方法については、後述の「SPRESENSE SDK v2.0.1の導入方法」をご参照ください。
SPRESENSEをアクセスポイントとして新しいWi-Fiネットワークを構築する
はじめに、SPRESENSEをアクセスポイントとして「新しいWi-Fiネットワーク網」を構築する方法を紹介いたします(図5)。SPRESENSEがネットワークの中心となり、Wi-Fiを形成。Wi-Fiに参加したWindows PCへIPを貸し出します。その後、SPRESENSEはネットワークの導通確認用のエコーサーバーアプリケーション「tcpecho(ポート80番に到着したデータを、そのまま送信元へと返送する機能)」を開始し、Windowsからの要求(リクエスト)に対して、適切な応答(レスポンス)を返送します。
MSYS2を起動し、ソースコード一式を入手する
- まず、開発用PCにソースコード一式をダウンロードします。
# まず https://github.com/inscape-sa/spresense_based_v201 に格納されているソースコードを入手します。 $ cd ~/ $ git clone --recursive https://github.com/inscape-sa/spresense_based_v201 # cloneできていることを確認します。 $ ls ./ spresense_based_v201 $ cd ./spresense_based_v201
Visual Studio Codeを起動し、ワークスペースを開く
- Visual Studio Codeを起動します。
- ワークスペースを開くをクリックします。
C:¥msys2¥home¥ユーザー名¥spresense_based_v201¥
へ移動します。aps_project_based_v201.code-workspace
を開きます。
SDKのコンフィグレーションからWi-Fi機能を有効化する
- ワークスペース内のapplicationフォルダを右クリックします。
- SDKコンフィグをクリックします。
- SDKコンフィグが起動しない場合はコチラをお試しください。
- 新規作成をクリックします。
- featureのasmpを選択します。
- Examplesのhelloを選択します。
- Examplesのtcpechoを選択します。
- 保存をクリックします。
アプリケーションをビルドしSPRESENSEへ書き込む
- ワークスペース内のapplicationフォルダを右クリックします。
- アプリケーションのビルドを実行します。
- ビルド完了を待ちます。
- ワークスペース内のapplicationフォルダを右クリックします。
- ビルドと書き込みを実行します。
- プログラムの転送が完了するとNuttShellが表示されます。
SPRESENSEをアクセスポイントとし、Windows PCをステーション(子機)として通信する
以上の操作によりネットワーク通信の準備が整いました。実際の通信内容を追いかけるためWindows PCへ「WireShark」をインストールし、無線LANアダプタのパケットをキャプチャします(図6)。WireSharkは無償のパケットキャプチャ・アプリケーションです。また、Windows PCからSPRESENSEへパケットを送出するために、無償のコンソールアプリケーション「Tera Term」を利用しました(図7)。
WireShark – Download
Tera Term
通信手順は以下の通りです。
- SPRESENSE上のNuttShellで以下のコマンドを実行します。
gm2200m -a 1 spresenseAP testtest &
- Wi-Fiアクセスポイント「spresenseAP」が起動します。
- アクセスポイントへの接続パスワードは「testtest」となります。
- Windows PCからWi-Fiアクセスポイント「spresenseAP」へ接続します。
- SPRESENSE上のNuttShellで下記のコマンドを実行しサーバーを起動します。
tcpecho
- Windows PCでTera Termを起動しTelnet接続で192.168.11.1のポート80へ接続します。
- 文字列を入力してEnterを押すと、入力した文字列と同じ文字列が表示されます。
- WireSharkにより、通信毎にTCPのハンドシェイクが行われていることを確認できます。
なお、今回の実験で採取したパケットキャプチャのデータを以下のアドレスへ格納しました。ファイルをダウンロードしWireSharkで開くことで、実際の通信内容をお手元でご確認いただけます。是非、お試しください。
SPRESENSEをアクセスポイントとした場合のパケットキャプチャデータ
構築済みのWi-FiネットワークにSPRESENSEを参加させる
今回利用したWi-Fi Add-Onボードは、自身がWi-Fiネットワークを構築する中心となるアクセスポイントモードに加えて、既存のネットワークのアクセスポイントへ子機として接続するステーションモードにも対応しています(図8)。
# 手順20を変更 # SPRESENSEのWi-Fi機能をステーションモードとして初期化する(NuttShell上で操作) gm2200m [alreadyRunningAP] [passphraseForAP] &
SPRESENSEを既存のネットワーク網に参加させるには、SPRESENSE自身がDHCPクライアント機能を実行し、ネットワーク内にあるDHCPサーバーと通信、自身のIPアドレスを決定する必要があります。また、ネットワーク内のノードがSPRESENSEのIPアドレスに対応するMACアドレスをネットワーク全体へ問い合わせた際に、問い合わせ元のノードへ自身のMACアドレスを応答するARP機能も不可欠です。SPRESENSEはこうした機能が全て統合されているプロトコルスタックを備えているため、アプリケーション開発に欠かせないHTTP通信やTCP/IP通信はもとより、それらの土台となるDHCPやARPといったプロトコルを、自社で開発することなく簡単に導入することができます(図9)。
なお、SPRESENSEをステーションモードとした際の通信をキャプチャしたデータも以下のURLで配布しています。SPRESENSEとDHCPサーバ間の通信など、既存のネットワークへSPRESENSEが参加する際の通信フローをご確認いただけます。
SPRESENSEをステーションとした場合のパケットキャプチャデータ
さらなる活用方法
SPRSENSEはLTE拡張ボードにも対応しています。そのため、SPRESENSEをWi-Fiのアクセスポイントとし、Wi-Fiネットワークによりローカルの情報を収集。SPRESENSEのマルチコアをフル活用して解析・統合し、LTE通信によってクラウドへ必要なデータのみを送信する「スマートゲートウェイ」の実現も可能です。
まとめ
今回はNuttXを活用し、デバイスドライバやプロトコルスタックといった実装にコストのかかる機能を、簡単にエッジ上へ導入する方法を説明しました。SPRESENSE SDKはネットワークの他にも、ストレージやファイルシステムなど、様々なプロトコルスタックに対応しています。是非、貴社の製品開発を加速させるためにご活用ください。
補足説明
SPRESENSE SDK v2.0.1の導入方法
今回の手順はSPRESENSE SDK v2.0.1を利用しています。インストール方法は以前のSDKとほぼ同じですが、ビルドシステムが刷新され、カーネルのビルドとアプリケーションのビルドが統合。コンフィグメニューがツリー形式に表示されるようになるなど、非常に使いやすくなっています。もちろん同梱されているデバイスドライバも拡充されています。ここでは、以下の動画にて導入方法の概略を紹介いたします。
SPRESENSE SDK v2.0.1でSDKコンフィグの開始に失敗する場合
SPRESENSE SDK v2.0.1は「アプリケーションのクリーン」を実行した後に「SDKコンフィグ」を実行するとSDKコンフィグの開始に失敗する現象が発生することがあります。この場合は下記の手順で復旧できます。
- Visual Studio Codeで「アプリケーションのクリーン」を実行
- Visual Studio Codeで「ターミナル」-「新しいターミナル」を開始
- コマンドラインで spresense/sdk フォルダへ移動
- コマンドラインで「make distclean」を実行
- ターミナルを閉じる
- 再度「SDKコンフィグ」を実行
SONY SPRESENSE
SPRESENSEは、Arm Cortex-M4コア(FPU機能搭載)を6コア搭載したシングルボードコンピュータです。マルチコアによる豊富な演算能力をはじめ、魅力的なペリフェラルを多数搭載しながら、電池のみでも駆動できる超低消費電力な製品です。本格的なエッジコンピューティングを是非ご体験ください。システムの試作はもちろん、PoC、製品化にもご活用いただけます。
開発者向けサイトを見る Switch-Scienceで購入する
APS学習ボード(SPRESENSE™ Extension Board用)
APS学習ボード(SPRESENSE™ Extension Board用)は、初心者講座の内容をはじめ、SPRESENSE SDKの提供するオーディオ入力機能やLCDドライバをはじめとする各種機能を、回路設計をすることなく簡単にお試しいただけるよう開発したAPSオリジナルの評価基板です。Web記事と併せてお楽しみください。
取扱説明書|APS学習ボード Switch-Scienceで購入する(ボード単体)
Switch-Scienceで購入する(部品キット)
こちらも是非
“もっと見る” マルチコア|SPRESENSE編
SPRESENSE×Neural Network Console:第4回|推論モデルを最適化し、エッジAIによるオリジナルの音声識別システムを構築する
今回の初心者講座では、SPRESENSEの「ハイレゾオーディオ入力」と「DNNRT機能」により「Neural Network Console」で生成したディープニューラルネットワーク(DNN)の推論モデルを統合。エッジ単体で完結するオリジナルの音声識別システムを構築する技法を解説いたします。
SPRESENSE×Neural Network Console:第3回|オーディオ解析に必要な学習用データを採取し、PC上で学習・推論を実行する
今回の初心者講座では、SPRESENSEに搭載されたハイレゾオーディオ入力を活用し、環境音を録音し、ディープニューラルネットワークによる音声分類に不可欠な学習用データと検証用データを生成する方法について解説します。また、PC上で動作するNeural Network Consoleによって生成した推論モデルをエッジ・デバイスへ統合するために解決すべき課題を紹介します。
SPRESENSE×Neural Network Console:第2回|異常検知に活用できるニューラルネットワークで波形の扱い方を学ぶ
SPRESENSEのDNNRT機能が扱うことのできるデータは画像だけでなく、産業分野を中心に人気が高まっている「異常検知・故障予知」に活用できる加速度センサーや大気圧センサーなどから収集した波形データも解析することができます。さらにSPRESENSEに内蔵されたハイレゾオーディオ録音機能も周辺環境を可聴域の波形データとして記録することができる優れたセンサーとして利用可能です。そこで、今回の初心者講座では、まず簡単な波形データの解析方法を例に、DNNRT機能から波形データを扱うシステムの構築方法について解説。DNNRT機能を活用した製品開発に必要となる技術を紹介いたします。