なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

Arduinoで遊ぼう - GPSデータをSDカードに保存する

Posted by arms22 on 2010年04月27日 7  0

Google Earthサンプル

GPSモジュールとSDカードを組み合わせてGPSロガーを作ったよ。SDカードに保存したGPSデータをこんな風にGoogle EarthやGoogle Mapsで表示すると楽しい。

ピンクのラインがこの日、僕が移動した跡だ。最寄り駅から最近良く通う京都のクライミングジムまでの道のりを表している。1秒間隔でGPSデータを保存していたので、ちょっとした寄り道まで正確に記録されていた。あまりにも正確だったのすべてのデータを公開するのはやめた。公開するとあんな所やそんな所に寄り道してることがばれちゃうからね!


回路図



GPSロガー回路図

GPSモジュールとSDカードとの通信ラインには抵抗による分圧回路が入っている。5V動作のArduinoと接続する時にはこの抵抗が必要だけど、3.3V動作のArduinoと接続するときは省略しても良い。LEDはデバッグ用なので省略しても良い。


ライブラリ


SDカードへの書き込みにFatFsライブラリ、GPSモジュールとの通信にNewSoftSerialライブラリを使います。次のURLからライブラリをダウンロードしライブラリフォルダ(OSXの場合 ~/Documents/Arduino/libraries、Windowsの場合 ¥My Documents¥Arduino¥libraries)にコピーしてください。

FatFs
http://arms22.googlecode.com/files/FatFs-003.zip

NewSoftSerial | Arduiniana
http://arduiniana.org/libraries/newsoftserial/


スケッチ


GPSデータのファイルへの書き込みは1バイトづつ行わず、一度バッファにためてからいっきに書き込んでいる。gps_fetchでバッファにGPSデータをためて、gps_writeDataでファイルへ書き込む。

※GPSモジュールの通信レートは 9600bps、通信間隔は1秒、情報の種類はGGA+RMCにあらかじめ設定しておく。詳しくはこちらのスケッチを参照。

#include <FatFs.h>
#include <NewSoftSerial.h>

// GPS制御端子
const int gpsRxPin = 2;
const int gpsTxPin = 4;
const int gpsPowerPin = 8;

// LED端子
const int ledRedPin = 5;
const int ledGrnPin = 6;

// GPS通信
NewSoftSerial gpsPort(gpsRxPin, gpsTxPin);

// GPS受信データ
uint8_t fetchDataLength;
char fetchData[200];

void setup()
{
  delay(5000);

  pinMode(ledRedPin, OUTPUT);
  pinMode(ledGrnPin, OUTPUT);

  pinMode(gpsPowerPin, OUTPUT);
  digitalWrite(gpsPowerPin, HIGH);

  // ソフトウェアシリアルを初期化
  gpsPort.begin(9600);

  // FATファイルシステム初期化
  if( FatFs.initialize() ){
    // ログ保存用のファイルを作成する
    FatFs.createFile("gps.log");
  }
  else{
    digitalWrite(ledRedPin, HIGH);
    while(1);
  }
}

void loop()
{
  // GPSデータ受信
  if(gps_fetch()){
    digitalWrite(ledGrnPin, HIGH);
    // GPSデータ書き込み
    gps_writeData();
    digitalWrite(ledGrnPin, LOW);
  }
}

bool gps_fetch(void)
{
  if( gpsPort.available() ){
    unsigned long last_time = millis();
    uint8_t preamble = 0;
    uint8_t len = 0;
    fetchDataLength = 0;
    do {
      while( gpsPort.available() ){
        char c = gpsPort.read();
        if( c == '$' ){
          preamble++;
        } 
        if( preamble ){
          if( len < sizeof(fetchData) ){
            fetchData[len++] = c;
          }
          if( c == '\n'){
            fetchDataLength = len;
          }
        }
        last_time = millis();
      }
      delay(1);
    }
    while( millis() - last_time < 10 );
    return fetchDataLength > 0;
  }
  return false;
}

void gps_writeData(void)
{
  File file;
  file.open("gps.log");
  file.seekToEnd();
  file.write((const uint8_t *)fetchData, fetchDataLength);
  file.close();
}



GPSデータの変換


Google EarthやGoogle MapsにGPSデータを表示するにはGPSデータをKML形式に変換する必要がある。変換にはHoudahGPSというソフトを使った。シンプルなUIで使いやすい。

HoudahGPSスクリーンショット

変換の仕方
  • SourceにFileを選ぶ
  • FormatはNMEAを選択する
    GPSモジュールから送られてくるデータはNMEA形式。
    GPSデータを保存したテキストファイルの拡張子は .nmea に変更しておく。
  • DestinationにKMLを選ぶ
  • 左上のConvertボタンを押す
  • 保存先を指定し、OKボタンを押す

Houdah Software - HoudahGPS 4.0
http://www.houdah.com/houdahGPS/


Google Earth、Google Mapsに表示する


Google EarthにGPSデータを表示させるのは簡単。Google Earthのメニューからファイル、開くでKMLファイルを選ぶだけ。

