4.製品の開発

ユビキタス環境制御システムは、各社のノードが相互に接続できるように仕様を揃えることが重要です。そうしないと、各ノードが自律分散して協調した環境制御が達成できませんし、共通のソフトウェアも動作しなくなってしまいます。開発されたノードがユビキタス環境制御システム対応のノードとして認められるためには、まず、ユビキタス環境制御システム研究会で合意された規約に適合した通信ができる必要があります。規約の基本的文書につきましては、「UECSの概要」に通信基本規約がございますのでご覧ください。このため、ユビキタス環境制御システムの試作や製品開発をお考えの方は、まず、ユビキタス環境制御システム研究会に入会していただき、規約の趣旨をご理解いただくとともに、その重要性を共有していただきたくお願い申し上げます。

とはいっても、入会されて期待外れということになるといけませんので、ここでは、ある程度詳しく具体的に開発方法についてご紹介したいと思います。これをご覧になり、開発したい、あるいは、できそうだと感じられた方は、ぜひ、研究会にご入会願います。

4.1 開発するノードの概要

ユビキタス環境制御システム応用製品の開発、試作は、ご自身でコンピュータハードウェアを選定・設計いただき、そこに規約に則った計測制御情報の通信ができるソフトウェアを書き込んでいただければ可能です。しかし、このようなことを独自でできる方はあまり多くないと思います。そこで、ここでは、ユビキタス環境制御システム研究会に入会し、会員になると、ホルトプランから購入できるUECS標準コンピュータ基板(USE: ユーズ)と、専用のミドルウェア(USEを動かすためのオペレーティングシステムおよびライブラリ群)(EOLUS: イオラス)を使って、ノード開発に必要な作業を説明したいと思います。とても簡単に開発できることが実感できると思います。難易度は、私の大学の学部3年生に6時間程度教えると、もう、自分でノードのプログラムを書きはじめられる程度です。

組み込みコンピュータ基板USEとミドルウェアEOLUSを使ったUECSのノード開発の実際について、その雰囲気を理解してもらう目的で以下では解説します。温度センサ、ポテンショメータ、発光ダイオード(LED)、押しボタンスイッチを取り付けた、簡単なデモンストレーション用ノードの実際の開発プロセスを例にします。なお、プログラミングにはC言語を使用します。使用するUSEは、製品型番N04002Aのものです。今後、製品の改訂も予想されるので、相違点は、そのUSEに添付の説明書で確認し、適宜読み換えてください。


製品型番N04002AのUSE

USEとEOLUSの入手は、ユビキタス環境制御システム研究会入会後、USEの販売会社であるホルトプラン株式会社に会員であることを告げて発注してください。USEにはいくつかのオプションと機能のバリエーションがありますが、一番基本的な構成ならば、1枚およそ1万円余の価格で入手できると思います。EOLUSはメディア代等の実費を除き、サポートなしの場合は原則無償で提供されています。

組み込みコンピュータ基板USEの主な仕様
CPU H8/3048F-ONE 20MHz (ルネサステクノロジ)
ROM 128kB(CPU内蔵)
RAM 512kB(8bit接続時)
1024kB(16bit接続時)
Ethernetコントローラ RTL8019AS (Realtek社) 16bit接続
シリアルインタフェース RS232C電圧レベル 2チャンネル
サージ保護回路 Ethernetポートに3段階
その他機能 EEPROM(64kB)、LCDインタフェース、設定用DIP-SW(8bit)、CPU監視IC(WDT)
大きさ 70mm X 110mm (突起部含まず)

ミドルウェアEOLUSを動作させるために必要な開発環境
コンパイラgcc
バイナリツールbinutils
統合開発環境Eclipse + CDT
Windows用GNUツール動作環境 Cygwin

4.2 ハードウェアの設計・製作

