だけど昔に書いたコードだし、いろいろプログラムとしては微妙だなぁと心苦しかったので書き直しました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} | |
} | |
} | |
} |
学部1年生にも理解してもらえるようにしたかったので、本当はString型の変数を使わないで、char型だけで数値まで持ってきたかったのだけど、汚くなるので断念。String型はメモリも消費する気がするので、多用したくないね。便利だけど。
あと、文字を判定するif文はswitch case文にしてもいいかもね。
フローチャートはこんな感じ。
まだ一般性のあるプログラムとも言えないですが、前よりは良くなったと思います。
簡単に説明すると、
・1文字ずつ読み込んで、文字列にしています。
・NMEAデータをカンマ区切りで文字列型の配列に入れています。
・NMEAデータを1行ごとにデータ処理(数値に変換)しています。
・緯度と経度をlong int 型に変換しているけれど、本当に使う下部分だけにすればint型で十分です。
そのタイミングでロボットの制御をすれば取得周期(だいたいのGPSモジュールは1秒)で制御できます。
もっと制御したい場合は工夫してください(丸投げ)
0 件のコメント:
コメントを投稿