ArduinoからGPSセンサー(モジュール)の設定を変更する方法です。
概要
使用するGPSセンサーは「GYSFDMAXB」。秋月で売っているモジュールを使用しました。
今回は、このGPSモジュールの設定をArduinoから情報送信して変更してみたいと思います。GPSセンサーの設定変更はシリアル通信で情報をセンサーへ送信すれば変更できます。
送信する情報は「$PMTK~」などから始まる、決められた書式にのっとった文字列をシリアル通信でセンサーへ送信すれば設定を変えられます。
例えば通信速度(ボーレート)を変更するのであれば
Serial.print("$PMTK251,19200*22\r\n");
のような具合で情報をシリアル送信すればGPSセンサーの設定を変更できます。上記の場合、通信ボーレートを19200bpsへ変更する記述です。
良く変更しそうな内容に絞って記述内容を纏めておきます。
通信ボーレートの変更
通信ボーレートの変更書式です。
$PMTK251,57600*2C\r\n
「$PMTK251,」
決められた記述です。次に通信ボーレートを記述。
「*2C」
チェックサムです。チェックサムは、「$~*」で挟まれた部分を排他論理和した16進数を表記します。
最後に「復帰」、「改行」を記述します。
例えばボーレートを19200bpsへ変更する場合は
$PMTK251,19200*22\r\n
このような記述でシリアル送信します。
Arduinoからボーレートを変更する場合は注意が必要です。設定を送信するとGPS側のボーレートが変更されてしまうため、Aruduinoとのボーレートにアンマッチがおきて通信ができなくなります。Arduino側のボーレートも変更して再接続が必要となります。
出力頻度の変更
GPS情報の出力頻度の設定変更です。
デフォルトではおそらく1Hz(1秒ごと)の出力頻度かと思います。最大10Hz(0.1秒ごと)まで出力頻度をあげることができます。
記述は
$PMTK220,250*29\r\n
「$PMTK220,」
決められた記述。
「250」
出力頻度を記述。「Hz」ではなく、「ms」で記載します。
「*29」
チェックサムです。$~*で挟まれた部分の排他論理和した16進数を表記します。
最後に「復帰」、「改行」を記述します。
例えば5Hzへ出力頻度を変更する場合は、
$PMTK220,200*2C\r\n
このような記述でシリアル送信します。
送信頻度の変更には注意が必要です。GPSからの出力情報が結構多いです(デフォルト)。仮にボーレート9600bpsの通信速度では、1回の出力に600ms~800ms程の時間がかかる通信量です。
ですので「出力頻度」を「出力する情報量(通信時間)」より短くしてしまうと通信が破綻してしまいます。短くした場合を試していないのでどうなるのかわかりませんが、注意しましょう。
ボーレート、出力頻度、出力情報量は考えて変更した方が良いです。
出力する情報の変更
GPSから出力される情報を変更します。
デフォルトでは結構な情報が出力されます。出力情報はセンテンス単位で変更することができます。
変更する書式は
$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n
「$PMTK314」
決められた記述
「カンマ区切り部分」
カンマ区切りのところでセンテンス毎に出力するかどうかを指定します。「0」は未出力、「1」~「5」を記載で出力します。数字は出力間隔です。例えば「3」とした場合、出力3回ごとに1度情報送信します。
「*28」
チェックサムです。$~*で挟まれた部分の排他論理和した16進数を表記します。
最後に「復帰」、「改行」を記述します。
例えば、
$PMTK314,1,2,3,4,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n
と記述した場合、
「$GPGLL」を出力1回ごとに情報を送信
「$GPRMC」を出力2回ごとに情報を送信
「$GPVTG」を出力3回ごとに情報を送信
「$GPGGA」を出力4回ごとに情報を送信
「$GPGSA」を出力5回ごとに情報を送信
「$GPGSV」 を出力1回ごとに情報を送信
する設定となります。
そのほかにも、かなり多くのコマンドが準備されていますが、とりあえず私が使いそうなところはこれくらいですかね。。
これらの設定変更の情報をGPSへ送信すると、処理に対しての応答がGPS側から出力されます。
たとえば、出力センテンスを変更した場合、
$PMTK001,314,3*36
「$PMTK001,」から始まる文字列がセンサーから出力されます。「314」は変更したコマンド情報、その後の「3」は設定変更が完了した場合です。最後にチェックサムが出力されます。
0:正常でない情報を受信
1:サポートされていない情報を受信
2:正常な情報だが、処理が失敗
3:処理が成功
という具合です。
またどうも、あまりおかしなコマンドを送信してしまうと元に戻らなく可能性もあるとのこと。設定変更する際は十分注意して行ったほうがよさそうです。
コメント
お世話になります。
大吉と申します。
よろしくお願いします。
早速ですが、Arduinoを使ってバイクのメーター作成をしています。
近接センサーよりパルスを拾い、トリップメーターを作成し
今回、GPSからの海抜と時間を表示させようと実施したのですが
GPSの読み取り時に時間が掛かる様でその間にパルスの検出が止まってしまいます。
その中で、このサイトを拝見しGPSからの情報を減らせば良いのではないのかとの
考えに至っております。
その中でこのコマンド送信の方法をご教示頂けないでしょうか?
お忙しい中申し訳ありませんが宜しくお願い致します。
大吉さん、こんにちは。サイト拝見下さり有難う御座います。
コマンドの送信方法ですが記事内にも記載してます通り、基本的にはシリアル送信でO.Kです。例えばSerial.print(“$PMTK251,19200*22\r\n”); などとすれば設定変更できます。より細かな作法はお使いのGPSデータシートなどを確認した方がいいです。ここでは書ききれません・・。
またもし秋月などで販売しているGYSFDMAXBなどを使っているのであれば無償のソフトウェアパッケージが利用できるので、そのアプリ内から設定変更できて簡単ですよ。
GPS読み取りを高速にするのであればお察しの通り情報量減らすのと通信ボーレート上げれば1回の処理は早くなると思います。