ノードを開発するにあたり、まず、USEとそれを組み込む環境制御機器やセンサの周辺にどのような回路が必要かを左下に示します。USEの入出力信号の電気的特性を、組み込む環境制御機器やセンサの特性と合わせるインターフェース回路が必要になります。また、ノードを操作するための表示器やスイッチが必要であれば、それも含めます。さらに、USEに必要な直流5Vの電源回路も用意します。図の白抜き部分の設計と製作が必要です。右下に示すように、USE基板の裏面には、2個の25ピン×2列のピンヘッダソケットが用意されています。一方には主にMPUからのバス信号が、もう一方には主に入出力信号が接続されています。このソケットに合うように、インターフェース回路の基板を製作し、ピンヘッダを取り付けて、そこにUSE基板を挿して固定できるようにするのが一般的です。今回は、入出力信号を主に扱うので、後者のソケットだけを使用します。


USEに必要な周辺回路の機能

USE裏面のソケット

今回は、温度センサ、ポテンショメータ、LED、押しボタンスイッチを取り付けた、簡単なデモンストレーション用ノードを製作します。このために設計した回路例を下に示します。USE基板のピンヘッダソケットの信号配置、電気的特性、寸法などの詳細情報については、USEを入手した際に添付されているUECS標準CPUカード説明書に記載されていますので、そちらを参照してください。電源回路については記述していませんが、今回のケースでは、直流5Vで0.3A程度のACアダプタやスイッチングレギュレータを用意すれば十分です。7個の押しボタンスイッチが10KΩの抵抗でプルダウンしてA系列の入出力信号端子に接続されています。アナログ電圧入力端子の0番に0~5Vの可変電圧が出力されるようにポテンショメータを接続しています。一方、アナログ電圧入力端子の1番にはサーミスタ温度センサが接続されています。温度が高いほど、5Vに近い電圧が出力されるようになっています。B系列の入出力信号端子には、電流ドライバ用のIC(U1)を通して、7個のLEDを取り付けました。それぞれの入出力端子にH(1)レベルの信号が出力されると、そのLEDが点灯するようになっています。また、USE基板に用意されている液晶表示器(LCD)接続用のソケットに、ごく一般に市販されている16字×2行のLCDを取り付けました。


開発するノードのUSE周辺回路図

この回路図に従って製作した実際のインターフェース回路基板を左下に示します。部品代はおよそ3000円弱でした。この基板にUSEを取り付け、5VのACアダプタをソケットに差し込めば、デモンストレーション用ノードのハードウェアは完成です。


製作したノードのUSE周辺回路

4.3 ソフトウェア開発環境の構築

ノードのソフトウェア開発は、シリアルポート(RS-232c)が使用できるパソコンを使って行います。シリアルポートの無いパソコンを使う場合には、USB-シリアル変換ケーブルなどのアダプタを用意します。OSはMicrosoft Windows®系(XPやVistaなど)を使用します。パソコンが用意できたら、次は、EOLUSを使用できる環境をパソコンに構築します。

EOLUSは、開発のイニシャルコストを低減するために、ライセンス料が基本的に無料のソフトウェアで利用できるようにしています。以下の例で述べます開発環境の構築に必要なソフトウェアは、EOLUSの配布CDまたはインターネットからインストールできます。最も簡単な方法は、USEを購入してEOLUSの配布CDを入手して開発環境を構築することです。また、各ソフトウェアのバージョンは筆者が使用している開発環境でのバージョンを示しています。したがって、かなり古いバージョンを使用しているものもあります。今後新たに配布されるEOLUSのCDに収録されるソフトウェアのバージョンは、順次新しいものに改訂されていく予定です。その場合、CDに収録されたスタートアップガイド等のマニュアルを参照して、適宜読み換えてください。ここでの開発に必要なソフトウェアは、cygwin、gcc、binutilis、newlib、eclipsなどです。


cygwinインストール時に変更するオプション

