앞에서 알아 본 TIMEUTC와 POSLLH 메시지를 분석하여 현재 시간과 위치를 출력해서 제대로 동작되는 프로그램을 만들어 볼 것이다. 위에 보이는 그림처럼 일정한 주기로 보내주는 시간과 위치 정보를 분석하여 콘솔화면에 출력해 보는 것이다. void setup() { uart0.init(); uart1.init(); stdout = std_inout; _delay_ms(500); printf("\x1B[2J\x1B[H GPS Test Program\n"); send_cfg_prt(); _delay_ms(100); gps.cfg_msg_utc(); _delay_ms(100); gps.cfg_msg_loc(); sei(); } 두개의 UART를 초기화 한다음 UART0로 디버깅 메시지를 출력해주기 위해서 ..
이전의 두개의 글에서 현재 시간을 가지고 오거나 현재 위치 정보를 가지고 오기 위해서는 매번 필요한 키를 입력해 주었다. GPS 모듈에 처음 전원이 들어왔을때 NMEA 메시지를 주기적으로 보내주는 것처럼 UBX 메시지도 주기적으로 보내주면 좋을것 같다. 이를 위해서 CFG-MSG 패킷을 이용하면 된다. CFG-MSG 패킷에 원하는 메시지에 해당하는 class ID와 message ID를 넣어주면 된다. void loop() { uint8_t ch; if (uart0.getchar(ch)) { if (ch == 'p') gps.cfg_prt(); if (ch == 'm') gps.cfg_msg(); if (ch == 'u') gps.nav_utc(); if (ch == 'l') gps.nav_loc(); ..
현재 위치 정보를 가지고 오기 위한 UBX 메시지는 NAV-POSLLH 이다 void loop() { uint8_t ch; if (uart0.getchar(ch)) { if (ch == 'p') gps.cfg_prt(); if (ch == 'u') gps.nav_utc(); if (ch == 'l') gps.nav_loc(); } if (uart1.getchar(ch)) { uart0.puthex(ch); } } void Gps::nav_loc() { make_header(CLASS_NAV, NAV_POSLLH, 0); chksum(0); uart1.send_data(gps_data, 8); } 'l' 키를 누르면 NAV-POSLLH request 메시지를 내 보낸다. 오렌지 색으로 보이는 영역이 경도 ..
현재 시간을 알려주는 UBX 패킷은 NAV-TIMEUTC이다. void loop() { uint8_t ch; if (uart0.getchar(ch)) { if (ch == 'p') gps.cfg_prt(); if (ch == 'u') gps.nav_utc(); } if (uart1.getchar(ch)) { uart0.puthex(ch); } } void Gps::nav_utc() { make_header(CLASS_NAV, NAV_TIMEUTC, 0); chksum(0); uart1.send_data(gps_data, 8); } 'u' 키를 누르면 UTC time을 가지고 오는 패킷을 내보낸다. request 메시지는 payload없이 class ID와 message ID만 보내주면 된다. 빨간색으로 ..
첫번째로 구현할 UBX 패킷은 CFG-PRT이다. GPS 모듈은 전원이 인가되면 기본적으로 몇개의 NMEA 메시지를 자동으로 송신하도록 되어 있다는 것은 앞에서 몇차례에 걸쳐서 얘기하였다. UBX 패킷을 이용하기 위해서는 자동으로 송신되는 NMEA메시지를 보내지 않도록 해주어야 한다. 이를 위해서 CFG-PRT 패킷을 사용하면 된다. 위의 그림은 CFG-PRT 패킷의 구조를 설명하고 있는데 여기에서 중요한 부분은 Proto Mask 부분이다. 그림에 표시되어 있는것처럼 NMEA 메시지와 UBX 메시지를 enable/disable 할수 있다. CFG-PRT메시지를 보낼때 UBX 메시지만 송수신 할수 있도록 해주면 된다. void loop() { uint8_t ch; if (uart0.getchar(ch))..
앞에 글에서 본 것처럼 GPS에서 보내는 데이터는 모두 $로 시작되는 문자열로 되어 있다. 콘솔창에 보이는 데이터는 NMEA protocol로 정해진 표준에따라 정의되어 있다. 위의 그림처럼 $로 하나의 프레임이 시작되고, 뒤이어 GP문자열이 나온다. 메세지 종류에 따라 세글자로 구분되어 진다. 예를 들어, 위치정보에 해당되는 메세지 코드는 GLL이며 다음과 같이 정의 된다. $GPGLL,다음에 위도에 해당되는 값이 나오고, 북위 혹은 남위를 나타내는 글자가 나온다. 다음으로는 경도값이 나오고 동경, 서경을 구분하기 위한 글자가 뒤따른다. 그 다음에는 시간정보도 같이 나온다. 예를 들어 위와 같이 4717.11364N, 00833.91565E와 같은 데이터가 들어 왔다면 아래와 같은 방법으로 변환 하면된..
프로젝트에 사용하는 GPS 모듈은 UART 통신을 사용하므로 UART 블럭이 2개 이상 지원되는 마이크로컨트롤러를 사용하는것이 프로그램 디버깅에 편리하다. 따라서 이번 프로젝트에서는 UART가 2개 들어있는 Atmega128A를 사용한다. Atmega128A 프로젝트를 생성하고 CPU 클럭을 위 그림처럼 보드에 맞게 설정해 준다. 참고로 C++ 프로젝트로 진행할것이기 때문에 AVR/GNU C++ Compiler에서 Symbols를 선택하였지만, 만약 C 프로젝트라면 AVR/GNU C Compiler에 있는 Symbols를 선택한 후 F_CPU값을 입력해 주어야 한다. 프로젝트 생성이 끝나면 UART0는 디버깅을 위하여 baudrate 값을 115200로 설정하고, UART1은 GPS와 연결하기 위하여 9..
이번에는 GPS 모듈을 사용하여 현재 시간, 위치, 속도 등등 필요한 정보를 GPS로부터 받아오는 방법에 대해서 설명한다. 프로젝트에서 사용할 GPS모듈은 u-blox에서 만든 neo-6m이다. 프로젝트를 시작하기에 앞서 가장 먼저 해야 할 일은 가지고 있는 GPS 모듈이 정상적으로 잘 동작하는지 확인해 보는 것이다. 이런 확인을 제대로 하지 않고 프로젝트를 진행했을때 원하는 결과가 나오지 않을 경우 코드를 디버깅하느라 쓸데없는 시간과 노력을 들이게 된다. 일단 아래 그림처럼 GPS 모듈을 UART 모듈과 직접 연결하여 PC에서 GPS가 정상적으로 동작되는지 확인한다. 위와 같이 연결한 후 컴퓨터의 UART 콘솔창을 열고 baudrate를 9600으로 설정한 후 GPS로부터 데이터가 잘 들어오는지 확인 ..