Cantus Trip 보드에는 지난 직렬통신으로 컴퓨터와 대화하기에서 간단히 언급한 UART 이외에도 UART가 8개나 들어 있다. 그리고, 웬만한 디지털 장치들에는 UART는 기본으로 넣어 두고 다른 인터페이스가 더 들어  있다. 둘러보니 회사 자리에 이런 저런 이유로 갖다 놓은 UART 인터페이스 장치가  꽤 된다. GPS 모듈도 UART로 연결되게 되어 있고, 무선랜(WiFi) 모듈도 있고, 블루투스 모듈도 자리에 몇 개씩 있다.

이 모든 장치를 다 붙여 보는 예제를 보여줄지는 앞으로 두고 볼 일이지만 우선 GPS를 연결해봤다. GPS로 받는 데이터를 원하는 데이터만 추출해서 여러가지 용도의 응용을 만들어 낼 수 있겠지만, 그렇게 데이터를 가지고 노는 것까지 프로그램을 진행하다가 괜히 이 글을 읽는 사람중에 프로그램이 익숙치 않은 이들이 오히려 거부 반응을 일을킬 것 같아서한 발짝 뒤로 물러섰다.  여기서는 UART 장치를 Cantus의 다른 UART 포트에 연결하고 그 UART 포트로 데이터를 읽어들이는 것만 살펴보려고 한다.

GPS는 간단히 +,- 전원 2핀과 UART의 송신, 수신 2핀만 연결해도 동작 잘~한다.  세팅을 위해서 GPS의 수신 포트도 필요한 경우가 있겠지만 세팅은 PC에 연결해서 이미 해 둔 모듈이거나 출고 당시의 값을 그대로 쓴다고 생각하고 GPS에 전원이 들어가면 반복해서 UART로 출력하는 내용만 받아서 가공해 본다. 전원은 J1에 있는 3.3V와 GND에서 각각 연결하였고, 역시 J1 커넥터에서 UART 신호도 연결하기 위해서 찾아봤더니 UART #1이 33, 34번 UART #0이 35, 36번핀에 할당되어 있다. 물론 이 4핀이 기본 설정에서는 GPIO 그룹#4의 3, 2, 1, 0번 핀이었다.

Cantus의 GPIO는 모두 기타 기능핀으로 변경해서 사용할 수 있는 핀 먹스 (Pin mux) 기능이 있다. 프로그램에서 설정은

*R_PAF4 = 0xFF00;  // UART0, UART1, GPIO

라고 해주면 간단히 해결된다. 아, SDK를 처음 다운 받았으면 기본으로 컴파일 되어 제공되는 라이브러리에 디버깅 용도로 사용되는 UART #7 이외에는 비활성화 되어 있는 상태이기 때문에 라이브러리에서 사용하고자 하는 UART를 활성화 시켜둬야 하는 과정이 있다. 이 과정은 한번만 설정하면 되는 것이라 이미 한 사람도 있을 수 있기에 필요할 경우 추후 설명하도록 한다. UART #1과 #0의 기능을 할 수 있도록 GPIO의 기능이 바뀌어 있으면 이 UART의 데이터 속성에 대해서 지정해주어야 한다.

UartConfig(7,115200,DATABITS_8,STOPBITS_1,UART_PARNONE); // 디버깅용 UartConfig(1, 9600,DATABITS_8,STOPBITS_1, UART_PARNONE); // GPS 연결용

내가 가지고 있는 GPS 모듈은 속도가 9600bps였다. 디버깅용 UART #7 설정 아래에 같은 모양으로 #1을 9600bps 속도로 지정해 줬다. 완전히 독립적인 UART 8쌍이기 때문에 위와 같이 서로 다른 속도로 동작시켜도 전혀 문제 되지 않는다. 물리적인 연결과 세팅은 모두 끝났고, GPS로 데이터를 받아들여 보도록 한다.