まず、cygwinのセットアップをダウンロードし、実行します。インストール先のディレクトリは、C:\cygwinにします。このときに注意することは、上に示す通り、開発ツールを必要とするので、インストールするパッケージのDevelのところをクリックしてInstallに変更することです。続いて、USEに使われているMPUに合わせた、Cコンパイラ、リンカ、標準ライブラリ、バイナリコンバータなどをインストールします。これは、EOLUSの配布CDの\compiler_kitにDevTool.exeというファイル名でまとめられています。これを実行すれば、gcc、binutilis、newlibなどがまとめてインストールされます。DevToolは、c:\cygwin\usr\localにインストールします。CDでは、gcc ver.3.4.3、binutilis ver.2.15、newlib ver.1.13.0を使用しています。そして、統合開発環境であるeclipseを導入します。eclipseは、エクリプスファウンデーションからダウンロードすることが可能です。さらに、C言語を使用するためのパッケージcdtの導入も必要です。ここでは、EOLUSの配布CDの\eclipseに収録されている、eclipse-SDK-3.0.2-win32.zipとorg.eclipse.cdt-2.0.2-win32.x86.zipを解凍し、生成されたeclipseフォルダをそのまま、c:\に移動します。cdtも同様にして、同じフォルダに上書きします。さらに、それぞれの日本語化のパッケージである、NLpack-eclipse-SDK-3.0.x-win32.zipとNLpack-org.eclipse.cdt-2.0.x-win32.x86.zipも同様にして解凍して生成したeclipseフォルダをc:\eclipseフォルダに上書きします。最後に、cygwinに関連する実行ファイルのパスを通すため、Windowsの環境変数のPathの記述に、;c:¥cygwin¥bin;c:¥cygwin¥usr¥local¥binを加えます。

最後にワークスペースの設定とEOLUSの導入を行います。まず、eclipseを起動します。最初の実行でワークスペースを入力するように求められるので、こごてはc:\eolusとします。続いて、eclipseのファイルメニューから新規でプロジェクトを選択し、プロジェクトの種類をCのスタンダードMake Cプロジェクトとして、次へのボタンをクリックする。プロジェクト名は、ここでは、USEdemoとし、次へのボタンをクリックします。そして、C/Makeプロジェクトの設定ウインドウで、Makeビルダータブをクリックし、ビルト・コマンドがc:\cygwin\bin\makeになっていることを確認します。そうでない場合は修正して、終了ボタンを押します。そして、一旦eclipseを終了し、EOLUSの配布CDの\eolus\packにあるファイルとフォルダすべてを、先程作成したプロジェクトのフォルダであるc:\eolus\USEdemo\にコピーします。EOLUSの\eolus\packにあるファイルおよびフォルダの簡単な説明を下にまとめました。これで、EOLUSが導入され、すべての開発環境が整いました。

EOLUSパッケージの中のファイル・フォルダの内容
ファイル・フォルダ名 内容
EOLUS EOLUSのパッケージが収められているフォルダ。
Makefile プロジェクトをMake するための処理定義ファイル。
h83048.x メモリマップ定義ファイル。
UserMain.c ユーザが用意すべきプログラムを記述するファイル。メインルーチンに相当する関数Main_Tsk()や、初期化関数SystemOnCreate()、NetworkOnStart()のなどのフレームがあらかじめ記述されているので、それらに必要なC言語コードを埋め込むだけである程度のプログラムの開発ができる。
UserHWAccess.c ユーザのハードウェアアクセス用ルーチンUserHWsetup()が納められている。ハードウェア依存のC言語コードを書く場所。

4.4 プログラミングとビルド

製作したデモンストレーション用ノード用のハードウェアを動作させるソフトウェアを開発するためのプログラミングの手順についての要約をここでは述べます。説明を簡単にするためと、コア部分の情報が含まれるため、共用通信子(UECS-CCM)による計測制御データの他ノードとの通信部分のコード作成は省略しました。

