XBee-ZB で ZigBee ネットワーク構築とリモート DIO 操作

ABS-9000 DeviceServer に新しく XBee-ZB Series2 デバイスを管理するためのサービスモジュールをリリースしました。ここでは、このXBee-ZB 用の ZB サービスモジュールを使って簡単なZigBee センサーネットワークを構築する例を紹介したいと思います。この記事で説明しきれない部分については、ホームページ または、下記のマニュアルも併せてご覧ください。

セットアップガイドでは XBee-ZB デバイスの初期設定やマスター登録について説明しています。ユーザーマニュアルではXBee-ZB のイベントハンドラやAPI ライブラリ関数について詳しく説明しています。

今回の構築例では、ZigBee の各デバイスタイプ(coordinator, router, end device) をそれぞれ1つずつ使用してネットワークを作成しています。end device には下記の様にスイッチと LED を搭載した回路をブレッドボードで作成して簡単な機能を実現しています。

ブレッドボード上のタクトスイッチはデジタル入力に設定した XBee-ZB の DIO#11 に接続しています。このスイッチを押すごとに IO イベントデータが coordinator(DeivceServer) に送信されます。また、LED を XBee-ZB の DIO#1 に接続して点灯・消灯 できるようにします。今回のセンサーネットワークで実現する機能は、この end device のスイッチを押すと LED が点灯して、再びスイッチを押すと LED が消灯するような動作を繰り返します。router デバイスでも同様の回路を作成して、スイッチと LED を連動させた同じ動作を行います。

単純な動作ですが、XBee-ZB デバイスのリモートコマンド操作、 IO イベント送信機能とサーバー側の処理と合わせて実現します。

end device では cyclic sleep モードで動作しています。スイッチを押すと同時に end device がcyclic sleep を抜けてデバイスがwake up 状態になります。これは XBee-ZB 9pin に wake up (アクティブ Low) 信号を加えることで実現します。このため XBee-ZB はcyclic sleep with pin wake モード(5) を使用しています。wake up 信号を使用しない場合には、end device デフォルトの cyclic sleep モード(4) を使用しても問題なくスイッチ入力に反応して IO イベントを送信できます。ただこの場合は少し、スイッチの反応が遅くなります。デフォルトのスリープパラメータを変更してスリープに入る時間やポーリングの間隔を変更する場合には、wake up 信号を使用する方法がいいと思います。

以下のキャプチャは end device を DeviceServer のデバイス管理プログラムの詳細設定画面( Sleep タブ) で設定している様子です。デバイス管理プログラムのマスター登録や詳細設定については後で紹介する動画もご覧ください。

Sleep Mode を 5 に設定しています。画面下部分の DIO8 タブで XBee-ZB デバイス 9pin の wake up ラインのプルアップを有効にしています。9pin にはダイオード経由でDIO#11 デジタル入力ピンと同じ値を入力します。ダイオードを使用しないでラインを直結しても動作しますが、wake up 信号をテスト的に入れたり、複数のスイッチ入力に改造するときに誤動作させないために念のため入れておきます。

以下は DIO#11 設定の様子です。

DIO#11 のモードを 3 (digital input) に設定します。同時にプルアップ と change detect を有効にして DIO#11 に接続したスイッチを操作したときに IO イベントデータを送信するようにします。送信先は下記の Addressingタブで設定します。

Destination address High/Low をデフォルト値の 0 に設定して、IOイベントデータが coordinator デバイス(DeviceServer を接続しています)に送信されるようにします。また ZigBee ネットワークのテスト時に便利な “コミッションボタン” を追加する場合に備えて、DIO#0 のモードを 1にしてプルアップも有効にしておくことをお勧めします。

スイッチを押すと DIO#11 は High -> Low に変化します。この時 DIO#11 XBee-ZB のIO イベントデータが coordinator に送信されます。スイッチを離すと DIO#11は Low->High に変化して再び  IO イベントデータが送信されます。end device から送信された IO イベントデータを coordinator が受信すると XBee-ZB のAPI フレームデータが DeviceServer に送られてイベントハンドラ (ZB_IO_DATA.lua) が実行されます。

このとき実行する ZB_IO_DATA.lua イベントハンドラは以下のようになっています。

file_id = "ZB_IO_DATA"