Google MapsにGPSデータを表示させるのは少々面倒だ。一度、HTTPサーバにKMLファイルをアップロードし、そのファイルのURLをGoogle Mapsの検索窓に入力して"地図を検索"ボタンを押す必要がある。サンプルをアップロードしておいたので、次のURLをコピーしGoogle Mapsで検索してみてほしい。
http://arms22.web.fc2.com/geotagging_sample.kmz
KMLファイルのサイズが大きくなりすぎた場合、Google EarthでKMZファイルで保存しなおすとデータが圧縮される。


Arduinoで遊ぼう - GPSを使った高精度な時計
http://arms22.blog91.fc2.com/blog-entry-313.html

Arduinoで遊ぼう - GPSで現在位置を取得する
http://arms22.blog91.fc2.com/blog-entry-299.html

GPSデータをGoogle Maps/Earthで可視化する
http://bg66.soc.i.kyoto-u.ac.jp/forestgps/gpsdiary/archives/2008/05/gpsgoogle_mapsearth.html

HoudahGPS:GPSトラックログのファイル形式を変換
http://geolife.style.coocan.jp/blog/?p=264

GPS付きArduinoカメラ(3)

Posted by arms22 on 2010年04月01日 5  0

cupcake-1.jpg cupcake-2.jpg

cupcake-3.jpg cupcake-4.jpg

Arduinoカメラ用のスケッチを作成して写真を撮ってみました。画像はあまり綺麗ではありませんが、まぁまぁよく撮れています。撮った写真は家に帰ってパソコンにSDカードを繋ぐまで確認できませんが、帰ってからの楽しみが増えたと考えればいいよね。



スケッチにちょこっと手を入れてインターバル撮影もできるようにしました。会社の窓から撮影した写真をiMovieに取り込んで動画にしました。iMovieがいけてなくて写真1枚あたりの表示時間を0.1秒以下にできなくて、ちょっとのんびりした映像になっています。

Arduinoカメラ用のスケッチは次のURLからダウンロードできます。続きを読むにスケッチの全文を掲載しています。興味がある人はどうぞ。

arduino_digicam
http://arms22.googlecode.com/files/arduino_digicam-001.zip

スケッチにはまだGPSの制御を入れていません。また何らかの原因で511枚以上の写真を撮ることができません。FATの制限なのか、使っているFATライブラリのバグか制限か解析中です。それと内蔵RC発信器を使用している為、カメラモジュールとの通信速度が 38400bps 以上に上げれません。38400bps 以上に上げると通信エラーになります。外付けのクリスタルを使えば直ると思う。部品代をケチると良いことないなぁ。

次にやること

  • GPS制御の処理を入れる
  • FATの問題解析
  • クリスタルを実装する
  • 省電力制御の処理を入れる
  • バッテリー電圧の監視処理を入れる


GPS付きArduinoカメラ(2)
http://arms22.blog91.fc2.com/blog-entry-314.html

GPS付きArduinoカメラ
http://arms22.blog91.fc2.com/blog-entry-311.html

Arduino camera and geotagger
http://jarv.org/sdcam.shtml



GPS付きArduinoカメラ(2)

Posted by arms22 on 2010年03月14日 3  0

arduino_camera_case.jpg
スタイリングワックスの空き箱でArduinoカメラのケースを作った。左側の青マルは電源オン/オフ兼用シャッタースイッチ、右側のニョキっと飛び出した部分はカメラのレンズ、上側の丸の部分からはGPSのアンテナが見えている。

arduino_camera_case_inside.jpg
箱の内側に貼付けた1mmの厚紙で箱の強度を上げている。GPS、カメラモジュール、シャッタースイッチは両面テープで固定し、基板は中に入れるだけという超テキトー仕上げ。


最近は作品をケースに入れて仕上げることを心がけてきたけど、これからは壊れにくい物の作り方も考えて行きたいと思う。基板に半田付けしたワイヤが根元から折れては困るからね。これはコネクタを使って部品同士を繋げるようにすれば大丈夫だと思う。壊れにくい物作りのノウハウみたいなことがまとめて書かれた本とかWEBページないかな?


GPS付きArduinoカメラ
http://arms22.blog91.fc2.com/blog-entry-311.html



圧着ペンチ買わないと!

エンジニア 精密圧着ペンチ PA-20
エンジニア
売り上げランキング: 1520


GPS付きArduinoカメラ

Posted by arms22 on 2010年03月07日 0  0

GPSロガーを作るつもりでしたが、GPS付きカメラを作ることになりました。カメラ付きGPSロガーともいう。。

arduino_camera_shield.jpg
左からリチウムポリマーシールド、自作Arduino(Arduino Pro互換機)、SDカード+GPS+カメラシールド。カメラとGPSはまだ半田付けしていませんが、ハードウェアはほぼ完成。

arduino_camera_stacked.jpg
こんな感じでシールドを重ねます。60x60x60mmの立方体紙ケースに収納予定。


主な仕様はこんな感じで。

  • マイコン:Arduino Pro 3.3V 8MHz 328互換
  • カメラ:JPEGカラーカメラC328
  • GPS:LS20031
  • 電源:リチウムポリマーバッテリー 3.7V 1000mA
  • メディア:SDカード
  • ディスプレイ:なし



Arduino camera and geotagger
http://jarv.org/sdcam.shtml

該当の記事は見つかりませんでした。