まず、eclipseを起動し、USEdemoプロジェクトを開きます。Makefileを開いて、その中のTARGET2 = USER.motの記述を、TARGET2 = USEdemo.motに変更します。こうすることによって、完成したソフトウェアのファイル名がプロジェクト名と同じUSEdemo.motになります。


Makefileの修正

続いて、C言語でプログラムのコードを記述します。まず、ファイル名の一覧の部分でマウスの右ボタンをクリックして、専用のヘッダーファイルUSEdemo.hを追加し、下に示した内容を記述します。ここでは使用する入出力ポートの定義や関数のプロトタイプ宣言を行っています。

//***********************************************
//  In UserMain.c
//***********************************************
extern unsigned char IOInA[8];		// ポートAの入力値
extern unsigned char IOOutB[8];		// ポートBの出力値
extern unsigned short ADInData[8];	// Ainポートの入力値

//***********************************************
//  In UserHWAccess.c
//***********************************************

// 出力処理
void DOutPrc(void);

// 入力処理
void DInPrc(void);

// AD変換を行い、データを返す
unsigned short AD_DoConv(unsigned char CH);

ヘッダーファイルUSEdemo.hのリスト

そして、既存のC言語ソースファイルUserHWAccess.cの内容を下記の通り入力します。ここでは、インターフェース回路のハードウェア通りに、A系列を押しボタンの入力用とし、B系列をLED点灯の出力用と設定しています。そして、どのボタンが押されたか、どのLEDを点灯するかのビットマスクの処理と、アナログ電圧値のAD変換が記述されています。

//***********************************************
//	usedemo T.Hoshi 2008/10/14  UserHWAccess.c
//	originated by Y.Hayashi
//***********************************************
#include "iodefine.h"
#include "USEdemo.h"

// 変数宣言
unsigned char IOInA[8];		// ポートAの入力値
unsigned char IOOutB[8];	// ポートBの出力値
unsigned short ADInData[8];	// Ainポートの入力値

//*********************************************************
// EOLUS システムコール部
//*********************************************************

// ユーザ・ハードウェアイニシャライズ
// 起動直後、useのハードウェアイニシャライズ直後に呼ばれる
void UserHWsetup(void)
{
	// デジタルIO Aポートの初期化
	PA.DR.Byte = 0x00;	
	PA.DDR = 0x00;		// 全入力モード
	// デジタルIO Bポートの初期化
	PB.DR.Byte = 0x00;	
	PB.DDR = 0xff;		// 全出力モード
}

//*********************************************************
// デジタルIO操作部
//*********************************************************

// 出力処理
void DOutPrc(void)
{
	unsigned char DOutPtn;	// 出力ビットパターン
	signed char chA;
	// 出力パターンに変換
	DOutPtn = 0;
	for(chA = 7; chA >= 0; chA--){
		DOutPtn = DOutPtn << 1;
		if(IOOutB[chA] != 0){
			DOutPtn = DOutPtn | 0x01;
		}
	}
	PB.DR.Byte = DOutPtn;	// 出力処理
}

// 入力処理
void DInPrc(void)
{
	unsigned char DInPtn;	// 入力ビットパターン
	unsigned char chA;
	// 入力処理
	DInPtn = PA.DR.Byte;
	// 入力パターンをデータに保管
	for(chA = 0; chA < 8; chA++){
		if((DInPtn >> chA) & 0x01 == 0x01){
			IOInA[chA] = 1;
		} else {
			IOInA[chA] = 0;
		}
	}
}

//*********************************************************
// AD 変換実行部
//*********************************************************

// AD変換器の初期化
void AD_Setup(void)
{
    AD.ADCR.BIT.TRGE = 0;  // 外部トリガ不使用
    AD.ADCSR.Byte = 0x00;  // フラグクリア、割込み無、単一モード、134ステート、AN0
}

// AD変換の開始
void AD_Start(unsigned char CH)
{
    AD_Setup();
    AD.ADCSR.BIT.CH = CH & 0x07;
    AD.ADCSR.BIT.ADST = 1;
}

