Arduinoで遊ぼう - GPSデータをSDカードに保存する
Posted by arms22 on 2010年04月27日

GPSモジュールとSDカードを組み合わせてGPSロガーを作ったよ。SDカードに保存したGPSデータをこんな風にGoogle EarthやGoogle Mapsで表示すると楽しい。
ピンクのラインがこの日、僕が移動した跡だ。最寄り駅から最近良く通う京都のクライミングジムまでの道のりを表している。1秒間隔で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で使いやすい。

変換の仕方
- 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.kmzKMLファイルのサイズが大きくなりすぎた場合、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
7 Comments
組み合わせでこんなこともできるんですね。
感動しました。
感動しました。
ビーコン菅原 さん
ありがとうございます。
Arduinoが良くできてるので実際作るのは結構簡単です。
ありがとうございます。
Arduinoが良くできてるので実際作るのは結構簡単です。
このコメントは管理人のみ閲覧できます
ライブラリは解凍して、フォルダごとlibrariesフォルダにコピーしてください。
FatFs
http://arms22.googlecode.com/files/FatFs-003.zip
をクリックすると、「ご指定のファイルが見つかりませんでした」
と表示されるのですが、新しいリンクはありませんか?
それと、NewSoftSerial | Arduinianaのライブラリを使うとは、
どういうことをすればいいのですか?
ダウンロードとかですか?
http://arms22.googlecode.com/files/FatFs-003.zip
をクリックすると、「ご指定のファイルが見つかりませんでした」
と表示されるのですが、新しいリンクはありませんか?
それと、NewSoftSerial | Arduinianaのライブラリを使うとは、
どういうことをすればいいのですか?
ダウンロードとかですか?
最新のArduinoのソフトウェアに
SDライブラリが含まれているので、
そちらを使うようにしてください。
下記の SD Library の項を参照してください。
http://www.musashinodenpa.com/arduino/ref/
SDライブラリが含まれているので、
そちらを使うようにしてください。
下記の SD Library の項を参照してください。
http://www.musashinodenpa.com/arduino/ref/
このコメントは管理人のみ閲覧できます
Leave a reply
該当の記事は見つかりませんでした。