GPS 모듈 예제 코드 (NEO-6M GPS Module)

1. GPS Module

 

GPS 모듈이 사용하는 프로토콜과 관련된 자료들은 아두이노 GPS 강좌 페이지에 간략하게 잘 소개되어 있습니다. 다만 GPS 소개 내용만 참고하시고 연결 방법 및 소스는 다른 방법으로 사용하는 것이 더 좋아보입니다.

여기서 소개하는 NEO-6M GPS 모듈 스펙입니다.

  •     U-blox/u-blox NEO-6M GPS module with antenna and build-in EEPROM
  •     This module is compatible with APM2 and APM2.5, and EEPROM can save all your configuration data.
  •     Interface: RS232 TTL
  •     Power: 3-5v
  •     Baudrate default:9600bps
  •     Without battery  (it’s not safty by air mail).
  •     The battery Model is MS621FE,Need to welding

 

GPS 모듈은 National Marine Electronics Association (NMEA) 프로토콜이라 불리는 일련의 string을 출력해줍니다. 여기에 위치, 방향, 시간, 좌표 등의 데이터가 담겨져서 넘어옵니다. 따라서 이 string 에서 우리가 필요로 하는 값을 integer, long, float 등의 변수값으로 바꿔주는 작업이 필요합니다.

GPS 모듈은 아래와 같이 4개 section으로 구분해서 string 데이터를 출력해줍니다.

  • $GPGGA: Global Positioning System Fix Data
  • $GPGSV: GPS satellites in view
  • $GPGSA: GPS DOP and active satellites
  • $GPRMC: Recommended minimum specific GPS/Transit data

여기서 $GPRMC string에 GPS 사용을 위한 최소한의 필수 데이터가 있습니다. 아래는 $GPRMC string 상세내용입니다.

위 내용에 따라 string을 읽어서 약간의 처리를 거쳐 출력하면 아래와 같이 출력됩니다.

경우에 따라서는 직접 이렇게 처리할 수도 있겠지만 라이브러리를 사용하면 훨씬 간편하게 코드를 작성할 수 있습니다.

 

 

2. 연결 방법, 라이브러리

 

일반적으로 많이 사용되는 GPS 모듈들은 Serial 통신을 지원합니다. 그래서 4개의 핀을 가지고 있습니다. (TX, RX, VCC, GND) 아두이노 공식 사이트에서는 TX-1번 핀, RX-0번 핀에 연결해서 하드웨어 시리얼 통신을 사용하는데 (Serial() 함수), 이렇게 하면 디버그용 메시지 출력을 할 수 없어 불편합니다.

아두이노 GPS 강좌 페이지

그래서 보통 포럼을 보면 TX, RX 를 다른 디지털 핀에 연결하고 SoftwareSerial 라이브러리를 사용해서 통신하도록 작성한 코드가 많습니다.  일단 여기 예제에서는 TX, RX 핀을 아두이노의 11번, 10번 핀에 연결합니다.

그리고 GPS에서 데이터를 읽어오는 부분은 TinyGPS 를 이용해 쉽게 구현할 수 있습니다.

TinyGPS official page: http://arduiniana.org/libraries/tinygps/

TinyGPS download : https://www.pjrc.com/teensy/td_libs_TinyGPS.html (라이브러리만 다운로드 받아 쓰세요. 예제는 아두이노 호환 보드용이라 일반적인 아두이노 보드에서는 오동작합니다.)

 

 

3. 소스 코드 (스케치)

 

소스코드 출처: http://tny.cz/d19906cc

NEO-6M 모듈의 기본 Baudrate = 9600bps 입니다. mySerial.begin(9600)으로 초기화 하도록 합니다.

일견 복잡해 보이지만 많은 부분이 디버깅용 string 출력 코드입니다.

  • setup() 에서 초기화하고 loop() 시작하면서 GPS 데이터를 읽어옵니다.
  • 그리고 GPS 데이터 셋을 모두 읽으면 newdata 변수가 true로 셋팅됩니다.
  • 이제 gpsdump() 함수로 데이터를 Serial 로 출력해줍니다.
  • 필요한 데이터가 있으면 gpsdump() 함수안에서 필요한 데이터를 찾아 저장한 다음 다른 곳에서 사용하면 됩니다.

 

위 예제 코드 외에도 GPS 라이브러리 안에 포함된 예제(test_with_gps_device.ino)를 사용해도 됩니다. 거의 유사하게 코드가 작성되어 있습니다.

주의!! GPS 모듈을 테스트 해보니 실내(창가)에서는 신호가 잡히지 않는 것 같습니다. GPS 모듈을 들고 야외로 가야 신호가 잡혔습니다. 그리고 야외로 나가더라도 GPS 신호를 잡아서 출력하기까지 상당한 시간 (제 경우는 2분 이상)이 소요되었습니다. 그리고 신호가 잡히지 않는 실내로 들어와도 이전에 잡은 GPS 위치를 계속 받는 등의 문제가 있었습니다. Neo-6M 모듈은 정확도를 요구하는 작업에 쓰기에는 부족할 것 같습니다.

 

위와 같은 문제 때문에 실외에서 테스트 하기 좋도록 예제 코드를 만들었습니다. 아래 링크에서 다운로드 받으면 됩니다.

들고 다니기 좋도록 아두이노 나노 + GPS + OLED(I2C, SSD1306) + 휴대폰용 보조 배터리를 붙였습니다. 아래처럼 연결하면 됩니다.

  • GPS TX –> 아두이노 나노 D2
  • GPS RX –> 아두이노 나노 D3
  • GPS VCC –> 아두이노 나노 5V
  • GPS GND –> 아두이노 나노 GND
  • OLED VCC –> 아두이노 나노 3V3
  • OLED GND –> 아두이노 나노 GND
  • OLED SDA –> 아두이노 나노 A4
  • OLED SCL –> 아두이노 나노 A5

neo6m_gps_test

야외에 들고 나가서 측정해보면 몇 분 지나 GPS 신호를 잡습니다. GPS 신호가 잡히면 위도, 경도 값을 소수점 2째 자리까지 화면에 표시해줍니다.

 

 

Post Author: TORTUGA

TORTUGA
궁금하신 점은 새로 개편한 홈페이지의 QnA 게시판을 이용해주세요!!!!!!! http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=qna

댓글 남기기

이메일은 공개되지 않습니다.