// AD変換終了したか?
char AD_Fin(void)
{
    return AD.ADCSR.BIT.ADF;
}

// AD変換の結果を得る
unsigned short AD_GetData(unsigned char CH)
{
    unsigned short shR;
    switch(CH){
        case 0 :
        case 4 : shR = AD.ADDRA; break;
        case 1 :
        case 5 : shR = AD.ADDRB; break;
        case 2 :
        case 6 : shR = AD.ADDRC; break;
        case 3 :
        case 7 : shR = AD.ADDRD; break;
        default : return 0;
    }
    return (shR >> 6);
}

// AD変換を行い、データを返す
unsigned short AD_DoConv(unsigned char CH)
{
    AD_Start(CH);
    while(AD_Fin() == 0) ;
    return AD_GetData(CH);
}

C言語ソースファイルUserHWAccess.cのリスト

最後に、下記の通り、UserMain.cにメインプログラムのコードを記述します。内容は、DoIOPrc()で一連の計測制御処理を実行します。そして、1秒間隔でIOD1SOnChange()が呼び出され処理が必要なフラグが立てます。そして、ブラウザによるLED点灯指示の命令が出されるとIODWebOnChange()が呼び出されます。アイドル時にEOLUSから呼び出されるMain_Tsk()の中で、1秒ごとの処理が必要なフラグをチェックし、LCDにスイッチの状態と、ポテンショメータとサーミスタの計測電圧を表示します。ノード情報設定の部分で、このノードの暗黙値のプライベートIPが192.168.1.192と設定され、開発者の情報も、メーカーメッセージの部分とともに記述されます。これらは、ブラウザからノードを呼び出したり、ノードの緒元をページに表示したりするために必要です。ブラウザのノード独自機能のページは3ページ分設定され、NetworkOnStart()で、アナログ入力状態、デジタル入力状態、デジタル出力状態・設定と命名されています。各ページの表示内容は、その上の部分で、TUIDataSet型の配列定数として記述されています。

//***********************************************
//	usedemo T.Hoshi 2008/10/14  UserMain.c
//	originated by Y.Hayashi
//***********************************************
#include "SysUser.h"
#include "WebCgi.h"
#include "LCDLib.h"
#include "USEdemo.h"
#include <stdio.h>

// 変数宣言
static SecIntOn;	// 1秒間隔のイベント発生フラグ

// 入出力処理 管理
void DoIOPrc(void)
{
	char chA;
	unsigned short shA;
	DOutPrc();	// 出力処理
	DInPrc();	// 入力処理
	for(chA = 0; chA < 8; chA++){
		shA = AD_DoConv(chA);		// AD変換実行	
		ADInData[chA] = ((float)shA * 5000) / 1024;
	}
} 

// 秒おきのOnChangeイベント
void IOD1SOnChange(void)
{
	SecIntOn = 1; //イベント発生フラグセット
}

// Webの設定変更OnChangeイベント
void IODWebOnChange(void)
{
	DoIOPrc();
}

// 無負荷時に、Callされる
void Main_Tsk(void)
{
	signed char ch, volt[17] ;
	if(SecIntOn != 0){  //イベント発生フラグで1秒処理が必要か判断
		SecIntOn = 0;
		DoIOPrc();
		// 液晶表示
		LCD_Setpos(0,0) ;
		LCD_Puts("SW in: ") ;
		for(ch = 6; ch >= 0; ch--) {
			if(IOInA[ch] == 0)
				LCD_Puts("x") ;
			else
				LCD_Puts("o") ;
		}
		sprintf(volt,"<%4dmV, %4dmV>", ADInData[0], ADInData[1]) ;
		LCD_Setpos(1,0) ;
		LCD_Puts(volt);
	}
}

// ノード情報設定
const TVenderSet SysSet ={
	IPAdr(192,168,1,192),
	"UECS card test node",
	"Hoshi lab., Tokai univ.",
	"http://www.fb.u-tokai.ac.jp/",
};

