위의 짧은 영상을 보면 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라는 라이브러리를 이용했다.
위의 라이브러리를 추가하고
//////////////////////////////////////////////////////////////////////////////
#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);
}
//////////////////////////////////////////////////////////////////////////////
위의 코드를 실행하고 시리얼 모니터를 키면 아래와 같은 화면이 나올 것이다.
학원의 위치가 무악제인데 검색해보니 2m의 오차가 있긴 하지만
4000원 치고는 정확한 위치를 표시한다.
참고로 라이브러리를 안쓰고 바로 GPS에서 정보를 받을때 가끔 데이터가 깨지는데 이것은 경험상
안테나의 상태 때문인것 같다.(방향이라든지 전파방해라는지 등등)
'아두이노' 카테고리의 다른 글
아두이노 레오나르도 마우스 (총 게임) (2) | 2017.03.11 |
---|---|
아두이노 부품 정리 (37개) (0) | 2017.03.08 |
아두이노 부품 구매 (3) | 2017.01.31 |
아두이노 RFID 모듈 사용(RFID RC522) (0) | 2016.12.23 |
아두이노 릴리패드 (0) | 2016.11.05 |