--[[

ZB_IO_DATA スクリプト起動時に渡される追加パラメータ

---------------------------------------------------------------------------------
キー値			値		            									値の例
---------------------------------------------------------------------------------
FrameType	フレームデータ中のFrame Type
				(16進数2桁)												92

SourceAddress	フレームデータ中のSourceAddress
				64bit アドレス(16進数16桁)								0013A200404AC397

NetworkAddress	フレームデータ中の SourceNetworkAddress
				16bit アドレス(16進数4桁)								D565

NodeIdentifier	XBee デバイスの NodeIdentifier。
				DeviceServerのマスターファイルを検索して設定される。	Node1
				マスターにNodeIdentifier未登録の場合は"" が設定される

DeviceType		XBee デバイスの Device Type
				DeviceServerのマスターファイルを検索して設定される。	01
				マスターにDeviceType未登録の場合は"" が設定される
				8bit値(16進数2桁)
				00: coordinator
                01: router
                02: end device

DeviceTypeID	XBee デバイスの Device Type Identifier
				DeviceServerのマスターファイルを検索して設定される。
				マスターにDeviceTypeID未登録の場合は"" が設定される
				32bit値(16進数8桁)										00030000

ReceiveOptions	フレームデータ中 ReceiveOptions							01
				8bit値(16進数2桁)

SAMPLE_COUNT	I/O データのサンプル数									1

SAMPLE_DIO		I/O データ中のサンプル対象となったDIOビット番号リスト
				(10進数、カンマ区切り)									0,1,4

SAMPLE_ADC		I/O データ中のサンプル対象となったADCビット番号リスト
				(10進数、カンマ区切り)									2,3

SAMPLE_<Sample#>_<"DIO"|"ADC">_<Bit#>

				I/O サンプルデータ値。
				DIO の場合は、High で "1"、Low で "0"。					1
				ADC の場合は 10進数。									1023

				<Sample#> には 最大、SAMPLE_COUNT まで 1から順番に
				インクリメントされた値が入る。

				<"DIO"|"ADC">は、I/O サンプルデータが ADC
				もしくは、DIO のどちらであるかを示す。

				<Bit#>は、サンプルデータのビット番号。10進数。

		例:"SAMPLE_1_ADC_0" は、第一サンプルデータ中の #0番ポートのADC変換値を示す。

]]

log_msg("start..",file_id)
for key,val in orderedPairs(g_params) do
	log_msg(string.format("g_params[%s] = %s",key,val),file_id)
end

実質の動作部分は最後尾の 3 行だけで、イベントハンドラに渡された IO イベントデータを全てログに出力しています。end device のスイッチを操作すると下記の様なログメッセージが出力されます。

IOイベントデータ中には XBee デバイスで digital input に設定した項目を含む複数の IO データがまとめて格納されています。この中で g_params[SAMPLE_1_DIO_11] = 1 (または 0) でログ出力されている部分がスイッチ入力のデータです。XBee-ZB のデジタル入力は、ある程度のチャタリングをフィルタリングしてくれますので、このように綺麗にスイッチの押した状態と離した状態がログに出力されると思います。

ここで今回実現する機能の、スイッチ入力ごとに LED をON,OFF を繰り返すように変更します。先ほどのイベントハンドラ スクリプトファイル(ZB_IO_DATA.lua) をテキストエディタで下記のように変更します。

file_id = "ZB_IO_DATA"

