0

GPS-CS1Kで写真に位置情報を埋め込んでFlickrにアップする

ここまで書いてアレだけど、Exif情報に位置情報を入れてアップロードしても、FlickrAPIからアクセスできるlocation情報に書き込まれるだけでmachine tagとしてGeoTagが付加されるわけでは無いのね…

それでもkmlは出せるけど、やっぱGeoTagにしたいなあ。

後でツール作るか。

———————————

SONY GPS-CS1Kを使って写真のexifに経度緯度情報(ジオタグ)を埋め込むのがすごく楽しい – hatayanlogを読んだら欲しくなったのでAmazonで買った。

hatayanlogでは色々細かく書いてあるが、俺はPicasaとGMM2は使ってない。

ようするにこのGPSを

1.ただ電源を入れて持ち歩くと、位置情報と時刻のデータベースができる

2.デジカメで写真を撮る

3.PC上でGPSデータとデジカメの写真を、撮影日時を元に合体させる

4.Flickrにアップロードする

5.Flickrが位置情報付き写真リスト(kml形式)を自動的に出してくれる

6.GoogleEarthやGoogleMapはkmlを読み込める

という事。

このGPSにはインタフェースが電源ボタンと状態表示のLED、USBポートしかない。本当にただ位置と時刻のペアを記録するだけのデバイス。

だが、日常的にFlickrを使ってる人にとっては、まさに使っている事を意識する事無く、位置情報とのmashupによって新しい価値が付加される素晴らしいデバイスだ。

データがテキスト形式で入っているのでhackもやりやすい。

