XBee ZigBee 基本編
センサーの値を読み取ってみよう
〜アプリケーション〜

by ボクにもわかる地上デジタル

XBeeメインメニューへ戻る
地デジトップへ戻る

このページについて

 このページではXBee ZigBee を使ってセンサー子機のアナログ量を測定して親機でデータ収集する方法を説明しています。

サンプルプログラム(センサー)

 以下からセンサーの値を読み取るサンプルプログラムをダウンロードすることができます。ソースリストにも説明をコメントしていますので、そちらをお読みいただいても流れが分かるようになっています。最新のものはダウンロードページにあります。

XBee 管理用ライブラリ ZB Coordinator API用サンプルソフトウェア
ファイル 内容
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の作り方」に記載しています。

「ZB Coordinator API」対応センサーの回路図

XBeeセンサーの回路図(画像クリックで拡大)
アナログ入力のADCポート1〜3を持つXBee子機の回路図
アナログ入力のADCポート1〜3を持つXBee子機の回路図

XBeeモジュールの設定

注意:既に1台を「Coordinator AT」に設定されている方も以下の手順で「Coordinator API」に設定変更する必要があります。

 X-CTUのファームウェアの種類「Function Set」をプルダウンして「ZIGBEE COORDINATOR API」を選択します。ここでは語尾に「API」のついたCoordinatorを選択してください。そして、「Write」で書き込みます。

X-CTU画面1 COMポート選択

サンプル4 センサー読み取り

 以下にセンサー読み取り用のサンプルプログラムを示します。「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応答が返ってきます。


センサーから読み取った情報をスマートホンに表示するプログラムの説明です。

  ・複数センサーの読取値をスマートフォンで閲覧しよう


XBeeメインメニューへ戻る

地デジトップへ戻る



[広告欄] クリックするとYahoo!オークションへ移動します。