// メーカメッセージ
const char CampanyMessage[] = {
	"<BLOCKQUOTE>東海大学開発工学部星研究室<BR>"
	"<BR>"
	"〒410-0395 静岡県沼津市西野317<BR>"
	"TEL: 055-968-1111 FAX: 055-968-1156<BR>"
	"URL: <A href=\"http://www.fb.u-tokai.ac.jp/\">http://www.fb.u-tokai.ac.jp/</A><BR>"
	"</BLOCKQUOTE>"
};

// 初期化の際、一度だけ呼び出される
void SystemOnCreate(void)
{
	char chA;
	SetSystemSet(SysSet);
	// 変数を初期化する。
	for(chA = 0; chA < 8; chA++){
		IOInA[chA] = 0;
		IOOutB[chA] = 0;
		ADInData[8] = 0;	
	}
	// 液晶画面のクリア	
	LCD_Clear() ;
	// インターバルタイマの設定
	SetTimerService(st_1s, IOD1SOnChange);
}

//Web設定ページ定義
const TUIDataSet TopStsData[8] = {
	// データポインタ、 データ型、    ラベル、   単位、表示方法、  表現方法、   選択候補、最大値、最小値、背景色
	{&ADInData[0],      dc_us_short,  "計測0",  "V",  uis_Status, sm_decimal_3, "",      0,      0,      0xffff9E},	
	{&ADInData[1],      dc_us_short,  "計測1",  "V",  uis_Status, sm_decimal_3, "",      0,      0,      0xffffff},	
	{&ADInData[2],      dc_us_short,  "計測2",  "V",  uis_Status, sm_decimal_3, "",      0,      0,      0xffff9E},	
	{&ADInData[3],      dc_us_short,  "計測3",  "V",  uis_Status, sm_decimal_3, "",      0,      0,      0xffffff},	
	{&ADInData[4],      dc_us_short,  "計測4",  "V",  uis_Status, sm_decimal_3, "",      0,      0,      0xffff9E},	
	{&ADInData[5],      dc_us_short,  "計測5",  "V",  uis_Status, sm_decimal_3, "",      0,      0,      0xffffff},	
	{&ADInData[6],      dc_us_short,  "計測6",  "V",  uis_Status, sm_decimal_3, "",      0,      0,      0xffff9E},	
	{&ADInData[7],      dc_us_short,  "計測7",  "V",  uis_Status, sm_decimal_3, "",      0,      0,      0xffffff},	
};

const TUIDataSet DInStsData[7] = {
	// データポインタ、 データ型、   ラベル、           単位、表示方法、  表現方法、  選択候補、最大値、最小値、背景色
	{&IOInA[0],         dc_us_char,  "デジタル入力0",  "",   uis_Status, sm_strings, "Low,Hi", 1,      0,      0xE0ffff},	
	{&IOInA[1],         dc_us_char,  "デジタル入力1",  "",   uis_Status, sm_strings, "Low,Hi", 1,      0,      0xffffff},	
	{&IOInA[2],         dc_us_char,  "デジタル入力2",  "",   uis_Status, sm_strings, "Low,Hi", 1,      0,      0xE0ffff},	
	{&IOInA[3],         dc_us_char,  "デジタル入力3",  "",   uis_Status, sm_strings, "Low,Hi", 1,      0,      0xffffff},	
	{&IOInA[4],         dc_us_char,  "デジタル入力4",  "",   uis_Status, sm_strings, "Low,Hi", 1,      0,      0xE0ffff},	
	{&IOInA[5],         dc_us_char,  "デジタル入力5",  "",   uis_Status, sm_strings, "Low,Hi", 1,      0,      0xffffff},	
	{&IOInA[6],         dc_us_char,  "デジタル入力6",  "",   uis_Status, sm_strings, "Low,Hi", 1,      0,      0xE0ffff}	
};