아래의 그림은 UART Ch.1로 수신된 한 글자를 UART Ch.7로 무한히 뿌려준 결과이다.

뭔가 복잡~~한 내용이 잔뜩 뜬다. 여기까기 쓰고 글 끝내려고 하니까, UART에 외부 장치 연결한 것까진 맞는데 뭔가 아쉽다.

GPS가 어떤것인지, GPS 내용을 어떻게 해석해야하는지는 논외로 하고, 이중에서 $GPGGA로 시작하는 줄에서 몇가지 정보를 추출하는 것을 해보자.

$GPGGA,084139.000,3730.0904,N,12704.0029,E,1,08,1.6,86.9,M,19.7,M,,0000*6D

라는 줄을 어떻게 해석하느냐..

각 필드는 컴마(,)로 구분되어 있는데 제일 처음이 시간정보이다. 그리니치표준시각을 기준으로 표시되기 때문에 084139.0000는 GMT 08:41:39가 된다. 우리나라가 9시간르니까 17:41:39가 된다. 두번째부터 나와 있는 정보는 좌표값이다.  위도값, 남북, 경도값, 동서 순서로 표현된다. 위의 예에서는 북위(N) 37도 30.0904분 동경(E)127도04.0029분이 되는 것이다. 몇 필더 뒤에 M이라는 것이 두군데 나온다. 미터값으로 표시되었다는 이야기이고, 86.9미터 높이를 얻었는데, 해수면 기준으로 볼 때 19.7미터를 보정하라고 알려주는 내용이어서 이 GPS를 가지고 테스트 했던 곳이 높이 86.9+19.7=106.6 미터 되는 곳이다. 뭐, 나를 스토킹하는 사람은 없겠지만 내가 어디서 저 값을 읽어 봤는지 알고 싶으면 위의 위도, 경도에 찍히는 위치에서 높이 106.6미터 지점으로 찾아오면 된다.

이 아래의 부분은 데이터에서 원하는 정보를 추출해 내는 부분인데, 이쁘게 정렬해서 보여주도록 프로그램은 짜 봤지만 다~~~ 지우고 딱 아래 부분만 남겨봤다.

UART로 데이터가 들어왔을 때 $로 시작하면 문자열 변수 gps_data에 데이터를 채우기 시작하다가 줄바꿈 문자(‘\r’)가 들어오면 0을 하나 더 쓰고 문자열 저장을 마무리한다. 이렇게 하면 $로 시작하는 한 줄이 하나의 문자열에 저장된다.

이 것 중에서 strncmp() 라는 문자열 관련 C 라이브러리 함수를 이용하여서 $GPGGA 6글자로 시작하는 줄만 추출했다. 다시 이 문자열에서 GMT(0) 기준 시간은 서울표준시(+9)로 바꾸어 주기 위해서 시간필드의 첫 두 글자를 바꿔주는 수식을 적용해봤다.

마찬가지 방법으로 또 다른 데이터 부분을 추출해서 사용하고 한다면 그 아래에 계속해서 나오는 부분을 살펴보면 된다. strtok() 함수를 이용해서 컴마(,) 기준으로 데이터를 추출하는 부분이다.  이렇게 구분된 값을 이용해서 목적에 맞는 프로그램으로 확장하는 것은 이 글을 읽는 여러분께 맡겨둔다.

아래의 그림은 위의 프로그램 부분을 수행한 결과이다.


$GPGGA로 시작한 한줄을 출력하고, 거기서 한국 시간으로 변환된 값을 출력하고,

이어서 각 줄에는 컴마 기준으로 유효한 필드 값을 차례대로 출력하였다.

 

UART 연결은 쉽게 끝났는데, 데이터 처리 때문에 괜히 말이 길어진 듯 하다. 나중에 무선랜 모듈이나 블루투스 모듈의 연결에 대해서도 기회가 되면 포스팅을 하도록 하고,  아래에 소스 첨부해 놓고 이제 잠자리로 간다.

03.GPS_TRIP_20110112