GT202 アプリケーションノート]
「IoT センサーライト・デモ」
ソフトウェアの実装手順
改版履歴
日付 版数 摘要
目次
1. はじめに ... 1 2. 「IoT センサーライト・デモ」ソフトウェアの実装手順 ... 2 2.1. ご用意いただくもの ... 2 2.2. 動作確認用ハードウェアの準備 ... 3 2.3. 開発環境のセットアップ ... 4 2.4. 新規プロジェクトの作成 ... 5 2.5. インタフェース定義ファイルのコーディング ... 6 2.6. カスタムアプリケーションの実装 ... 8 2.6.1. コールバック関数の実装 ... 8 2.6.2. プロパティ更新通知の実装 ... 9 2.6.3. イベント通知処理の実装 ... 10 2.6.4. AllJoyn 通信処理タスクの実装 ...11 2.6.5. I/O 処理タスクの実装 ...11 2.7. ビルドおよび実行 ... 12 3. ソースコードの構成 ... 15 4. AllJoyn フレームワークに関する追加情報... 16 4.1. AllJoyn に関する技術情報、ソフトウェアの入手方法 ... 16 4.2. Thin-Core ライブラリと Standard-Core ライブラリの差異について ... 16 4.3. ネットワーク構成における留意事項... 17
1. はじめに
本ドキュメントでは、GT202 無線 LAN 通信モジュールと AllJoyn フレームワークを利用した IoT ソリューシ ョンの実装例として、「IoT センサーライト・デモ」のソフトウェアの実装手順を詳しく説明します。
「IoT センサーライト・デモ」は、センサーライト (LED 電球+人感センサ)に GT202 Wi-Fi 通信モジュールと マイコンを搭載して、スマートフォンへの人感センサ情報の通知および照明制御を行うデモです。
通信機能とユーザインタフェースの実装に AllJoyn フレームワーク(ミドルウェア)を利用することで、最小限 の工数で IoT 機器を実装することができます。
本ドキュメントの手順を参考にして頂くことにより、AllJoyn を利用してオリジナルの IoT 機器ファームウェア を製作し、GT202 および AllJoyn の評価を行っていただくことができます。
2. 「IoT センサーライト・デモ」ソフトウェアの実装手順
2.1. ご用意いただくもの
本ドキュメントの手順を実際にお試し頂く際には、以下の物品をご用意ください。① GT202(QCA4002 hosted mode)開発環境一式
株式会社チップワンストップの Web サイトにて、開発環境の構築手順をご案内しています。
下記 URL から「GT202KITS 開発環境セットアップ手順書」「開発環境構築用ファイル一式」をダウン ロードし、手順書に従って開発環境をセットアップしてください。
http://sp.chip1stop.com/gt202_downlord/
開発環境は概ね下図の構成になっており、GT202KITS, FRDM-K22F 評価ボード、IAR Embedded Workbench(有償版または期間限定評価版), PC, 無線 LAN アクセスポイント、Android タブレット 等をご用意いただく必要があります。 ② 動作確認用ハードウェア 「IoT センサーライト・デモ」の参考回路図または、本ドキュメントの 2.2 の手順を参考に、動作確認用 のハードウェアを製作してください。参考回路図は、下記 URL からダウンロードできます。 http://sp.chip1stop.com/gt202_downlord/ ③ サンプルソースコード一式 本ドキュメントの手順で作成するソースコードは、下記 URL からダウンロードできます。 http://sp.chip1stop.com/gt202_downlord/
2.2. 動作確認用ハードウェアの準備
株式会社チップワンストップの Web サイトにて、「IoT センサーライト・デモ」の参考回路図を提供していま す。同等のハードウェアを製作頂くことで、本ドキュメントの手順に従って作成したソフトウェアの動作確認 を行っていただくことができます。 http://sp.chip1stop.com/gt202_downlord/ より簡単に動作確認を行いたい場合は、以下のようなハードウェアで代用することができます。 端子 PTC3 にオシロスコープを 接続し、PWM 出力波形を観測 する または、LED 等を接続する 端子 PTB16 に人感センサを接 続する (検知時 H レベル出力 のセンサモジュールを使用し てください) または、押しボタンスイッチを 押下時 H レベルになるよう接 続する等により、人感センサを 代用する
2.3. 開発環境のセットアップ
以下の手順により、開発環境をご用意ください。
① GT202 (QCA4002 hosted mode)開発環境のセットアップ
株式会社チップワンストップの Web サイトにて、開発環境の構築手順をご案内しています。 下記 URL から「GT202KITS 開発環境セットアップ手順書」「開発環境構築用ファイル一式」をダ ウンロードし、手順書に従って開発環境をインストールしてください。 http://sp.chip1stop.com/gt202_downlord/ 「GT202KITS 開発環境セットアップ手順書」に記載の「Alljoyn デモ ファームウェアビルド手順」 および「デバッガ(OpenSDA J-Link )の設定と、デバッグの開始手順」に従ってビルド・書き込 み・デバッグが行えることを確認してください。 「GT202KITS デモソフト操作手順書」を参考にして、ビルドした AllJoyn デモが動作するこをを 確認してください。 ② Python 2.7 のインストール
以下の Web サイトより Python for windows をダウンロードしてインストールして下さい。 https://www.python.org/downloads/windows/
インストール先フォルダは C:¥Python27 としてください。
③ Xmllint コマンドのインストール
ftp://ftp.zlatkovic.com/libxml/ (libxml2 ライブラリの Windows 版配布サイト)を開き、以下の各 ファイルをダウンロードしてください。
iconv-1.9.2.win32.zip libxml2-2.7.8.win32.zip
zlib-1.2.5.win32.zip
ダウンロードした zip ファイルを開き、以下の 4 ファイルを取り出してください。 iconv.dll libxml2.dll zlib1.dll xmllint.exe
2.4. 新規プロジェクトの作成
「IoT センサーライト・デモ」のソフトウェアは、GT202 の開発環境に付属の AllJoyn デモと大部分が共通に なります。以下の操作を行ってサンプルソースコードをコピーして、新規プロジェクトを作成してください。※以下では、GT202 (QCA4002 hosted mode)開発環境が C:¥Freescale¥Freescale_MQX_4_1 にイ ンストールされている前提で説明しています。 ① コマンドプロンプトを管理者モードで開きます。 ② MQX RTOS のインストールフォルダへ移動します(C:¥Freescale¥Freescale_MQX_4_1) ③ バッチファイル prepare_app.bat を実行してください。 下記画面が表示されますので、4 (Alljoyn Demo)を入力してください。 ④ バッチファイル dl-alljoyn.cmd を実行してください。 ※Alljoyn のソースコードをダウンロード・展開しますので、あらかじめ PC をインターネットに接続した 状態にしてください。
※「Directory exists, not downloading or expanding」と表示される場合は、開発環境のインストー ル中にダウンロードが完了していますので、そのまま次の手順へ進んでください。
⑤ 以下のコマンドを実行し、demo¥aj フォルダを demo¥aj_slight にコピーします。 robocopy /E /SL demo¥aj demo¥aj_slight
※ 必ず robocopy コマンドを使用してコピーして下さい。他の方法でコピーすると、シンボリックリン ク等が正しくコピーされないため正常にビルドできません。
⑥ コピー先の下記フォルダにあるワークスペース定義ファイル gt202-frdmk22f.eww をダブルクリック して開きます。 (IAR Embedded Workbench for ARM が起動します。)
C:¥Freescale¥Freescale_MQX_4_1¥
2.5. インタフェース定義ファイルのコーディング
「IoT センサーライト・デモ」の AllJoyn による外部インタフェースを実装するため、XML 形式のインタフェー ス定義ファイル(introspection XML)を作成します。 ① 以下のフォルダを新規作成します。 C:¥Freescale¥Freescale_MQX_4_1¥ demo¥aj_slight¥allseen¥services¥base_tcl¥sample_apps¥SensorLight ② ユーザインタフェース定義ファイル sensorlight.xml を実装します。 ( 手 順 2.1 ① に て ダ ウ ン ロ ー ド し た サ ン プ ル ソ ー ス コ ー ド か ら 、 上 記 で 作 成 し た フ ォ ル ダ に sensorlight.xml をコピーしてください。) このファイルの構文、機能等については、下記のドキュメントで定義されています。 Control Panel API Guide - C (Thin Core)https://allseenalliance.org/developers/develop/api-guide/controlpanel/c-thin このファイルの記述内容によって、以下の項目を実装しています。 実装項目 「IoTセンサーライト・デモ」における実装 コントロールパネルの画面構成 スライダ 1 個(調光)、Power(LED の状態表示)、Sensor State(人感センサ状態表示)、ボタン 3 個(点灯・減光・消灯)、 チェックボックス 2 個を配置し、表示色等を指定しています。 他の AllJoyn 対応機器から read/write 可能なプロパティの名称、型、変更可 能範囲、数値の単位など
Dimmer(調光, min 0, max 100、単位%)
PIRSensorStateStringProperty(人感センサ状態、文字列) など、複数のプロパティを定義しています。 プロパティが Read/Write された時にコ ールバックされる関数名の設定 例えば、プロパティ Dimmer に対する read/write の要求がある と、getDimmerValue/setDimmerValue 関数が呼ばれるように 記述しています。これによって、Android 端末画面上でスライダ を操作すると LED 電球の明るさが調整できる動作を実現して います。 他の AllJoyn 対応機器から起動できる アクションの定義 turn_on (点灯)、turn_off (消灯) などのアクションを定義して います。 他の機器からアクションを起動された時 にコールバックされる関数名の設定 アクション turn_on が起動されると、関数 TurnOnLight()が呼び 出されるように記述しています。
これによって、Android 端末画面で「Turn On」ボタンをタップす ると LED 電球が点灯する動作を実現しています。
③ ①で作成したフォルダ SensorLight にバッチファイル cpsgen.bat を作成し、以下の内容を入力しま す。 set PATH=%PATH%;C:\Python27;C:\xmllint set PROG=%~dp0\..\..\controlpanel\tools\CPSAppGenerator\GenerateCPSApp.py python %PROG% -p %~dp0 sensorlight.xml
PAUSE
④ cpsgen.bat を実行します。
フォルダ SensorLight にファイル ControlPanelGenerated.c, ControlPanelGenerated.h が生成 されます。
※ソースファイルが生成されない場合やエラーメッセージを表示したときは、インタフェース定義ファイ ル sensorlight.xml の内容に誤りがありますので確認してください。
2.6. カスタムアプリケーションの実装
以下では、手順 2.5 で実装した外部インタフェースに対応する内部動作の実装手順と実装内容を説明致 します。2.6.1. コールバック関数の実装
手 順 2.5 ① で 作 成 し た フ ォ ル ダ SensorLight に 、 ソ ー ス フ ァ イ ル ControlPanelProvided.c , ControlPanelProvided.h を実装します。 (手順 2.1①にてダウンロードしたサンプルソースコードから、フォルダ SensorLight にこれらのファイルを コピーしてください。) ここで実装する関数は、インタフェース定義ファイル sensorlight.xml に記述したコールバック関数です。 例えば、setDimmerValue 関数では、外部の AllJoyn 対応機器からプロパティ Dimmer の変更が行われ た時に PWM 出力信号のデューティ比を変更し、LED 照明の調光を実行するよう実装しています。 #ifndef CONTROLPANELPROVIDED_H_ #define CONTROLPANELPROVIDED_H_ #include "alljoyn.h" #include "alljoyn/controlpanel/Common/DateTimeUtil.h" #include "ControlPanelGenerated.h"void* getDimmerValue(PropertyWidget* thisWidget); void setDimmerValue(uint16_t newuint16Var);
void* getSensorLightMode(PropertyWidget* thisWidget); void setSensorLightMode(int32_t newint32Var);
void* getSensorNotificationMode(PropertyWidget* thisWidget); void setSensorNotificationMode(int32_t newint32Var);
void* getPowerValue(PropertyWidget* thisWidget); void setPowerValue(uint16_t newuint16Var);
void* getPowerStateString(PropertyWidget* thisWidget); void setPowerStateString(char const* newTemp);
void* getPIRSensorStateString(PropertyWidget* thisWidget); void setPIRSensorStateString(char const* newTemp); void TurnOnLight(); void TurnOnNightLight(); void TurnOffLight(); enum { AJLight_Power_ON = 0, AJLight_Power_OFF = 1, AJLight_Power_NightLight = 2, }; enum { CFU_NO_CHANGES = 0, CFU_Power = (1 << 0), CFU_SensorState = (1 << 1), CFU_Dimmer = (1 << 2), }; uint32_t checkForUpdatesToSend();
enum { CFN_No_Events = 0, CFN_SensorNotification = (1 << 1), }; uint32_t checkForAsyncNotificationToSend(); #endif /* CONTROLPANELPROVIDED_H_ */
2.6.2. プロパティ更新通知の実装
ソースファイル ControlPanelSample.c および ControlPanelSample.h を作成し、プロパティが「IoT セ ンサーライト・デモ」側の動作により変更された場合にプロパティ更新通知を行う処理を実装します。 (手順 2.1①にてダウンロードしたサンプルソースコードから、フォルダ SensorLight にこれらのファイル をコピーしてください。) ここで実装する Controlee_DoWork()では以下の処理を実装しています。 1. LED の 点 灯 状 態 、 調 光 、 人 感 セ ン サ 状 態 の 変 化 の 有 無 を 調 べ ま す 。 (checkForUpdatesToSend 関数) 2. 変化があった場合(人感センサが反応して LED 照明が点灯した場合など)、 AJCPS_SendPropertyChangedSignalを使用して Signal を送信して、更新されたプロパテ
ィを通知します。Android 端末等の AllJoyn クライアントは、Signal を受信すると画面表 示のアップデート等の動作を行います。
void Controlee_DoWork(AJ_BusAttachment* busAttachment) {
uint32_t updates = checkForUpdatesToSend(); if (updates != 0) {
AJ_AlwaysPrintf(("##### Sending update signal: %x \n", updates));
if(updates & CFU_Power) {
AJCPS_SendPropertyChangedSignal(busAttachment,
EN_ALLJOYNBULB_POWERSTATESTRINGPROPERTY_SIGNAL_VALUE_CHANGED, AJCPS_GetCurrentSessionId()); }
if(updates & CFU_SensorState) {
AJCPS_SendPropertyChangedSignal(busAttachment,
EN_ALLJOYNBULB_PIRSENSORSTATESTRINGPROPERTY_SIGNAL_VALUE_CHANGED, AJCPS_GetCurrentSessionId());
}
if(updates & CFU_Dimmer) {
AJCPS_SendPropertyChangedSignal(busAttachment, EN_ALLJOYNBULB_DIMMER_SIGNAL_VALUE_CHANGED, AJCPS_GetCurrentSessionId()); } } return; }
2.6.3. イベント通知処理の実装
ソースファイル SensorNotificationProducer.c を作成し、イベント通知処理を実装します。 (手順 2.1①にてダウンロードしたサンプルソースコードから、フォルダ SensorLight にこれらのファイル をコピーしてください。) ここでは以下の処理を実装しています。 1. 人感センサ状態の変化の有無を調べます。 (checkForAsyncNotificationToSend 関数) 2. 変化があった場合(人感センサが反応した場合)、送信するメッセージ内容を指定して AJNS_Producer_SendNotification 関数でイベント通知を行います。Android スマート フォンの場合、イベント通知を受信すると、画面の通知領域にメッセージを表示して通知 音を鳴らす等の動作が行われます。void NotificationProducer_DoWork(AJ_BusAttachment* busAttachment) {
uint32_t notifications = checkForAsyncNotificationToSend(); if(notifications & CFN_SensorNotification) {
notificationContent.numTexts = NUM_TEXTS; textToSend[0].key = langEng;
textToSend[0].value = sensorPositiveNotificationString; notificationContent.controlPanelServiceObjectPath = NULL;
// set non-null ObjectPath when we want to popup some dialog on smartphones // notificationContent.controlPanelServiceObjectPath = getNotificationActionObjPath(); AJNS_Producer_SendNotification(busAttachment, ¬ificationContent,
AJNS_NOTIFICATION_MESSAGE_TYPE_INFO, AJNS_NOTIFICATION_TTL_MIN, NULL); }
2.6.4. AllJoyn 通信処理タスクの実装
ソースファイル ServerSample.c を作成し、AllJoyn 通信処理タスクのメインループ(AJ_Main 関数)を実 装します。 (手順 2.1①にてダウンロードしたサンプルソースコードから、フォルダ SensorLight にこれらのファイル をコピーしてください。) メインループは定型処理であるため、以下のサンプルソースをコピーして一部変更するだけで実装する ことができます。 C:¥Freescale¥Freescale_MQX_4_1¥ demo¥aj_slight¥allseen¥services¥base_tcl¥sample_apps¥ACServerSample¥ACServerSample.c 変更する部分は、機器名・バージョン・製造者名等の表示文字列および、アイコンデータなどです。 アイコンデータの画像ファイル形式は、PNG 形式です。
2.6.5. I/O 処理タスクの実装
「IoT センサーライト・デモ」では、人感センサの読み取り処理および、LED 電球調光用の PWM 信号出力 のデューティ比変更処理などの I/O 処理は AllJoyn 通信処理とは別のタスクで 50ms 毎に実行していま す。 ソースファイル pwm.c を下記のフォルダに作成し、I/O 処理用のタスクを実装します。 C:¥Freescale¥Freescale_MQX_4_1¥demo¥aj_slight¥alljoyn¥aj_sp140-141mqx¥src また、タスクのエントリポイントを MQX RTOS に登録するため、以下の 2 ファイルを編集してください。 C:¥Freescale¥Freescale_MQX_4_1¥demo¥aj_slight¥alljoyn¥aj_sp140-141mqx¥src¥aj_tasks.c C:¥Freescale¥Freescale_MQX_4_1¥demo¥aj_slight¥alljoyn¥aj_sp140-141mqx¥inc¥aj_tasks.h (手順 2.1①にてダウンロードしたサンプルソースコードから、これらのファイルををコピーしてください。)
2.7. ビルドおよび実行
① IAR Embedded Workbench for ARM のプロジェクトから、以下の既存サンプルソースコードを除去 してください。 ACNotificationProducerSample.c ACServerSample.c ControlPanelGenerated.c ControlPanelProvided.c ControlPanelSample.c EventsAndActionsSample.c ※下図画面例を参考に操作を行ってください。 これら 6 個のファイルを、それぞれ右クリッ ク→「オプション」を開き「ビルドから除外」 をチェックします。
② プロジェクト ServicesSamples に実装したソースファイルを追加してください。 ControlPanelGenerated.c ControlPanelProvided.c ControlPanelSample.c SensorNotificationProducer.c ServerSample.c pwm.c
③ プロジェクト ServicesSamples のプロパティを開き、 「C/C++コンパイラ」→「プリプロセッサ」→「シンボル定義」から EVENTS_AND_ACTIONS を削除 してください。 ④ BSP, PSP, ServicesSample の順にプロジェクトをビルドしてください。 ⑤ ビルドしたファームウェアを手順 2.2 で用意した「動作確認用ハードウェア」に書き込み、実行してくだ さい。
具体的な手順は「GT202KITS 開発環境セットアップ手順書」に記載の「デバッガ(OpenSDA J-Link ) の設定と、デバッグの開始手順」を参照してください。
⑤ Android 端末を用意し、アプリ「Dashboard for Alljoyn」をインストールしてください。 https://play.google.com/store/apps/details?id=org.alljoyn.dashboard
⑥ 「GT202KITS デモソフト操作手順書」に記載の「AllJoyn デモの操作手順」を参考に、実装した機能 の動作を確認してください。
3. ソースコードの構成
IoT センサーライト・デモのソースコード構成を下図に示します。
AllJoyn Thin-Core ライブラリを使って AllJoyn Service を実装しています。
bsp_frmdk22f120m:
MQX RTOS の FRDM-K22F ボード BSP (board support package)
GT202 Wi-Fi デバイスドライバ など psp_frmdk22f120m: MQX RTOS のカーネル Cortex-M4 依存コード など AJ_Target: RTOS・デバイス依存処理部です。 この部分は、使用する RTOS・マイコンに合わせ て実装する必要があります。 Wi-Fi (GT202)と AllJoyn ライブラリのイ ンタフェース MQX RTOS タスクのエントリポイント 不揮発メモリアクセス、乱数生成など、 AllJoyn ライブラリの低レベル I/O 処理 「IoT センサーライト・デモ」の I/O 処理 SampleApps/SensorLight: 本ドキュメントの手順で実装したカスタム アプリケーション(AllJoyn Service)です。 SampleApps/AppsCommon カスタムアプリケーションの内容によらな い、共通処理です。 AJ_Core AllJoyn Thin-Core ライブラリ
AJ_Services/Common, ControlPanel, Config, Notification, Onboarding:
ControlPanel, Config, Notification, Onboarding 等の標準 Alljoyn Service を提 供します。
4. AllJoyn フレームワークに関する追加情報
ここでは、AllJoyn フレームワークを使用した IoT 機器設計の参考のため、IoT センサーライト・デモにおける AllJoyn フレームワークの使用について補足します。
4.1. AllJoyn に関する技術情報、ソフトウェアの入手方法
AllJoyn Framework は Allseen Alliance が提供するオープンソースソフトウェアです。
技術情報(アーキテクチャ、API 等のドキュメント)、ソースコードの入手方法については、Allseen Alliance の Web サイトをご参照ください。
https://allseenalliance.org/
Windows10 では、AllJoyn が標準 API の一部として提供されます。 MSDN で API、開発ツールの使用方法等を参照できます。
4.2. Thin-Core ライブラリと Standard-Core ライブラリの差異について
AllJoyn Framework は Thin-Core と Standard Core の 2 種類のライブラリが提供されます。 これらの主要な差異は以下の通りです。 Standard-Core Thin-Core スマートフォン・PC など、リソースに余裕がある機 器向け マイコン等、リソースが限られる機器向け (各種 RTOS) ※Linux, Windows 等でも動作可能 AllJoyn Router を搭載します。 同一 OS 上に複数の AllJoyn アプリ (クライア ント・サービス)を動作させることが可能です。 AllJoyn Router を搭載しません。 同一 OS 上で複数の AllJoyn アプリを動作さ せることができません。 同一 LAN 上の他の機器に搭載されている AllJoyn Router を経由しないと、通信が行えま せん。 クラウド等へのゲートウェイ機能を持たせることが 可能です。 同一 LAN 内の通信のみ可能です。 クラウド等とのインタフェースは、他の AllJoyn 機器 上のゲートウェイ機能を経由して行います。 IoT センサーライト・デモでは、Thin-Core ライブラリを使用しています。
4.3. ネットワーク構成に関する留意事項
① IoT センサーライト・デモは Thin-Core ライブラリを使用しているため、AllJoyn Router を搭載していま せん。このため、同一 LAN 上で動作している Standard-Core 搭載機器上の AllJoyn Router を経由 しない限り他の AllJoyn 搭載機器との通信が行えない仕様となっています。
AllJoyn Thin-Core Library を利用した IoT ソリューションの開発にあたってはこの点にご留意いただ き、以下の点を考慮するようにしてください。
同一 LAN 上に最低 1 台の Standard-Core 搭載機器を用意する
AllJoyn Router は常時電源 ON とするか、通信が必要な時に起動できるよう設計する
IoT センサーライト・デモの場合、Android タブレット上の AllJoyn Router を経由して、タブレット上で 動作している AllJoyn クライアント (Dashboard for AllJoyn)と通信しています。
② クラウド対応など、外部ネットワークとの通信を行う場合は、Standard Core ライブラリ搭載機器上に ゲートウェイ機能を設け、クラウド側の仕様に合わせてゲートウェイを実装する必要があります。 この場合のソフトウェア構成としては、下図のような形態が考えられます。
Gateway Agent のソースコード等は下記にて入手可能です。 https://wiki.allseenalliance.org/gateway/gatewayagent