본문 바로가기
아두이노 통신

[통신/GPS] 위도 경도 값을 불러와 활용하는 GPS(NEO-6M) 모듈을 구동해보자

by 작동미학 2015. 6. 15.
반응형

Blox의 NEO-6M(GY-GPS6MV2) GPS모듈을 사용하여, 야외에서 현재 위치와 시간, 속도 등을 파악할 수 있다

 

▶ 이 가이드를 따라하면

- GPS모듈을 활용할 수 있다

- TinyGPS 라이브러리를 통해 GPS의 각종 값을 얻어와 활용할 수 있다.

 

▶ 먼저 읽으면 좋은 글

- 라이브러리 설치 방법 : http://bbangpan.tistory.com/1

 

▶ 부품 설명 및 회로 구성

Blox의 NEO-6M은 1만원 전후로 구매할 수 있는 GPS 모듈이다. 매우 작으며, 성능도 무난하고, 시리얼 통신에 기반하므로 필요한 핀 수도 적다. 대개 야외에 노출되면 10~30초 정도 안에 위성신호를 감지하여 깜빡거린다. 필요한 전압은 3V~5V라서 Arduino와 사용하기 좋다. 안테나는 별도로 내장되어 있어서 필요시 납땜하여 사용하면 된다.

<blox의 NEO-6M 모듈>

GPS는 궤도상에 떠있는 여러 개의 인공지능이 발송하는 시간과 위치 정보를 종합하여, 현재 위치와 움직이는 속도, 고도, 시간 등을 모두 제공하는 편리한 모듈로, 네비게이션시 매우 유용하게 쓰일 수 있다. 이를 활용하기 위하여 TinyGPS (https://github.com/mikalhart/TinyGPS)를 사용하면, 시리얼로 GPS신호를 읽어와 다양한 정보를 얻어올 수 있다. TinyGPS가 제공하는 예제를 보면 더욱 다양한 활용이 가능하다.

여기서 구현할 때는 야외라는 특성상 OLED 모듈을 붙여서, 측정된 값이 보이게 하였다. OLED 모듈 강좌는 http://bbangpan.tistory.com/4 를 참조하도록 한다.

NEO-6M의 데이터 핀 연결은 간단해서 VCC->5V, GND->GND로 연결하고 RX는 Arduino의 TX pin(TX2)에 TX는 Arduino의 RX pin(RX2)에 연결한다(Arduino Mega ADK기준)

<NEO-6M과 Arduino Mega ADK와의 연결>


▶ 소스 코드 입력 및 구동

Arduino Sketch 1.7.4버전에 Mega ADK상에서 구동하였다. Mega 2560도 그대로 호환가능할것이고, Arduino UNO에서 구동하기 위해서는 소스파일의 시리얼을 소프트웨어 시리얼로 바꾸자. 즉 mySerial을 활성화시키고(관련 주석 제거), Serial2를 모두 mySerial로 교체하면 된다. NEO-6M과의 시리얼 통신 속도는 기본 9600bps를 사용한다.

그리고 Arduino Mega의 경우 가급적 H/W 시리얼(Serial1, Serial2, Serial3같은)을 사용하도록 하자. 특정핀은 RX/TX용도로 사용할 수 없는 것도 있어서 작동하지 않을 수 있다.

 

GitHub 링크 : https://github.com/bbangpan/bbangpan.com/blob/master/neibc_gs6mv2_oled_tinygps/neibc_gs6mv2_oled_tinygps.ino

 

http://www.bbangpan.com  -------------------------------------------------------------------------------------------------------------

/* Originally posted on www.bbangpan.com

 

Program Description: FM module test code

Needed library : TinyGPS https://github.com/mikalhart/TinyGPS

Tested on : Arduino 1.7.4, Arduino Mega ADK, blox Neo 6M GPS Module, TigyGPS

 

Copyright (c) 2015 www.bbangpan.com. All rights reserved.

This program can be used for any non-commercial purpose freely. */

 

//#include <SoftwareSerial.h> // Arduino UNO사용시 활성화한다

#include <TinyGPS.h>

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

 

//SoftwareSerial mySerial(3,4); // RX(<-TX of GPS module), TX(<-RX of GPS module)

TinyGPS gps;

 

void gpsdump(TinyGPS &gps);

void printFloat(double f, int digits = 2);

 

void setup()

{

Serial.begin(9600);

 

// set the data rate for the SerialPort(use SoftwareSerial port on Arduino UNO)

Serial2.begin(9600); // Serial2->mySerial on Arduino UNO

 

delay(1000);

Serial.print("uBlox Neo 6M / TinyGPS testing - ");

Serial.println(TinyGPS::library_version());

 

u8g.setFont(u8g_font_unifont);

u8g.drawFrame(2,2,126,62);

u8g.firstPage();

do {

u8g.setPrintPos(6,20);

u8g.print("GPS Ready");

} while( u8g.nextPage() );

}

 

void draw(float lat, float lon, unsigned long l_date, unsigned long l_time, float f_alt, float f_speed) {

u8g.setFont(u8g_font_unifont);

 

u8g.firstPage();

do {

u8g.setPrintPos(1,10);

u8g.print("A:");

u8g.print(lat); // latitude

u8g.setPrintPos(1,20);

u8g.print("O:");

u8g.print(lon); // longitude

u8g.setPrintPos(1,30);

u8g.print("D:");

u8g.print(l_date); // date(ddmmyy, UTC 0)

u8g.setPrintPos(1,40);

u8g.print("T:");

u8g.print(l_time); // time(hhmmsscc, UTC 0)

u8g.setPrintPos(1,50);

u8g.print("A:");

u8g.print(f_alt); // altitude(cm)

u8g.print("/S:");

u8g.print(f_speed); // speed(km per hour)

} while( u8g.nextPage() );

}

 

void loop() // run over and over

{

bool newdata = false;

unsigned long start = millis();

float flat, flon, falt, fspeed;

unsigned long date, time, age;

 

// Every 2 seconds we print an update

while (millis() - start < 5000) {

if (Serial2.available() && gps.encode(Serial2.read())) {

newdata = true;

// break; // uncomment to print new data immediately!

}

}

 

if (newdata) {

gps.f_get_position(&flat, &flon, &age);

gps.get_datetime(&date, &time, &age);

fspeed = gps.f_speed_kmph();

falt = gps.f_altitude();

draw(flat, flon, date, time, falt,fspeed);

}

}

 

상기 소스는 GPS모듈이 야외에 노출되어 준비가 되면 신호들을 모두 디코딩하여 정보를 추출한 후 OLED에 출력하는 예제이다. 위도 및 경도, 날짜와 시간, 고도와 속도가 모두 표기된다.

해당 값을 필요시 내부적으로 다양하게 활용할 수 있다.

<출력 예시 첫 두줄이 위도와 경도이고, 다음 두 줄이 날짜(ddmmyy)와 시간, 맨 마지막이 고도와 속도이다. 상세는 소스를 확인한다>

▶ 구매 가이드

NEO-6M 모듈: http://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20150615063739&SearchText=NEO-6M ($10)

 

강의 키워드

Arduino Mega ADK, NEO-6m, blox, GPS module, 아두이노 네비게이션, 아두이노 지피에스, TinyGPS

 

 

반응형