このページでは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応答が返ってきます。
センサーから読み取った情報をスマートホンに表示するプログラムの説明です。