Who is さくふわめろんぱん

さくふわめろんぱん(@skfwMelonpan)はロボットとか人工知能に興味があるパンです。
自分のために調べたことがみんなの役に立ったらいいなぁ。

2015年10月4日日曜日

ArduinoでのGPSのデータ処理(ver2)

このブログのアクセス解析を見るとArduinoでGPSを使う記事がよく見られています。
だけど昔に書いたコードだし、いろいろプログラムとしては微妙だなぁと心苦しかったので書き直しました。

#include <SoftwareSerial.h>
// 2:RX,3:TXでシリアル通信する宣言
SoftwareSerial mySerial(2, 3);
long int Tido = 35431721;
long int Tkeido = 139317210;
String inputString = "";
String Data[16];
float deg;
long int ido,keido;
char moji;
void setup() {
// 9600 bpsで接続(パソコンとの通信
Serial.begin(9600);
// 9600 bpsで接続(GT-720Fとの通信)
mySerial.begin(9600);
// シリアル通信のテスト
Serial.println("Program Setting");
}
void loop() {
int i=0;
if(mySerial.available()){
moji = mySerial.read();
if(moji=='$'){
inputString = "";
i=0;
while(1){
moji = mySerial.read();
if(moji==-1){
continue;
}
else if(moji==','){
Data[i]=inputString;
inputString = "";
if(Data[0]!="GPRMC") break;
i++;
}
else if(moji=='\r' || moji=='\n'){
ido = Data[3].substring(5, 9).toInt() + Data[3].substring(0, 4).toInt()*10000;
keido = Data[5].substring(6, 10).toInt() + Data[5].substring(0, 5).toInt()*10000;
deg = Data[8].toFloat();
Serial.print(ido); Serial.print("\t");
Serial.print(keido); Serial.print("\t");
Serial.println(deg);
break;
}
else inputString += moji;
}
}
}
}
view raw ArduinoGPS.ino hosted with ❤ by GitHub
String型のDataという配列のData[0]から順番にNMEAのデータが入っていくようになっています。緯度と経度と方位を取得したいのでGPRMCのフォーマットを想定して書いてあります。

学部1年生にも理解してもらえるようにしたかったので、本当はString型の変数を使わないで、char型だけで数値まで持ってきたかったのだけど、汚くなるので断念。String型はメモリも消費する気がするので、多用したくないね。便利だけど。
あと、文字を判定するif文はswitch case文にしてもいいかもね。

フローチャートはこんな感じ。
まだ一般性のあるプログラムとも言えないですが、前よりは良くなったと思います。

簡単に説明すると、
・1文字ずつ読み込んで、文字列にしています。
・NMEAデータをカンマ区切りで文字列型の配列に入れています。
・NMEAデータを1行ごとにデータ処理(数値に変換)しています。
・緯度と経度をlong int 型に変換しているけれど、本当に使う下部分だけにすればint型で十分です。

そのタイミングでロボットの制御をすれば取得周期(だいたいのGPSモジュールは1秒)で制御できます。
もっと制御したい場合は工夫してください(丸投げ)

0 件のコメント:

コメントを投稿