const TUIDataSet DOutStsData[8] = {
	// データポインタ、 データ型、   ラベル、           単位、表示方法、     表現方法、  選択候補、最大値、最小値、背景色
	{&IOOutB[0],        dc_us_char,  "デジタル出力0",  "",   uis_Setpoint,  sm_strings, "OFF,ON", 1,      0,      0xffEBEB},	
	{&IOOutB[1],        dc_us_char,  "デジタル出力1",  "",   uis_Setpoint,  sm_strings, "OFF,ON", 1,      0,      0xffffff},	
	{&IOOutB[2],        dc_us_char,  "デジタル出力2",  "",   uis_Setpoint,  sm_strings, "OFF,ON", 1,      0,      0xffEBEB},	
	{&IOOutB[3],        dc_us_char,  "デジタル出力3",  "",   uis_Setpoint,  sm_strings, "OFF,ON", 1,      0,      0xffffff},	
	{&IOOutB[4],        dc_us_char,  "デジタル出力4",  "",   uis_Setpoint,  sm_strings, "OFF,ON", 1,      0,      0xffEBEB},	
	{&IOOutB[5],        dc_us_char,  "デジタル出力5",  "",   uis_Setpoint,  sm_strings, "OFF,ON", 1,      0,      0xffffff},	
	{&IOOutB[6],        dc_us_char,  "デジタル出力6",  "",   uis_Setpoint,  sm_strings, "OFF,ON", 1,      0,      0xffEBEB},	
	{&IOOutB[7],        dc_us_char,  "デジタル出力7",  "",   uis_Setpoint,  sm_strings, "OFF,ON", 1,      0,      0xffffff},	
};

// ネット開始
void NetworkOnStart(void)
{
	// HTML 関係の設定は、ここで行う	
	SetHTMLTopMonData(8, (TUIDataSet *)TopStsData);
	SetHTMLTopMonMsg("IOデモ");
	SetHTMLNodeMessage((char *)CampanyMessage);	// HTMLのノードページに表示するメッセージを設定する
	SetHTMLSetpointData(0, "アナログ入力状態", 8, (TUIDataSet *)TopStsData);
	SetHTMLSetpointData(1, "デジタル入力状態", 7, (TUIDataSet *)DInStsData);
	SetHTMLSetpointData(2, "デジタル出力状態・設定", 8, (TUIDataSet *)DOutStsData);
	Set_WebSetpointOnChange(3, IODWebOnChange);
}

C言語ソースファイルUserMain.cのリスト

これで、すべてのコードの記述が終わったので、eclipseのプロジェクトメニューからクリーンを選択し、ビルドを即時に開始をクリックします。もし、コンパイルやリンクにエラーがあるとそれらが表示され処理は中断します。ビルドがうまくいくと、USEdemo.motファイルができます(下図)。これが、USEに書き込めるバイナリファイルになります。最後にeclipseを終了します。


USEdemo.motファイル生成の確認

OSやeclipseのバージョンにより、「問題」のタブウインドウに「外部スキャナー情報生成プログラム起動中のエラー」というビルドのエラーが出ることがあります。このときには、Eclipseのプロジェクトメニューの「プロパティ」で、「ディスカバリー・オプション」のタブウインドウ内の「スキャナー情報コマンドの生成を有効にする」のチェックボックスをOFFにすることで、表示されなくなります。

4.5 USEへの書き込み

作成したソフトウェアをUSEのMPUに書き込むには、パソコンのシリアルポートを使ってソフトウェアを送ります。パソコンのシリアルポートは、D-SUB9ピンコネクタなので、それとUSEを接続するためのケーブルを下の回路図の通り作成し、USEのシリアルポート0のコネクタとパソコンのシリアルポートのコネクタとを接続します。


USEをパソコンのシリアルポートに接続するためのケーブル回路図

