[XBee Wi-Fi] APIモードでミニマムなセンサーを作ってみる

- 2013-05-27

XBee Wi-Fi を手に入れてほったらかしにしてあったので、いい加減動かしてみる。

以前やった APIモードとADサンプリングで三軸加速度センサーを作った物を今度はWi-Fi経由で

PCに送るまでをやってみた...。

 

回路は以前のものと全く同じで、ボタン電池で駆動、D0~D2ピンに加速度のXYZ軸のピンをそれぞれアサインさせるもの。

XBeeはホストとして、サンプリングしたデータをアドレス指定したクライアントへUDP経由でたれ流す。

 

  1. X-CTUでまずはXBeeモジュールを設定する。

小文字が打てないのでIDやPKの設定はモデム通信用のソフトで。私は ztermを使用した。

xctu-cap1 xctu-cap2 xctu-cap3

 

主な設定としては..、

 

[ID] ネットワークのSSID: X-CTUでは大文字しか入力できなかったので、ZTermで手打ち設定。

[AH] Wi-Fiの種類: WPA2だったので2

[PK] ネットワークのパスワード: こちらも小文字が打てなかったのでZTermで手打ち。

[IP] プロトコル: UDPなので0

[DL] 送信先IP: デフォルトではローカル内でブロードキャストになっている。

[IR] XBeeのインターバルサンプル機能のサンプルレート: 0x0Aにしてみた インターバルの計算は0xFFFF [x 1 mSec] とのこと。

[AP] APIモードの設定 : 1でネーブルに。

[D0 ~ D2] i/oモード: 2でADCモードに。

 

うまく行けばリセット後、指定したSSIDに接続しようとして、DHCPでIPが自動で割り振られる。

ZTermでATMYコマンドなどで確認できる。

 

  1. UDPのパッケトの受信

 

データはクライアント指定したIPへUDPで送られる。

当初SuperColliderで受けようとしたが、なんとSCLangでは 生のUDPソケット通信を受けるのができないとのこと..

OSCのパケットは受けられるが"/~"みたいに先頭がアドレスになっている物以外は"ERROR: OSC messages must have type tags"

というエラーを吐いて終わる..。なんてこった。

 

かろうじて送信はできるみたい。送信先をXBeeに割り振られたIP, ポート 9750( このポートが分からなかった*1)に。// SCLang Code // send raw udp to xbee wifi NetAddr("192.168.100.38",9750).sendRaw("Hello World!");  

 

しょうがないのでProcessingで。

UDP用のエクステンションライブラリが あるので、これを使用する。

ソケットを ローカルホスト3054番( このポートも分からなかった、どこに載っていたんだ..*2[DE]設定で指定した物とは違うので注意)に。

以下Processingのコード(汚)

 

// Processing Code // import UDP library import hypermedia.net.*;

UDP udp;

void setup() { udp = new UDP( this, 3054 ); //port from xbee wi-fi udp.listen( true ); }

void draw() {;}

void keyPressed() { String message = str( key ); String ip = "localhost"; int port = 9670; //port to xbee wi-fi
message = message+";\n"; udp.send( message, ip, port ); }

void receive( byte[] data, String ip, int port ) { int len = data.length; byte[] message = subset(data, 0, len);

for( int i = 0; i<len; i++ ){ if (message[i] == 0) { if (message[i + 1] == 7) println (message[i + 2] + " " + message[i + 3]+ " " + message[i + 4]+ " " + message[i + 5]+ " " + message[i + 6]+ " " + message[i + 7] ); } } }

パーズして6バイト分なにやら送られてきているのがわかる。 あとはこれを適切な値に変換してあげればいいはず。上記パーズするところ間違ってるくさい、後で直す。 と今のところはここまで。

*1 0x2616ポートDestination PortとSerial Communication Service Portのデフォルトのポートらしい。 *2 0xBEEポートといって特別なポートらしい。