Arduinoによる放射線データ収集(3)

順序が前後しますが、今回は(5)GPS情報と放射線データをヒモ付けについて書きます。

秋月で買えるGPSモジュール GT720F(723F)
http://akizukidenshi.com/catalog/g/gM-02711/
http://akizukidenshi.com/catalog/g/gM-04554/
はRS232Cレベルのみのように見えますが、
6ピンのアサインは
1 GND
2 VCC (3-5V)
3 IN2 (RS232)
4 OUT2 (RS232,NMEA)
5 IN1(TTL)
6 OUT2(TTL,NMEA)
となっているので、1,2,5,6に接続するとシリアルでデータが取れます。データを取るだけなら5は不要。コネクタが特殊なので途中で切断してピンヘッダに半田付けして使いました。

FTDI BASICや秋月のUSBシリアルを持っていれば、
1 – GND
2 – VCC
5 – RX
6 – TX
につないでシリアルコンソールを開くと

$GPRMC,120429.000,V,0000.0000,N,00000.0000,E,000.0,000.0,280606,,,N*70
$GPGGA,120430.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*69
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPRMC,120430.000,V,0000.0000,N,00000.0000,E,000.0,000.0,280606,,,N*78
$GPGGA,120431.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*68
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30

のようなNMEAのデータを吐き出します。(まだ捕捉してないので時刻のみ)
衛星を捕捉する(LEDが点灯)までしばらく時間がかかりますが、
時刻については最初から取れるようです。
720Fは消費電力がやや大きいのがデメリット。
新しい723Fはコンパクトでやや改善していますが、感度が弱いようで窓際ではなかなか捕捉できませんでした。通信速度はGPS Viewerというソフトで設定できますが、以下では9600bpsに設定されているとします。
NMEAというのは一種のCSVフォーマットで
$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A
のような形式。
詳しくは
http://www.codepedia.com/1/The+GPRMC+Sentence
カンマ区切りでデータを取り出せば時刻と緯度、経度、高度などの情報が得られる。
ライブラリを使わない方法が
http://www.geocities.co.jp/arduino_diecimila/use/index.html
の9. GPSの項にあります。
また、TinyGPSというライブラリが公開されているので、これを利用すると個々のデータを取り出して表示したりすることができます。ただし、衛星を捕捉するまで動かないようなので、ログを取るならばNMEAのデータにCPMなどの情報を追加すればいいかという気になりました。(この手のフォーマットはperl,rubyなどのsplitで簡単に処理できます)
http://arduiniana.org/libraries/tinygps/
USBシリアルを使っているとTX,RXが使えませんが、
NewSoftSerialというライブラリも同じ作者が提供しています。
(Arduino-1.0以降ではこれが本家に取り入れられてSoftwareSerialというライブラリになるようです。
この辺の互換性がちょっと厄介になりそうですが。)
前回までの流れからピンが衝突しないように、ここではGPSからの信号はRX=3,TX=5に接続したとします。
単にGPSのNMEAを表示するだけであれば

#include <NewSoftSerial.h>

NewSoftSerial nss(3,5); // nss(rx,tx)

void setup()
{
    Serial.begin(9600);
    Serial.println("GPS start.");
    nss.begin(9600);
}

void loop()
{
    while (nss.available()) {
        Serial.print((char)nss.read());
    }
    delay(1000);
}

TinyGPSについては付属のサンプルが参考になります。
最初はこれでパースしてと考えていましたが、それよりもロギングの方が優先することに気づきました。microSDシールドを利用すれば簡単ですが、適当な変換基板を用意すれば自作もできます。これについては後日実験したら書きたいと思います。

(補足)
Arduino Cookbookを見ていたら、CSVを処理する例が出ていました。
2.7 Splitting Comma-Separated Text into Groups
Stringクラスが充実したおかげで、indexOf, substringメソッドを用いて

String line = "$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A";
int commaPos;
do {
    commaPos = line.indexOf(',');
    if (commaPos != -1) {
        Serial.print(line.substring(0, commaPos));
        line = line.substring(commaPos+1, line.length());
    } else {
        if (line.length() > 0) 
            Serial.println(line);
        }
    }
} while (commaPos >= 0);

のようにして一つづつ取り出すことができます。

広告
カテゴリー: Arduino, AVR

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー
2011年6月
« 5月   8月 »
 12345
6789101112
13141516171819
20212223242526
27282930  
%d人のブロガーが「いいね」をつけました。