본문 바로가기

아두이노 GPS 모듈 테스트

반응형

저번에 주문한 GPS를 학원에 가서 테스트 해봤다.



위의 짧은 영상을 보면 GPS 모듈에서 파란색 불빛이 나는데 불빛이 날때마다 데이터를 받아오는것 같다.



처음에는 안테나 방향을 모르고 모듈에다가 그냥 붙였다가 데이터가 깨지는것을 보고 위의 상태로 놨더니 잘된다.

(저 튀어 나온곳이 안테나 방향인듯하다)


저번에 말했던 것처럼 시리얼 통신을 하므로 핀이 4개가 있다(vcc, gnd, rx, tx)


Vcc에는 5v 3.3v 둘중 아무거나 연결해고 괜찮다고 한다.(난 5v에 연결했다)




SoftwareSerial 라이브러리를 이용하여 데이터를 읽을수 있다.


gps모듈의 rx와 tx는 각각 아두이노 2, 3번 핀에 연결했다.

////////////////////////////////////////////////////////////////////

#include "SoftwareSerial.h"


SoftwareSerial    gps(3, 2);


void setup() {

Serial.begin(9600);

Serial.println("Start");

gps.begin(9600);

}

void loop() {

if(gps.available()) {

 Serial.println(gps.read());

}

}

////////////////////////////////////////////////////////////////////


위의 코드를 실행하면 gps모듈에서 그대로 데이터를 받을수 있는데 데이터 형식이

NMEA(The National Marine Electronics Association)라는 기관에서 정한 형식을 따른다고한다.


http://www.gpsinformation.org/dale/nmea.htm


위의 URL을 들어가면 아래와 같은 표를 볼 수 있다.

Name 

 Garmin 

 Magellan 

 Lowrance 

 SiRF 

 Notes: 

 GPAPB

 N

 Y 

 Y 

 N 

 Auto Pilot B 

 GPBOD 

 Y

 N 

 N 

 N 

 bearing, origin to

destination - earlier G-12's

do not transmit this 

 GPGGA 

 Y 

 Y 

 Y 

 Y 

 fix data 

 GPGLL 

 Y 

 Y 

 Y 

 Y 

 Lat/Lon data - earlier

G-12's do not transmit this 

 GPGSA 

 Y 

 Y 

 Y 

 Y 

 overall satellite reception date,

missing on some Garmin models 

 GPGSV 

 Y 

 Y 

 Y 

 Y 

 detailed satellite data, missing on some Garmin models 

 GPRMB 

 Y 

 Y 

 Y 

 N 

 minimum

recommended

data when following a route 

 GPRMC 

 Y 

 Y 

 Y 

 Y 

 minimum recommended data 

 GPRTE 

 Y

 U  

 U 

 N 

 route data, only when there is an active route. (this is sometimes bidirectional) 

 GPWPL 

 Y 

 Y 

 U 

 N 

 waypoint data, only when there is an active route (this is sometimes bidirectional) 


위의 표를 보면 GPGLL이라는 값이 위도와 경도데이터를 가지고 있다는 것을 알 수 있다.




하지만 위의 표가 있어도 데이터를 보기 힘들고 사용하기도 복잡하다.



그래서 나는 TinyGPS라는 라이브러리를 이용했다.

TinyGPS-master.zip



위의 라이브러리를 추가하고


//////////////////////////////////////////////////////////////////////////////

#include <SoftwareSerial.h>

#include <TinyGPS.h>


TinyGPS gps;

SoftwareSerial Gps(3, 2);

void getgps(TinyGPS &gps);


void setup() {

Serial.begin(9600);

Gps.begin(9600);

}

void loop() {

while(gps.available()) {

int c = Gps.read();

if(gps.encode(c)) {

getgps(gps);

}

}

}


void getgps(TinyGPS &gps) {

float lat, long;

gps.f_get_position(&lat, &long);

Serial.print("Lat/Long:\t");

Serial.print(lat, 5);

Serial.print(",\t");

Serial.println(long, 5);


int year, month, day, hour, minute, second, hundredths;

gps.crack_datetime(&year, &month, &day, &hour, &minute, & second, &hundredths);


Serial.print("Date: "); Serial.print(year, DEC); Serial.print("/");

Serial.print(month, DEC); Serial.print("/"); Serial.println(year);

Serial.print("Time: "); Serial.print(hour, DEC); Serial.print(".");

Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC);

Serial.print("."); Serial.println(hundredths, DEC);


Serial.print("Altitude (meters): "); Serial.println(gps.f_altitude());

Serial.print("Course (degrees): "); Serial.println(gps.f_course());

Serial.print("Speed (kmph): "); Serial.println(gps.f_speed_kmph());

Serial.println();


unsigned long chars;

unsigned short sentences, failed_checksum;

gps.stats(&chars, &sentences, &failed_checksum);


delay(1000);

}



//////////////////////////////////////////////////////////////////////////////

위의 코드를 실행하고 시리얼 모니터를 키면 아래와 같은 화면이 나올 것이다.



(사진과 코드는 조금 다르다)


위의 보면 위도와 경도가 나와있고
날짜와 현재 시간이 정확하게 나와있다(아마 위성에서 받아온지라 매우 정확하다)
주의할 점은 위의 시간이 한국 시간 보다 9시 더 빠르다.


고도도 나와있는데 믿을만한지는 모르겠다.



위의 좌표를 구글맵에 검색하고 자신의 위치가 맞다면 성공한 것이다.

학원의 위치가 무악제인데 검색해보니 2m의 오차가 있긴 하지만

4000원 치고는 정확한 위치를 표시한다.





참고로 라이브러리를 안쓰고 바로 GPS에서 정보를 받을때 가끔 데이터가 깨지는데 이것은 경험상

안테나의 상태 때문인것 같다.(방향이라든지 전파방해라는지 등등)



반응형