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
'아두이노 통신' 카테고리의 다른 글
[통신모듈/HC-12] 저렴하고 긴 거리 통신이 가능한 HC-12 (4) | 2020.08.22 |
---|---|
[네트워크/이더넷쉴드] W5200, W5100 칩셋을 쓴 이더넷 쉴드(Ethernet Shield)로 유선랜을 써보자 (0) | 2015.10.18 |
[통신/근거리고속] 2.4Ghz 양방향 통신을 nRF24L01 모듈로 구현하자 (11) | 2015.05.22 |
[통신/중단거리] 중단거리 양방향 통신이 가능한 serial 기반의 손쉬운 네트워크 모듈 APC220 (4) | 2015.04.10 |
[통신/WiFi] WiFi 모든 것을 활용하는 Arduino WiFi Shield (CC3000) (17) | 2015.03.24 |
[통신/WiFi] 저가로 WiFi를 구현할 수 있는 모듈(ESP8266) (10) | 2015.03.22 |
[통신/BLE] BLE / iBeacon을 아두이노에서 구현하게 해주는 HM-10 (18) | 2015.03.13 |
[통신/블루투스] Bluetooth 2.0을 구현하는 HC-06모듈, 스마트폰과 아두이노 연동 (7) | 2015.02.16 |
[통신/근거리] 433/315Mhz 근거리 무선 송수신 통신을 아두이노(Arduino)에서 구현해보자 (8) | 2015.02.08 |