4個のうち1個はコーディネータ3個はエンドデバイスとする予定です。
■XBeeってなんですか?
XBeeはシリアルケーブルを無線で置き換えたかのように使えるIOです。Galileoに接続してIO拡張として使ウ予定です。XBee1個につきデジタル入出力11本アナログ入力4本が使えるようになります。本アイテムはシリーズ2という分類になるのですが、ほかにシリーズ1というのがありアナログ(PWM)出力を持っているそうです。通信距離(出力)の違いによりPROとそうでないものがあります。本アイテムはPROなので1.5km程度通信距離があります。
■設定
XBeeはデジタル通信なので、アドレスやネットワークトポロジーを設定する必要があります。
本によると、裏ワザとしてArduinoから設定することが可能だそうですが、不慣れなので専用品を使わせていただきます。
■ピン機能
1 :VCC
2 :DOUT
3 :DIN
4 :DIO12
5 :RESET
6 :PWM/RSSI/DIO10
7 :DIO11
8 :Reserved
9 :DTR/SEEP_RQ/DIO8
10:GND
11:DIO4
12:CTS/DIO7
13:ON/SLEEP
14:VREF
15:ASSOC/DIO5
16:RST/DIO6
17:AD3/DIO3
18:AD2/DIO2
19:AD1/DIO1
20:AD0/DIO0/COMMIS
■参考サイト
http://www.digi-intl.co.jp/products/wireless-wired-embedd...
■XCTUで手動制御で動作確認
NEX-5T制御用の端末になる構成で動作確認です。
右端のLEDは接続状態確認用です。
右から2つ目のLEDがリモコン制御のポートにつながっています。
左側の画像がリモコンOFF、右の画像がリモコンONになります。
ここまでできたら、送信コマンドをGalileoにプログラムするだけです。
■プログラムするデータ
コーディネータに送るデータは、
7E 00 10 17 00 xx xx xx xx xx xx xx xx FF EE 02 44 30 05 6F
の形になります。
7E 00 10 17 00 [64ビットアドレス] FF EE 02 44 30 [H/L] [sum]
[]の部分がプログラムで値を入れなければいけない部分です。と言ってもそんなに多いわけではありません。アドレスが3種、ポート出力が2種類なのでチェックサムも6種類しかないです。
7E:スタート
00 10:ペイロードの長さ
17:フレームタイプ(Remote AT Command)
00:フレームID(0x00固定)
xx xx xx xx xx xx xx xx:XBee個体の64ビットアドレス
FF FE:16ビットアドレス(ネットワーク構成時に変わるので不明の意味です。64ビットアドレスがあるので指定しなくていいようです。)
02:即時反映の指定
44 30:’D0'デジタルポート0を指定
05:ポートのHigh出力(04でLowです。)
結局、リモートのポート制御コマンド部分は、44 30 05 (D05)になります。
44 30 05 と 44 30 04 の2種類です。
■自作プログラム
Galileoで本アイテムをのD0ポートを操作するプログラムです。
--------------------------------------------------
#define XBEE_DL 0x04
#define XBEE_DH 0x05
#define XBEE_64bitADR 8
//----------
//XBee
//----------
class XBee
{
private:
byte address[XBEE_64bitADR];
byte p_Value;
public:
XBee(unsigned long address_h, unsigned long address_l);
void set_address(unsigned long address_h, unsigned long address_l);
void check_address(void);
void Write(byte port, byte value);
void Write(byte value);
void Write_L(void);
void Write_H(void);
void Change(void);
};
XBee::XBee(unsigned long address_h, unsigned long address_l)
{
set_address(address_h, address_l);
}
void XBee::set_address(unsigned long address_h, unsigned long address_l)
{
int i;
//送信順になるようにビッグエンディアンでデータを入れる
for(i=XBEE_64bitADR-1; i >= 0 ; i--){
if(i >= XBEE_64bitADR/2){ //4~7
address[i] = (byte)(address_l % 0x100);
address_l /= 0x100;
}else{ //0~3
address[i] = (byte)(address_h % 0x100);
address_h /= 0x100;
}
}
}
void XBee::check_address(void){ //デバグ用
for(int i=0; i<8; i++){
Serial.print((byte)(address[i]), HEX);
}
Serial.println();
}
void XBee::Write(byte port, byte value){
byte sum = 0;
p_Value = value;
Serial1.write((byte)0x7E); // スタートビット
Serial1.write((byte)0x00); // 長さ上位
Serial1.write((byte)0x10); // 長さ下位
Serial1.write((byte)0x17); // リモートATコマンド
Serial1.write((byte)0x00); // フレームID
for(int i=0; i<8; i++){
Serial1.write((byte)(address[i])); // 64bitアドレス
sum += address[i];
}
Serial1.write((byte)0xFF); // 64bitで指定しているので不明(0xFFFE)でOK
Serial1.write((byte)0xFE);
Serial1.write((byte)0x02); // 即反映
Serial1.write((byte)0x44); // 'D'
Serial1.write((byte)port); // ポート番号
Serial1.write((byte)value); // L:0x04, H:0x05
sum += (0x17 + 0xFF + 0xFE + 0x02 + 0x44 + port + value);
Serial1.write((byte)(0xFF- (sum % 0x100))); // チェックサム
}
void XBee::Write(byte value){
Write('0', value);
}
void XBee::Write_L(void){
Write('0',XBEE_DL);
}
void XBee::Write_H(void){
Write('0',XBEE_DH);
}
void XBee::Change(void){
Write('0', p_Value ^ 0x1);
}
XBee Io(0x0013A200,0x________); //第一衛星イオ 太陽系で一番活発な火山があります
XBee Europa(0x0013A200,0x________); //第二衛星エウロパ 海があるのではないかといわれています
XBee Ganymede(0x0013A200,0x________); //第三衛星ガニメデ 太陽系で最大の衛星です
XBee Callisto(0x0013A200,0x________); //第四衛星カリスト 太陽系で3番目に大きい衛星です
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial1.begin(9600);
delay(1000);
}
void loop() {
// put your main code here, to run repeatedly:
Io.check_address();
Europa.check_address();
Ganymede.check_address();
Callisto.check_address();
Io.Write_L();
Europa.Write_L();
Ganymede.Write_L();
Callisto.Write_L();
delay(500);
Io.Write_H();
Europa.Write_H();
Ganymede.Write_H();
Callisto.Write_H();
delay(4500);
}
--------------------------------------------------
このプログラムで操作した結果です。
-
購入金額
0円
-
購入日
2014年03月23日
-
購入場所
jakeさん
2014/04/12
速度が出ないですが、無線モデムとしては小さいし安いし、
ちょっとした制御にはうってつけですよね。
外付けアンテナタイプのもありますが、屋外だと100mくらいが実用範囲でしたね。
PROじゃなかったのかもしれませんが。
つきさん
2014/04/12
送信ができたので、次は受信を作らなきゃいけません。
1.5kmはPROでもアンテナのでかいタイプかもしれません。
この距離が使えるならラジコンにも向いてそうです。