このページではXBee ZigBee を使ってセンサー子機のアナログ量を測定して親機でデータ収集する方法を説明しています。
以下からセンサーの値を読み取るサンプルプログラムをダウンロードすることができます。ソースリストにも説明をコメントしていますので、そちらをお読みいただいても流れが分かるようになっています。最新のものはダウンロードページにあります。
ファイル
内容
| sample4_sens.c
| サンプル4 センサー読み取り(Digi純正XBee Sensor及び自作品用)
| sample5_plug.c
| サンプル5 SmartPlug読み取り(Digi純正 XBee Smart Plug専用)
| sample6_myplug.c
| サンプル6 自作SmartPlug用(参考:ZigBee Smart Plugの製作方法)
| xbee.c
| ライブラリ ソースリスト
| XBee管理用ライブラリ本体のソースコードです。
| xbee-download.html
| PC用/H8用 ZB Coordinator API
| 最新版ダウンロード用ページへのリンクです。
| xbee-sensor.pdf
| XBee センサーの回路図
| my_xbee_plug.pdf
| 自作 Smart Plugの回路図
| xbee-cord_sch.pdf
| Coordinator/End Device回路図
| 本サンプルに対応したアナログ入力付の回路図。
| |
これらのソフトの説明に先立ってハードウェアやXBeeの設定について説明します。説明を飛ばしたい場合は「こちら」に進んでください。
ハードウェアは下図のようにPCに接続された親機XBeeと単体の子機XBeeから構成されます。製作方法については「XBee ZigBeeを使ってセンサネットワークを構築しよう」や「XBee-Fly USBの作り方」に記載しています。
注意:既に1台を「Coordinator AT」に設定されている方も以下の手順で「Coordinator API」に設定変更する必要があります。
X-CTUのファームウェアの種類「Function Set」をプルダウンして「ZIGBEE COORDINATOR API」を選択します。ここでは語尾に「API」のついたCoordinatorを選択してください。そして、「Write」で書き込みます。
以下にセンサー読み取り用のサンプルプログラムを示します。「xbee_force(アドレス)」関数を使ってセンサーへ測定を要求してから、「xbee_rx_call( &xbee_result )」関数で応答値を受け取ります。xbee_forceを頻繁に出力しないために、ここでは100回中の1回の頻度(約10秒間書く)でxbee_forceを呼び出しています。受信結果は「xbee_sensor_result」関数を使って数値に変換します。
int main(int argc,char **argv){本サンプルのメイン関数です。
|
byte i; | byte trig=0; float value; byte port=0; 使用変数の宣言
|
byte dev_en = 0; | センサー発見の有無(0:未発見)
|
XBEE_RESULT xbee_result; | 関数xbee_rx_callの戻り値用の変数
|
byte dev_sens[9]; | 子機(リモート先)XBeeのアドレスの変数
|
// 初期化処理 | if( argc==2 ) port = (byte)(argv[1][0]-'0'); xbee_init( port ); COMポートを[port]番号で開きます。
|
// デバイス探索
lcd("Searching:SENSOR"); | if( xbee_atnj(10) ){ lcd("Found device"); xbee_from( dev_sens ); dev_en = 1; }else{ lcd("Failed:no dev."); } wait_millisec( 1000 ); 10秒間の参加受け入れ中にデバイスを発見できれ | ば dev_sens へアドレスを格納して dev_enを1に。 xbee_fromは受信したデバイスのアドレスを取得する 関数。dev_sens[]に格納する。
// メイン処理 | lcd("Receiving"); while(1){ if( dev_en && trig == 0){ xbee_force( dev_sens ); trig = 100; } trig--; デバイスdev_sensへデータ要求する。 | 要求する頻度はtrigでカウントし、100回に1回。 デバイスから自立的にデータが送られてくるときは、 ifの行からtrigの行までが不要。
xbee_rx_call( &xbee_result ); | データを受信します。
|
switch( xbee_result.MODE ){ | case MODE_RESP: case MODE_GPIN: // 照度測定結果 value = xbee_sensor_result(&xbee_result,LIGHT); lcd_cls(); lcd_goto(LCD_ROW_1); lcd_disp_5( (unsigned int)value ); lcd_putstr("Lux "); // 温度測定結果 value = xbee_sensor_result(&xbee_result,TEMP); i = (byte)value; lcd_disp_2( i ); lcd_putstr("."); i = (byte)((value-(float)i)*100); lcd_disp_2( i ); lcd_putstr("degC"); break; 受信結果がxbee_forceの応答(MODE_RESP)だった | 場合に照度と温度の測定結果を表示。 xbee_sensor_resultはセンサーの受信結果を数値に 変換する関数。 2番目の引数がLIGHTだと明るさ、TEMPだと温度に 変換できます。 ADCの値は(unsigned int)xbee_result.ADC[0〜3]で 読み取れます。(0〜3はADC/IOポート番号)です。
case MODE_IDNT: | // 新しいデバイスを発見 xbee_from( dev_sens ); dev_en = 1; lcd("found a new device"); break; 受信結果がデバイス参加ボタン押し(MODE_IDNT) | だった場合に受信したアドレスをdev_sensへ格納
default: | break; } } }
| |
リモート先の子機からのデータ取得方法には(1)サンプリング要求方式(Queried Sampling)と呼ばれる親機からxbee_forceでデータを要求する方法と、(2)周期サンプリング方式(Periodic IO Sampling)と呼ばれるデータをサンプリングした子機が親機へ自立的にデータを送信する方法があります。(2)の場合は予めデバイスのIOサンプリング値を設定しておく必要があります。X-CTU等で子機XBeeにIR値を設定します。ATコマンドだとATIRです。初期値は「IR=0000」で周期方式がオフになっています。周期方式を1秒間隔で設定する場合はATコマンドで「ATIR03E8」、3秒間隔なら「ATIR0BB8」、1分なら「ATIREA60」と入力します。親機側ではxbee_rx_call関数で使用している変数xbee_result.MODEにMODE_GPIN応答が返ってきます。
センサーから読み取った情報をスマートホンに表示するプログラムの説明です。