--[[

ZB_IO_DATA スクリプト起動時に渡される追加パラメータ

---------------------------------------------------------------------------------
キー値			値		            									値の例
---------------------------------------------------------------------------------
FrameType		フレームデータ中のFrame Type
				(16進数2桁)												92

SourceAddress	フレームデータ中のSourceAddress
				64bit アドレス(16進数16桁)								0013A200404AC397

NetworkAddress	フレームデータ中の SourceNetworkAddress
				16bit アドレス(16進数4桁)								D565

NodeIdentifier	XBee デバイスの NodeIdentifier。
				DeviceServerのマスターファイルを検索して設定される。	Node1
				マスターにNodeIdentifier未登録の場合は"" が設定される

DeviceType		XBee デバイスの Device Type
				DeviceServerのマスターファイルを検索して設定される。	01
				マスターにDeviceType未登録の場合は"" が設定される
				8bit値(16進数2桁)
				00: coordinator
                01: router
                02: end device

DeviceTypeID	XBee デバイスの Device Type Identifier
				DeviceServerのマスターファイルを検索して設定される。
				マスターにDeviceTypeID未登録の場合は"" が設定される
				32bit値(16進数8桁)										00030000

ReceiveOptions	フレームデータ中 ReceiveOptions							01
				8bit値(16進数2桁)

SAMPLE_COUNT	I/O データのサンプル数									1

SAMPLE_DIO		I/O データ中のサンプル対象となったDIOビット番号リスト
				(10進数、カンマ区切り)									0,1,4

SAMPLE_ADC		I/O データ中のサンプル対象となったADCビット番号リスト
				(10進数、カンマ区切り)									2,3

SAMPLE_<Sample#>_<"DIO"|"ADC">_<Bit#>

				I/O サンプルデータ値。
				DIO の場合は、High で "1"、Low で "0"。					1
				ADC の場合は 10進数。									1023

				<Sample#> には 最大、SAMPLE_COUNT まで 1から順番に
				インクリメントされた値が入る。

				<"DIO"|"ADC">は、I/O サンプルデータが ADC
				もしくは、DIO のどちらであるかを示す。

				<Bit#>は、サンプルデータのビット番号。10進数。

		例:"SAMPLE_1_ADC_0" は、第一サンプルデータ中の #0番ポートのADC変換値を示す。

]]

log_msg("start..",file_id)
--for key,val in orderedPairs(g_params) do
--	log_msg(string.format("g_params[%s] = %s",key,val),file_id)
--end

------------------------------------------------------------------------
-- DIO#11 のスイッチが押されてボタンから手を離したタイミングで処理する
------------------------------------------------------------------------
if g_params["SAMPLE_1_DIO_11"] and (g_params["SAMPLE_1_DIO_11"] == "1") then
	local dev = g_params["SourceAddress"]	-- XBee-ZB デバイスの64bitアドレス文字列
	local state_key = dev .. "_DIO"			-- LED の ON,OFF のステートをサーバーでデバイス毎に保存するためのキー名

	-----------------------------------------------------------------------------
	-- ボタンを押すごとに LED のステート(共有メモリ値) を Null,"1" の間で繰り返す
	-----------------------------------------------------------------------------
	local stat,val = inc_shared_data(state_key)
	if not stat then error() end
	if (tonumber(val) == 1) then
		-------------------------------------------------
		-- XBee-ZB DIO#1 を "digital output high" に設定
		-------------------------------------------------
		if not zb_at_command(dev,"D1","05") then error() end
	else
		-------------------------------------------------
		-- XBee-ZB DIO#1 を "digital output low" に設定
		-------------------------------------------------
		if not zb_at_command(dev,"D1","04") then error() end
		if not set_shared_data(state_key,"") then error() end -- 共有メモリ値をクリア
	end
end

さきほどのイベントデータをログに出力する部分を “–” でコメントアウトしています。最初の if 文では IO イベントデータ中に XBee-ZB の DIO#11 のデータが含まれているかどうかと、含まれていた場合にその値が 1 (High,スイッチを離した瞬間) であることを確認しています。

このイベントハンドラは PAN 内に属している XBee-ZB から送信された IO イベントデータを受信したときに共通してコールされます。dev = g_params["SourceAddress"] 文で送信元デバイスアドレス を dev 変数に入れて、LED のステート管理をサーバーで保管するときの共有変数のキーとして使用します。これによって複数の XBee-ZB デバイスがあった場合でもデバイスごとにLED のステート(ON,OFF)を管理できるようにしています。

zb_at_command(dev,”D1″,”05″) 文はリモート XBee-ZB デバイスに任意の AT コマンドを送信する API ライブラリ関数です。AT コマンド “D1″ でパラメータ “05″(0×05) を送信すると DIO#1 が High になって LED が点灯します。パラメータ “04″ を送ると Low になって LED が消灯します。

これまでの設定手順と実際に動作させたときの様子を是非ご覧ください(音量注意)

ABS-9000 DeviceServer ではこのように、XBee-ZB を使用した ZigBee ネットワークを簡単に構築できます。ぜひダウンロードして使用してみてください。

 

コメントは受け付けていません。