조립식 아두콥터에 설치된 규격 미상의 고성능 GPS 커넥터를 아두이노 우노 보드와 연결하여 GPS 위도와 경도 데이터를 받아 보도록 하자.
지자기 센서는 충분히 검증을 마쳤고 그 다음은 GPS 포트에 커넥터로 연결되는 4개의 배선 중 남은 2개의 데이터 선 배선을 조사해 보기로 한다.
4개의 배선 중에 이미 빨간 색과 검은 색은 아두이노의 5V 전원과 접지에 배선이 연결되어 있는 상태에서 나머지 Tx, Rx 선 배선을 할당하기로 한다.
현재 아무런 데이터 시트가 없으므로 일단 아두이노 우노 보드의 데이터 핀 5번과 6번에 나머지 2 배선을 할당하기로 한다. GPS 프로그램을 돌려서 데이터가 나오도록 두 핀을 한번 바꿔봐야 할 필요성이 있을 것이다.
아래의 예제 프로그램에 의하면 SoftwareSerial.h 라이브러리를 사용하고 있음을 알 수 있다. 이는 즉 GPS를 센서로 여기는 것이 아니라 1대1 UART 통신의 창구로 여긴다는 점이다.
아울러 TinyGPS.h 라이브러리도 함께 사용된다. TinyGPS 라이브러리를 사용하면 gpsSerial.read() 에서 데이터들이 우리가 쉽게 알아보기 어렵게 출력되므로 반드시 TinyGPS 라이브러리의 지원을 받아 위도와 경도 데이터를 뽑아낼 필요가 있다. 참고로 물론 시간 날짜 고도 데이터들도 출력이 가능하다.
TinyGPS 라이브러리는 아래의 github 주소에서 다운 받아 압축을 해제하고 아두이노 라이브러리 디렉토리 속이나 아니면 본인이 경로를 확실히 지정하여 설치한 다음 아두이노 편집기 스케치의 라이브러리 포함하기에서 .ZIP 라이브러리 추가 작업을 실시하여 그 경로를 확실하게 지정해 주도록 한다.
https://github.com/mikalhart/TinyGPS
아래의 간단한 GPS 프로그램 을 돌리면 프로그램이 데이터 출력 이전에 Start GPS ... 메시지를 준다.
만약 데이터가 출력되지 않으면 아두이노 우노 보드에서 데이터 핀
5번과 6번을 바꾸도록 한다.
GPS_ex_01
#include <SoftwareSerial.h>
#include <TinyGPS.h>
long lat,lon;
SoftwareSerial gpsSerial(6,5);
TinyGPS gps;
void setup() {
Serial.begin(9600);
Serial.println("Start GPS... ");
gpsSerial.begin(9600);
}
void loop() {
while(gpsSerial.available()){ // check for gps data
if(gps.encode(gpsSerial.read())){ // encode gps data
gps.get_position(&lat,&lon); // get latitude and longitude
// display position
Serial.print("Position: ");
Serial.print("lat: ");Serial.print(lat);Serial.print(" ");// print latitude
Serial.print("lon: ");Serial.println(lon); // print longitude
}
}
}//프로그램 끝
그림의 하단에 시리얼 모니터에서 위도와 경도 데이터가 출력되어 있음을 쉽게 알아볼 수 잇다. 단 백만(1,000,000)으로 나눠줘야 (37.228247,127.216016) 이라는 좌표를 얻을 수 있다.
이 좌표로 Daum에서 받은 키 값을 사용하여 지도 검색 결과, 지도 중앙에 용인송담대학교가 있음을 확인할 수 있을 것이다.
의외로 운 좋게도 창 가까이 실내에서 GPS를 사용했음에도 불구하고 제대로 된 위도와 경도 값을 잡아낸듯하다.
하지만 24시간 항상 실내에서 GPS 데이터를 수신할 수 있는 것은 아니듯 하다. 실제 야외에서 드론을 날릴 경우 필수적으로 많은 수의 GPS 위성을 확인해야한다.
한편 GPS내부에 지자기 센서도 함께 설치되어 있으나 GPS에 의한 위도 경도 데이터 추출 작업과는 직접적인 관계가 없음에 유의하자.