Arduino ( XBee )

 Arduino に Ethernet Shield と XBee を接続し、無線通信 ( ZigBee ) の確認をおこないました。
(接続は一番簡単な 透過モードです。)

 端末( Router )から Coordinator にデータを無線で飛ばし、
 Coordinator から PC へは Ethernet (UDP )でデータを送ります。

 End Device じゃないの..... と突っ込まれそうですが、XBee の End Device はスリープが発生する
ので対策を行わないと通信データが抜けてしまいます。スリープは ZigBee の主要な機能ですの
で次回チャレンジします。


 準備

  Coordinator 側
    Arduino に Ethernet Shield を乗せ、その上に(孫亀)XBeeSheild を乗せようと
    したのですが、XBeeSheild 基板 と Ethernet Shield のRJ45 コネクタが干渉して
    しまいます。(写真下)このため、間にソケットを追加して高さを稼ぎます。
     また、このままだと、XBeeShield に5V が供給されないので配線も追加します。

  Router 側
    これはスムーズに XBeeShield を乗せただけ。



 中継コネクターを作成して、干渉を避ける。
 (ちょっと、不法建築見たい!!)


 5V, GND, Reset (ICSP) コネクタが未接続なので接続ケーブルを自作


 Router ( XBee ) 設定

 設定は X-CTU を使用します。( Digi 社のホームページよりダウンロードします。)

 ここより、ダウンロードしてインストールするだけ。Windows 7 64bit で行いましたが、設定は可能でした。

設定項目
 1.PID ( Coordinator と同じ値を設定します。)
 2.送信先 ( Destination Address High/Low ) Cordinator のアドレスを登録します。
 3.シリアルは CTS を Disable に設定します。





 Coordinator (XBee ) の設定

設定項目
 1.PID
 2.送信先 ( Destination Address High/Low ) 初期値のまま(一斉同報)
 3.シリアルは CTS を Disable に設定します。





 Router 側プログラム


 起動後、約1分間隔で数字をCoordinator に送ります。

#define LED  13

unsigned int iSendNo = 0 ;
char cSendNo[ 16 ] ;

void setup() {
  int i ;
  // initialize serial communication:
  Serial.begin(9600);  // USB or XBee
  pinMode(LED, OUTPUT);

  // Start LED On/Off
  for ( i = 0 ; i < 10 ; i++ ) {
    digitalWrite(LED, HIGH);
    delay(50) ;
    digitalWrite(LED, LOW);
    delay(100) ;
  }
}

void loop() {
  sprintf( cSendNo, "%4d\n", ++iSendNo ) ;
  if ( iSendNo >= 10000 ) {
    iSendNo = 0 ;
  }  
  Serial.print( cSendNo ) ;
  if ( ( iSendNo % 2 ) == 0 ) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
  delay( 60000 ) ;              // 1 min wait
}


 Coordinator 側プログラム

 Router よりのデータを受信した時、PC へ Ethernet ( UDP ) でデータを送ります。
Arduino のサンプルプログラムに少してを加えます。

/*
  UDPSendReceive.pde:
 This sketch receives UDP message strings, prints them to the serial port
 and sends an "acknowledge" string back to the sender
 
 A Processing sketch is included at the end of file that can be used to send 
 and received messages for testing with a computer.
 
 created 21 Aug 2010
 by Michael Margolis
 
 This code is in the public domain.
 */

// Edit by Kawabe 11 Sep 2011

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <Udp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008

#define RECV_BUFFER_MAX  64
#define LED             13
#define LF              0x0A

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0xEB };
byte ip[]  = { 192,168,0,32 };

unsigned int localPort = 46001;      // local port to listen on

// the next two variables are set when a packet is received
byte remoteIp[] = { 192, 168, 0, 30 } ;  // 送信先 IPAddress
unsigned int remotePort = 46001 ;        // 送信先 Port

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,

char cRecvBuffer[ RECV_BUFFER_MAX ] ;
int  iByte ;
int  iRecvPoint = 0 ;

void setup() {
  int i ;
  // start the Ethernet and UDP:
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);

  pinMode( LED, OUTPUT );
  Serial.begin(9600);   // XBee

  // Start On/Off LED
  for ( i = 0 ; i < 10 ; i++ ) {
    digitalWrite(LED, HIGH);
    delay(50) ;
    digitalWrite(LED, LOW);
    delay(100) ;
  }

  strcpy( cRecvBuffer, "Start Coordinator" ) ; 
  Udp.sendPacket( cRecvBuffer, remoteIp, remotePort);
}

void loop() {
  if (Serial.available() > 0) {
    iByte = Serial.read();
    if ( ( iByte >= ' ' ) && ( iByte <= 'z' ) ) {
      cRecvBuffer[ iRecvPoint++ ] = (char)iByte ;
      if ( iRecvPoint >=  RECV_BUFFER_MAX ) {
        iRecvPoint = 0 ;
      }
      digitalWrite(LED, LOW);
    } else if ( iByte == LF ) {
      cRecvBuffer[ iRecvPoint ] = 0 ;
      iRecvPoint = 0 ;
      Udp.sendPacket( cRecvBuffer, remoteIp, remotePort);
      digitalWrite(LED, HIGH);
    }
  }

  delay(10);
}


 PC 側


1. Arduino の IP(192.168.0.32) アドレス、Port(46001) を設定する。
2. Open する。
 画面右は Arduino よりの受信データを表示しています。

注意:ファイアウオールで受信データが弾かれないようにしてください。

 PC用サンプルプログラム (サンプルなので、厳密にチェックしてません。C++Builder XE で作りました。)


連絡先 information-@-xstech.co.jp ( - を削除して@を半角文字に変更してください。)

Home

参考書籍 & ボード( 今は Amazon で買える !! )