USEのMPUはH8/3048F-ONEというルネサステクノロジ社の製品を使用しています。そこで、このMPUのフラッシュメモリにソフトウェアを書き込むためのフラッシュ開発ツールキット (Flash Development Toolkit)をダウンロードしてパソコンにインストールする必要があります。開発環境のページからプログラマ/フラッシュ書き込みソフトを選択し、ダウンロードの項目を捜し、フラッシュ開発ツールキット(FDT)の無償評価版を無償のユーザ登録ののちにダウンロードして、指示に従いパソコンにインストールします。 Webページが更新されてしまっていたら、「FDT」というキーワードでサイト内を検索すると見つかると思います。インストールのとき注意しなければならない点は、Select Optionsのウインドウが表示されたとき、.motのチェックボックスにチェックを入れることです。以下ではFDT ver.4.02をパソコンにインストールした場合で説明します。


USEの4Pディップスイッチの設定

製作したインターフェース基板にUSEを取り付けます。次に、USEの基板にある4PのDIPスイッチを上の通りブートモード6の設定にし、先程製作したケーブルでパソコンと接続します。USEに電源を供給し、念のため、USEのリセットボタンを一度押します。次に、インストールしたFDTのBasic版をパソコンで起動し、デバイスとカーネルの設定画面でH8/300HのH8/3048BFを選択し、次へのボタンをクリックします。次のウインドウで、接続したシリアルポート(COM*)を選択し、次へのボタンをクリックします。次のウインドウで、入力クロックを20MHzにし、次へのボタンをクリックします。次のウインドウで、接続モードをブートモードにし、ボーレートのUse Defaultのチェックをはずして、57600にし、次へのボタンをクリックします。そして、完了ボタンをクリックすると設定は完了です。書き込みのウインドウが出ますので、User/Data Areaにチェックを入れ、三角マークのボタンをクリックして、先程作成したUSEdemo.motファイルを選択します。後は、スタートボタンを押すと、1分程度で書き込みが完了します。FDTを終了し、USEの電源を切ります。USEのディップスイッチを上図の下のモード6に直しておきます。

4.6 動作確認


電源投入時のLCD表示例

USEに電源を供給し、LCDに上のような表示が現れれば、ほぼ正常に動作していると思われます。押しボタンスイッチを押したり、ポテンショメータを回したり、サーミスタを指で挟んだりしてみて、LCDの表示が変化することを確認します。次に、パソコンのネットワークの設定で、自分のIPアドレスを192.168.1.10などにして、サブネットマスクを255.255.255.0にして、USEのRJ-42コネクタとパソコンのネットワークコネクタをネットワークケーブルで接続します。リバースを自動認識しない古いネットワークカードを使ったパソコンの場合は、リバースケーブルを用いるか、HUBを介して接続してください。そして、パソコンでWebブラウザを起動しアドレス欄にhttp://192.168.1.192/と入力して接続します。正常に動作していれば、デモンストレーション用ノードのトップページが表示されます。時計機能の部分はプログラミングを省略したので、表示される時刻が正しくなくても特に問題はありません。設定のデジタル出力状態・設定画面で、下のように設定したときに点灯するLEDのパターンを示します。


Webページからデジタル出力を指定したときのLEDの点灯パターン

4.7 最後に


学生が製作したUECSによる温室環境制御の展示模型

USEとEOLUSを使用することで、UECS対応ノード開発が容易になり、生産性は著しく向上します。5枚のUSEを使用した、温室の暖房、天窓開閉、遮光カーテン開閉、屋内気象、屋外気象ノードからなるUECSの展示模型の製作で、着手するまでほとんどUECSに知識のない大学4年次の卒業研究生2名が半年程度の期間で上に示したものを完成することができました。模型の中にはヒータやファンなどが実際に組み込まれていて、本当に気温の制御もできるようになっています。この事例からも、今回紹介したツールの開発により、UECS対応ノードを農業施設関連会社が製造するハードルはかなり低くなったと判断しても良いのではないでしょうか。




Copyright 2010 Ubiquitous Environment Control System Consortium