BASIC4MCU | 질문게시판 | 아두이노 GPS 질문
페이지 정보
작성자 master 작성일2018-08-09 14:38 조회8,340회 댓글0건본문
이렇게 코드있는데 한줄씩 차례로 해석 부탁드립니다!
#include<SoftwareSerial.h> // 소프트웨어 시리얼 포함
#define fieldmax 13-1 // 메모리공간 차지 x 프로그램 메모리 할당
int rx=2; //들어오는 핀
int tx=3; //데이터 전송 핀
SoftwareSerial gps(rx,tx); //2번,3번핀에 시리얼포트 gps지정
String text = "";
bool process_sentence = false;
double Latitude; //
double Longitude;
int pos[fieldmax]={0,};
void setup()
{
Serial.begin(9600);
gps.begin(9600);
}
void loop()
{
while(gps.available())
{
char c =gps.read();
switch(c)
{
case '\n':break;
case '\r':process_sentence=true;break;
default: text += c; break;
}
}
if(process_sentence)
{
process_sentence =false;
if(text.startsWith("$GPGGA")) //스트링이 다른 스트링의 문자들로 시작하는지 아닌지 테스트
{
Serial.println(text);
print_info(Serial);
}
text ="";
}
}
template <class T> void print_info(T& SS)
{
int start =0;
for(int i=0;i<fieldmax;i++)
{
pos[i]=text.indexOf(',',start+1);
start=pos[i];
}
String str_latitude=Getstring(3);
String str_longitude=Getstring(5);
Latitude=atof(str_latitude.c_str());
Longitude=atof(str_longitude.c_str());
SS.print("Latitude=");
SS.println(Latitude);
SS.print("Longitude=");
SS.println(Longitude);
return;
}
String Getstring(int index)
{
if(index>0 && index<fieldmax-1) return text.substring(pos[index-1]+1,pos[index]);
return String("");
}//
// 전자공작 : http://cafe.naver.com/circuitsmanual// DateTime : 2018-08-02 오후 5:56:20// by Ok-Hyun Park//#include <SoftwareSerial.h> // 소프트웨어 시리얼 포함#define fieldmax 13-1 // 메모리공간 차지 x 프로그램 메모리 할당int rx=2; // 들어오는 핀int tx=3; // 데이터 전송 핀SoftwareSerial gps(rx,tx); // 2번,3번핀에 시리얼포트 gps지정String text="";bool process_sentence=false;double Latitude;double Longitude;int pos[fieldmax]={0,};//void setup(){Serial.begin(9600);gps.begin(9600);}//void loop(){while(gps.available()){char c=gps.read();switch(c){case '\n': break;case '\r': process_sentence=true; break;default: text+=c; break;}}//if(process_sentence){process_sentence=false;if(text.startsWith("$GPGGA")){ Serial.println(text); print_info(Serial); }text="";}}//template<class T>void print_info(T&SS){int start=0;for(int i=0;i<fieldmax;i++){ pos[i]=text.indexOf(',',start+1); start=pos[i]; }String str_latitude =Getstring(3); Latitude =atof(str_latitude.c_str()); SS.print("Latitude="); SS.println(Latitude);String str_longitude=Getstring(5); Longitude=atof(str_longitude.c_str()); SS.print("Longitude="); SS.println(Longitude);return;}//String Getstring(int index){if(index>0&&index<fieldmax-1)return text.substring(pos[index-1]+1,pos[index]);return String("");}
GPS 포멧부터 알아야합니다.
GPGGA$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48
- 114455.532는 시간으로서 Zulu time (그리니치 표준시) 기준으로 11시 44분 55.532초를 뜻한다.
- 3735.0079는 위도로서 37도 35.0079분을 뜻한다. 도(degree) 단위로 환산시, 35.0079/60 = 0.5 대략 37.5도가 된다.
- 뒤의 N은 북위를 뜻한다. 적도 남쪽에 있다면 S가 된다.
- 12701.6446은 경도로서 127도 1.6446분을 뜻한다. 도(degree) 단위로 환산시, 1.6446/60 = 0.027 대략 127.0도가 된다.
- 뒤의 E는 동경을 뜻한다. W가 되면 서경이 된다.
- '1'은 Fix의 종류를 뜻한다. 이 자리의 숫자에 따른 뜻은 다음과 같다.
- 0 : Invalid 잘못된 데이터. 주로 위성이 안 잡힐 경우.
- 1 : GPS에서 제공하는 기본 위성을 가지고만 계산할 경우.
- 2 : DGPS를 이용하여 보정하여 계산할 경우
- DGPS를 이용할 경우 더욱 정확한 측정이 가능해진다. DGPS는 지구의 지표의 위치가 명확히 알려진 곳에 기지국을 설치하거나 또 다른 위성(NAVSTAR GPS위성이 아닌 타 위성)이 GPS송출 신호를 내보내어 보정하도록 하는 방법이다. 보통 15M정도의 오차를 가지는 GPS가 DGPS로 보정할 경우 5M로 오차가 줄어들게 된다.
- '03'은 계산에 사용한 위성을 개수를 나타낸다. 위치를 알기 위해서 최소3개 이상의 신호를 받아야 한다.
- '7.9'는 horizontal dilution of Precision으로 2차원적 오차결정(수평방향)을 뜻한다.
- '48.8M'는 해수면 기준 고도이다.
- '19.6M'는 WGS-84에서 정해놓은 타원체로서 모델링한 지구와 구체로서 모델링된 지구의 고도차이를 뜻한다.
- '0.0'과 '0000'은 DGPS 사용시 마지막으로 update한 시간과 DGPS 기지국의 ID이다.
- '48'은 Check Sum이다.
$GPGGA, 시간, 위도, 북위, 경도, 동경, Fix종류, 위성개수,7.9,48.8,M,19.6,M,0.0,0000*48여기서 위도와 경도를 파싱하는 코드입니다.String str_latitude =Getstring(3);String str_longitude=Getstring(5);3번째 위도와 5번째 경도를 읽어서 출력하고 있죠//while(gps.available()){char c=gps.read();switch(c){case '\n': break;case '\r': process_sentence=true; break;default: text+=c; break;}}GPS는 문자열 마지막에 '\n'와 '\r'를 붙여서 전송하는데앞부분의 문자들은 text+=c; 스트링에 더해주고'\r'를 받으면 process_sentence=true; 다 받았다는 체크를 하고if(process_sentence){process_sentence=false;if(text.startsWith("$GPGGA")){ Serial.println(text); print_info(Serial); }text="";}"$GPGGA"를 받았다면 print_info(Serial) 위도와 경도를 추출하기 위해서 파싱을 시작합니다.모르는 문법은 웹검색으로 찾아서 공부하세요
댓글 0
조회수 8,340등록된 댓글이 없습니다.