(この形式で入ってる→s.h.log: Arduino – 偽GPS

GoogleMapの場合、Flickrの自分のページの下にあるkml形式のfeedをGoogleMapの検索窓に打ち込めば表示できる

俺のkml


拡大地図を表示

(ただし、俺の場合学校で撮る写真が多いのでずっと同じ場所が表示されているかも知れない)

同じkmlをGoogleEarthで見た所。これはこないだ行った早稲田の理工学部

sony GPS-CS1K

■まず買う

Amazonが安かったので買った。

SONY GPSユニット GPS-CS1K
SONY GPSユニット GPS-CS1K
posted with amazlet on 07.11.18
ソニー (2006/09/08)
売り上げランキング: 1277
おすすめ度の平均: 4.0

3 悪くはないが、GPSロガーとしては、いまやでかすぎだし付属ソフトも弱い
5 気になったら買うべし!
5 非常に手軽に使えます。

Read more

0

AS3 – SocketClient

AS3から増えてた普通のSocketクラスをなるべくシンプルに使う例

これ↓



一応動くけど、接続先が見つからない時の処理の書き方がよくわからない。

Source Code(fla) & swf

C#で作ったSocketServerとやりとりしている所

Socket Clinet(Flash) & Server(C#)

コード。全部1フレーム目。

varsocket:Socket=newSocket();

buttonConnect.addEventListener(MouseEvent.CLICK,buttonConnect_click);

buttonSend.addEventListener(MouseEvent.CLICK,sendText);

socket.addEventListener(ProgressEvent.SOCKET_DATA,onRecvData);//データ受信した時

socket.addEventListener(Event.CONNECT,function(){//接続できた時

debug(“connected!”);

buttonConnect.label=”DisConnect?”;

});

socket.addEventListener(Event.CLOSE,function(){//サーバー側から閉じられた時

debug(“closedfromserver”);

buttonConnect.label=”Connect!”;

});

functionbuttonConnect_click(e:Event){

if(!socket.connected){//接続していない時

debug(“connecting…”);

socket.connect(labelHost.text,newint(labelPort.text));//接続する

}

else{//接続している時

socket.close();//閉じる

debug(“closed”);

buttonConnect.label=”Connect!”;

}

}

functionsendText(e:Event):void{

if(!socket.connected)return;

varbytes:ByteArray=newByteArray();

bytes.writeUTFBytes(labelSend.text);

socket.writeBytes(bytes);

socket.flush();

debug(“送信:”+bytes.toString());

}

functiononRecvData(e:Event):void{

if(!socket.connected)return;

if(socket.bytesAvailable>0){

varbytes:ByteArray=newByteArray();

socket.readBytes(bytes);

varrecvStr:String=bytes.toString();

debug(“受信:”+recvStr);

}

}

functiondebug(message:String):void{

trace(“debug:”+message);

textAreaLog.text=message+”¥n”+textAreaLog.text;

}

0

C# – TCP Socket Bridge, Server, Client

今更ながらs.h.log: SocketでC#とProce55ingの通信の続き。学部の頃に徳田先生のネットワークプログラミングの授業で習ったような気がする事を勉強した。

実はTcpClient、TcpListener、Threadまわりを理解してこれを作るのに2ヶ月ぐらいかかった。

Archive(SrouceCode, exe / VisualStudio2005 C#2.0)

3つサンプルを作った。作った順に

1.SocketClient

普通にクライアント。指定したIPのportに接続する。テキストの送受信ができるウィンドウ付き。文字コードはUTF-8

2.SocketServer

普通のソケットサーバー。これ作ったときは、同じPortで複数のclientと接続できる事を知らなかった。SocketClientと1対1で対応する。

3.SocketBridge

SocketServerを改造して、複数clientとセッションをはれる様にした。コレはFlashのAS3から使えるようになったSocketにlistenメソッドが無いので、FlashとFlashを直接通信させる為のオスメス変換的ツールを目指して作った。(FlashMediaServer使えば良いんだけど)

clientから受信したデータを他の全てのclientに転送する様にしたので、ブリッジというよりハブかもしれない。

SocketClientとSocketServerを接続

Socket Client&Server

Read more

1

Arduino – ロータリーエンコーダ改

Arduino – ロータリーエンコーダを回すのコードがアレだったのでシンプルに書き直した。回路はそのままで。

char rot_state; // 状態 0~3
char rot_pinA = 8; // PinA of RotaryEncoder
char rot_pinB = 9; // PinB
void setup()
{
  Serial.begin(9600);
  pinMode(rot_pinA, INPUT);
  pinMode(rot_pinB, INPUT);
  rot_state = rotary_getState(rot_pinA, rot_pinB); // 現在の状態を保存しておく
}
void loop()
{
  // ロータリーエンコーダの状態を監視して、PCにシリアル通信で送る
  char rot_past = rot_state;
  rot_state = rotary_getState(rot_pinA, rot_pinB); // 今の状態
  char rot_dir = rotary_getDir(rot_state, rot_past); // 回転方向
  switch(rot_dir){
    case 2:
      Serial.println("R"); // 右回転
      break;
    case 1:
      Serial.println("L"); // 左回転
      break;
  }
  delayMicroseconds(10);
}
/* ロータリーエンコーダの状態番号0~3を取得する */
char rotary_getState(char pinA, char pinB){
  // 2つのピンからの入力状態をチェック
  if(digitalRead(pinA)){
    if(digitalRead(pinB)) return 2;
    else return 0;
  }
  else{
    if(digitalRead(pinB)) return 1;
    else return 3;
  }
}
/* 1つ前の状態と比較して、回転方向を取得する */
char rotary_getDir(int state, int past_state){
  if((state+3+1)%3 == past_state) return 1; // 左回り
  else if((state+3-1)%3 == past_state) return 2; // 右回り
  return 0; // 変化無し
}

1

Arduino – ロータリーエンコーダを回す

Arduinoでロータリーエンコーダの回転を検出した。

ロータリーエンコーダは可変抵抗と異なり、アナログ値を出すのではなく回転方向を2byteでデジタル出力するので、無限に回転させる事ができる。マウスのホイールもロータリーエンコーダで出来ている。

Source Code (Arduino 0009 Alpha / ATmega8 16MHz)

基本的に回路もプログラムもATMega8でやったのと全く同じ方法でできた。

s.h.log: AVR – mega8でロータリーエンコーダを回す

ロータリーエンコーダーの真ん中の足をGNDに接続し、左右の足をそれぞれマイコンのピンに接続。また、左右の足とマイコンのピンの間で、10kΩの抵抗を使ってプルアップする(VCCに接続する)

まあ写真の通り。

インクリメンタル型ロータリーエンコーダーは2本の線で4種類の回転状態を出力する。1クリック回す(カチッと言う)と、4種類の状態が一回りする。

とりあえず状態に0,1,2,3と名前をつけて、10ms毎ぐらいに状態を見に行くと、状態が1増えていたら右に回転、減っていたら左に回転みたいな感じでわかる。

ただし、Arduinoにはタイマーが無いので、メインループ loop() の中で delayMicroseconds(10); を呼んで、10ミリ秒を作っている。

なので、ロータリーエンコーダと同時にタイミングが難しい処理を行うとおかしくなるかもしれない。

例えば赤外線の受信とか。

Read more