シルバーウィークのうちに、arduinoで少しまとめて遊びたい。
というわけで、
先日入手したGPSシールド用のライブラリを書いて、動かしてみている。
ベースは
gpsrobocarブログで公開されているテスト用スケッチ。
ライブラリ化してみたら、スケッチがすっきりして気持ちがいい。
せっかく作ったので、とりあえず公開しておく。
GPS受信機シールド用ライブラリ:NsGH81-0.1.zip以下にNsGH81を使ったスケッチのサンプルを載せておく。
シリアルが一本しかないDuemilanoveなどで動くよう、
NewSoftSerialを使っている。純正のSerialライブラリを使ってももちろん動くし、手持ちのMegaでも正常に動作した。また、GH-81用に作ったものだが、古野バイナリでデータをやり取りする他の機種(GH-80など)でも動くはず。確認はできないけど。
#include <NsGH81.h>
#include <NewSoftSerial.h>
// NsGH81 sample sketch
// YKO[2009/09/20]
// serial pin
#define SER_RX 2
#define SER_TX 3
// serial baud rate
#define BAUD_RATE_LOCAL 9600 // Serial
#define BAUD_RATE_GPS 9600 // NewSoftSerial
// GPS module's LED pins
#define GPS_LED1 9
#define GPS_LED2 8
// setup SoftwareSerial port
NewSoftSerial mySerial = NewSoftSerial(SER_RX,SER_TX);
// buffer
char buff[50];
void setup()
{
// initialize pin modes
pinMode(SER_RX,INPUT);
pinMode(SER_TX,OUTPUT);
// initialize serial ports
Serial.begin(BAUD_RATE_LOCAL);
mySerial.begin(BAUD_RATE_GPS);
// initialize GPS
NsGH81.init(recieveLocation,recieveTime,GPS_LED1,GPS_LED2);
NsGH81.setStartCmd(buff);
mySerial.print(buff);
}
void loop()
{
int d = mySerial.read();
if( d>=0 ){
NsGH81.update(d);
}
}
void recieveLocation(NSGH81_LOCATION g)
{
int alt_0 = int(floor(g.alt));
int alt_1 = int(round((g.alt-alt_0)*10.0));
sprintf(buff, "lat=%+03d-%02d-%02d.%03d, ", g.lat.deg, g.lat.min, g.lat.sec, g.lat.msec);
Serial.print(buff);
sprintf(buff, "lon=%+04d-%02d-%02d.%03d, ", g.lon.deg, g.lon.min, g.lon.sec, g.lon.msec);
Serial.print(buff);
sprintf(buff, "alt=%d.%01d[m], nsat=%d, status=%d", alt_0, alt_1, g.nsat, g.status );
Serial.println(buff);
}
void recieveTime(NSGH81_TIME g)
{
sprintf(buff, "(20%02d/%02d/%02d %02d:%02d:%02d)", g.year, g.month, g.day, g.hour, g.min, g.sec);
Serial.println(buff);
Serial.println("-----");
}
ライブラリの使い方を整理すると以下の通り。
setup()
で...
init()
でコールバック関数とシールド上のLEDにつないだピン番号を設定
setStartCmd()
で測位動作設定用のコマンドを作成し、シリアルを使ってモジュールへ書き込み
loop()
で...
- シリアルからデータを1バイト読んで、読んだ1バイトのデータを引数にして
update()
をコール、を延々繰り返し。ライブラリ内部で読み込んだデータはパースされ、パース結果(測位結果と時刻)が得られる度に、結果を引数にしてコールバック関数がコールされる。つまり、コールバック関数の中に所望の処理を書いておけばよい。
さて、GPSモジュールは無事つながった。何しよう...笑