2012-05

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。

XBee WiFi経由でGoogle天気APIを使ってみる

概要:


XBeeWiFi経由でGoogle天気APIにアクセスして天気情報を取得.
ついでにArduino側で取得したXMLを解析と天気の表示までやってみました.

実行環境:


・X-CTU
・XBee WiFi
・ネット環境
Arduiono Harpy

天気データ取得:


以前の記事(XBee WiFiを使ってWebサーバーからファイルを取得する
を参考にして接続の環境を整えます.
接続するサーバーのIPは次のようになっています.
Destination IP : 173.194.38.73


次にこのサーバーに送るメッセージを決定します.
以下のようなものになります.
メッセージの末尾についているのが位置情報です.
これを変えることで,天気情報を取得する場所を変更することができます.

GET http://www.google.com/ig/api?weather=toyohashi,aichi HTTP/1.1
(改行)


以上のメッセージの送信に成功すると,下の画像のようなレスポンスとXMLが返ってきます.

xbee-weather-xctu

後は取得したXMLを分析し,必要な情報を取り出すだけになります.

天気データ:


XMLを分析します.
取得したXMLには今日を含めた4日間の天気予報が書かれています.
今回,天気予報?に現在の天気情報を使用します.
使用するデータは,取得したXMLの以下のものとなります.

google_weather_xml
*テキストを貼り付けると上手く表示してくれないので,画像になっています

この部分の中のタグの中を取得出来れば,今の天気を知ることができます.


Arduinoを使ってXMLを解析:


ここまで分かれば,あとはArduinoにXBeeWiFiをつなげてアクセスするだけです.
使用したArduinoはAtmega328と同等品になります.

Arduionoで使えるXML解析ライブラリを探したのですが,
なかなか容量が小さい物が見つからなかったため,
最小限の機能を搭載したものを作成しました.

作成したプログラムはタグの開始【<】 と 終端【>】を見つけるだけの簡単なものです.
(これを解析プログラムと呼んでいいのか?)
ソースは下に公開しておきます.
完成度が低いので,あまり参考にならないと思いますが....
MicroXMLParser?


動作実験:


このXML解析プログラムを実際に動かしたものがこちらになります.



解析して得た天気情報を基にフルカラーLEDの色を決定し,PWM(アナログ)値を設定.
同時にソフトウェアシリアルを用いて,PC側に解析結果を送信しています.


まとめ:


今回はシリアル周りの通信でだいぶ苦労しました.
XBeeWiFiとの通信はソフトウェアシリアルで行うことを考えていたのですが,
データの取りこぼしが多かったため,使用を断念しました.

全てのソースを公開したいのですが,
今回はまだ人に見せることができるレベルに達していないため,見送ることに決めました.

次回からは,天気予報ガジェットをMakeに出展できるレベルまで作りこんでいく予定です.


参考サイト:


google api からデータ取得
Arduiono Harpy
ArduinoでXMLを解析する

XBee WiFiを使ってWebサーバーからファイルを取得する

概要:


XBeeWiFiでHTTP接続を試してみました.

*私はネットの接続手法に関しては素人?です.
 違うという部分があったらご指摘していただけるとありがたいです.


実験環境:


・X-CTU
・XBee WiFi (Ver.102B)


実験:


まず,XBeeWiFiの設定をします.
設定値は以下のようになっています.
・SSID → 任意の値
・Network Type → TCP
・Destination Port → 0x50 (80番ポート:HTTP)
・Source Port → 0x50(80番ポート:HTTP)
・Destination IP Address → 接続先のIP(202.218.219.147)
・Encryption Enable → WPA(TKIP)
・Pass Phrase → 任意の値
*X-CTU内でのポートの入力は16進数です.

では,次にアクセスできるかを確かめてみます.

X-CTUの【Terminal】タブの
【Assenble Pacletw】ボタンを押すと以下のような画面が現れます.
xctu-packet

次に,以下の内容を入力します.

GET /fnetwork/accesstest/at.html HTTP/1.1
Host: www.atmarkit.co.jp
(改行)


このメッセージは,こちらのサイトから頂いて来ました.
HTTP語でWebブラウザとしゃべってみよう

X-CTU【SendData】ボタンを押して,メッセージを送信しみます.
at.html をWebサーバーから取得し,表示することができます.
xctu-response

このようにWebサーバーからデータを取得することができます.
実際に複数のサイトで使用するには,
ATコマンドで接続先のWebサーバーを変更しながら使うことになりそうです.


感想:


次は何を作ってみようか?
天気予報,Twitter,Facebookとか何でもできそうな気がする.
作ることで下のレイヤのことも理解できるので嬉しいですね.


参照サイト:


HTTP語でWebブラウザとしゃべってみよう

XBee Wi-Fi を使って台車を動かす

概要:


XBeeWi-Fiを使ったキーボードコントローラー作成と台車(ロボット)制御をやってみました。


環境構築:


今回、コントローラー(ソフトウェア)作成としてpygameというライブラリを使用しました。
また、台車に関しては以前作成したものを使用しています。
これはシリアル通信で制御できる仕様となっており、XBeeとつなげることで動かすことができます。

以下使用したもの。
・ pygame (pythonライブラリ)
・ シリアル通信で制御できる台車
・ XBee Wi-Fi


実行結果:


こんな感じのキーボードで制御できるソフトをPythonで作成しました。




実際に動かしてみるとこんな感じになります。




成果物:


今回作成したソフトのソースは以下に置いておきます。
実行するにはpygameをインストールする必要があります。
  【ダウンロード】  


参照サイト:


ChickLab XBee Wi-Fi 接続の設定までやってみた
lavish7000 [pygame] 画像を表示する
pygame Document
オケラボブログの避難所跡地

XBee Wi-Fi 接続の設定までやってみた

概要:


ついにXBeeが発売しました!
これで様々な回路を簡単にインターネットにつなげることができるようになります。
今回は設定とテストをやってみました。

xbee wifi

販売サイトはいつものスイッチサイエンスさんです。
XBee WiFi / ワイヤアンテナ型


環境構築:


XBeeの設定用にX-CTUというツールを使います。
以下のサイトからダウンロードしインストールを行います。
Windows7とVistaの場合は、XCTU 32bit ver. 5.2.7 を使います。
XPの場合は、XCTU Ver 5.1.0.0を使います。

X-CTU

次に [PC Settings] より、XBee Wi-Fiが接続されたポートを選択し接続のテストを行います。
私の場合、このままではXBee Wi-Fiを認識しなかったため、
[Version] → [Web]よりソフトウェアのアップデートを行いました。

xctu-update


設定:


一般的な設定
一般的な設定はX-CTUの[Modem Configuration]タブから行います。

XBee Wifiには接続のモードが3つあります。
・IBSS JOINER(adhoc)
・IBSS CREATOR (adhoc)
・INFRASTRUCTURE
今回、XBee → ルーター というつなぎ方でテストを行うため、
[Infrastructure] モードを用いて接続を行います。

Infrastructureモードを用いて通信する場合、主に以下のような設定項目があります。
・無線LANルーターのSSID [Network] → [SSID]
・ネットワークの種類 [Network] → [NetworkType]
・IPプロトコル(TCP or UDP) [Network] → [IP Protocol]
・動的アドレスか静的アドレスか (DHCP or static)[Network] → [IP Addressing Mode]
・暗号化方式 [Security] → [Encryption Enable]
・パスワード [Security] → [Passphrase]
これらを各自の無線環境にあったものに設定することで接続を行います。

はまったこと:
こちらの環境だけかもしれませんが、
X-CTUの設定で大文字しか入力できない状態になっています。
私の無線環境では、SSIDとパスワード共に大文字と小文字を使用しているため、
Terminalで直接ATコマンドを入力することで設定を行いました。
以下のような入力を行います。


* 青色はこちらの入力
* 赤色はXBeeからの応答
+++OK
atid ap1 (接続する無線LANのSSIDを指定)
OK
atee 1 (暗号化方式をWPA PSKへ変更)
OK
atpk passoword (指定した無線LANへ接続するためのパスワード)
OK
atip 1 (IPプロトコルをTCPへ変更)
OK
atai (現在の接続状態を表示)
0 (0:接続成功 / 0x23:SSID未設定 / 0xFF:検索中)
atmy (振り分けられたIPアドレスを表示)
192.168.1.2
atwr (設定をXBeeに書き込み)
ok


このように設定を行います。
正しく設定できていれば、ataiコマンドで0が返ってくるはずです。

テスト:


次に動作テストを行います。
XBee-WiFiでは、
ポート9750へ送信された文字列がシリアルポートから出力されるようになっています(初期値)。
そのため、そのポートに文字列を投げる簡単なスクリプトをPythonで作成しました。
ソースは以下のようなものになります。


import socket
host = "192.168.1.2" #接続するIPアドレス
port = 9750 #接続するポート
so = socket.socket()
so.connect((host,port))
so.send("hello xbee Wi-Fi")


これを実行し、
X-CTUのターミナルを見てみると以下のような表示が出ているはずです。

hello xbee

これで接続テストは完了です。


まとめ:


簡単にマイコンをネットに繋げる時代になってしまいました。
マイコンを無線LAN接続することに憧れていた時代を懐かしく思います。
いい時代になったもですね。
次は台車かRoombaを動かしてみようかと考えています。


参考サイト:


XBeeの開発環境をPCにインストール
Arduino Freaks XBee Wi-Fi
XBee Wi-Fi 簡易仕様書(英語)
XBee Wi-Fi 詳細仕様書(英語)

Mac で Wiiコントローラー を使う (C++)

概要:
WiimoteをMacでC++を使って動かす資料が少なかったので、
ライブラリ導入とサンプル作成のためのメモです。

使用機器:
・Wiimote(Wiiコントローラー)
・PC(Mac)

導入方法:
「WiiCpp」というライブラリを使用します。

1. ソースのダウンロード
svn co https://wiic.svn.sourceforge.net/svnroot/wiic


2. ビルドとインストール
 cd (解凍したフォルダ)
mkdir build
cd build
cmake ../src
make
make doc
sudo make install

ヘッダとライブラリファイルは以下のディレクトリにインストールされます。
/usr/local/include
/usr/local/bin


サンプル実行:
サンプルを実行してみます。
 cd (解凍したフォルダ)/build/bin
./wiicpp-sample

これでWiiremoteをONにするだけで動作するはず。

XCode4を使ったサンプル作成:
XCodeで動かす場合は、ライブラリのリンカを設定させる必要があります。
下の画像のようにリンカを設定をします。
wiicライブラリリンク
あとは適当にサンプルを参考にしてソースを書いてコンパイルをするだけです。


#include
#include
#include
using namespace std;

// 状態が更新されたら呼ぶ関数
void callHandleEvent( CWiimote& wm ) {
if( wm.Buttons.isPressed(CButtons::BUTTON_A) ) {
cerr << "button A pressed" << endl;
}
if( wm.Buttons.isPressed(CButtons::BUTTON_B) ) {
cerr << "button B pressed" << endl;
}
}

void callHandleDisconnect( CWiimote& wm ) {
cerr << "Disconnected :" << wm.GetID() << endl;
}

int main (int argc, const char * argv[]) {

CWii wii;
bool reload_flag = false;
std::vector::iterator it;

// コントローラーの検索開始
std::vector& wiimotes = wii.FindAndConnect();

// 何も接続されていなかったら終了
if( !wiimotes.size() ) {
std::cerr << "can't find wiimote" << std::endl;
return 0;
}

do {
// Wiimoteが接続解除された場合、動的配列を再構築する
if( reload_flag ) {
wiimotes = wii.GetWiimotes();
}

// Wiimoteのデータ更新
if( wii.Poll() ) {
// 取得したコントローラーに対して操作を行う
for( it=wiimotes.begin(); it!=wiimotes.end(); ++it ) {
switch( it->GetEvent() ) {
// コントローラーの接続解除がされた場合の処理
case CWiimote::EVENT_DISCONNECT:
case CWiimote::EVENT_UNEXPECTED_DISCONNECT:
reload_flag = true;
callHandleDisconnect( *it );
break;

// 状態が更新されたら
case CWiimote::EVENT_EVENT:
callHandleEvent( *it );
break;

default:
break;
}
}
}

// 接続しているコントローラーがなくなったら終了
} while (wiimotes.size());

return 0;
}


まとめ:
簡単にC++でWiimoteを動かすことが出来ました。
ライブラリの作成者様に感謝!

参考サイト
A C/C++ Library for Wiimote

NEW ENTRY «  | BLOG TOP |  » OLD ENTRY

カレンダー

04 | 2012/05 | 06
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

FC2カウンター

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

未分類 (5)
日記 (6)
wiiremote (1)
google (1)
回路 (3)
psp (1)
programing (15)
linux (0)
OpenWRT (3)
kinect (1)

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

google adsense