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

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

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

Posted by arms22 on 2010年04月27日 6  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

Ads by Google

6 Comments

ビーコン菅原 says..."これはすごいな"
組み合わせでこんなこともできるんですね。
感動しました。
2010.04.30 07:12 | URL | #n43GnmiU [edit]
arms22 says..."Re: これはすごいな"
ビーコン菅原 さん

ありがとうございます。
Arduinoが良くできてるので実際作るのは結構簡単です。
2010.04.30 08:52 | URL | #- [edit]
says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2011.09.21 15:07 | | # [edit]
arms22 says..."Re: すごい"
ライブラリは解凍して、フォルダごとlibrariesフォルダにコピーしてください。
2011.09.21 16:26 | URL | #- [edit]
Hide says..."お手数お掛けします。"
FatFs
http://arms22.googlecode.com/files/FatFs-003.zip
をクリックすると、「ご指定のファイルが見つかりませんでした」
と表示されるのですが、新しいリンクはありませんか?

それと、NewSoftSerial | Arduinianaのライブラリを使うとは、
どういうことをすればいいのですか?
ダウンロードとかですか?
2012.07.24 16:08 | URL | #- [edit]
arms22 says..."Re: お手数お掛けします。"
最新のArduinoのソフトウェアに
SDライブラリが含まれているので、
そちらを使うようにしてください。

下記の SD Library の項を参照してください。
http://www.musashinodenpa.com/arduino/ref/
2012.07.25 12:02 | URL | #- [edit]

Leave a reply






管理者にだけ表示を許可する

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