검색
홈으로 마이페이지 주문조회 장바구니
로그인
회원정보 게시판
회사소개 이메일
도서(BOOK)
키트(KIT)
특판 상품
졸업작품&전자기초
응용모듈
전자부품
모터
기구
엔클로져
고객센터 게시판
자유게시판
MCU 통합 게시판
강좌-RaspberryPi
강좌-드론(쿼드콥터)
강좌-아두이노(기초)
강좌-아두이노(응용)
신제품/신기술 소개
DIY 공작 게시판
윤교수의 연구실 칼럼
 ☎ : 02-776-4868

 F: 02-779-6757

☞ 평일 : 09~18시
☞ 주말 : 10~13시


국민822401-04-027758
☞ 예금주 : Ohm사
국민822401-04-027761
☞ 예금주 : R&C사
 
 
1 (주)알트소프트 사이트
 
2 LabVIEW 강좌 사이트
 
3 윤교수의 마이크로프로세서 월드
 
4 전자 엔지니어
 

 

 
강좌-아두이노(응용)
 
2014. 07. 18 (09:51)
제목[아두이노 응용] 3. GPS 쉴드 - 1
작성자 조회 : 7089


★첨부파일★

circuit.pdf

DataSheet.pdf

TinyGPS.zip

 

 

3. GPS 쉴드(Shield) – 1

 

이번 강좌에서는 GPS 쉴드의 사용법에 대해서 알아 보도록 한다. GPS 모듈을 사용하는 쉴드를 소개하며, GPS 라이브러리와 예제를 다뤄보도록 한다.

 

여기서 사용하는 GPS 쉴드는 Itead사의 GPS Shield V1.1이며, 여기에 사용된 GPS 모듈은 RoyalTek사의 REB-4216 모듈이다. 자세한 내용은 첨부 파일을 참고하기 바란다.

 





 

GPS 모듈에 대한 사양은 아래와 같다.


 

GPS 쉴드에 대한 간단한 사양은

 

 

GPS 쉴드 보드의 핀맵은

 

 

시리얼 인터페이스로 GPS 데이터를 입력 받을 수 있는 장점이 있지만, GPS 모듈의 통신 속도(4800bps) GPS 쉴드 보드(38400bps)의 통신 속도가 차이가 좀 있었다. 실제로는 9600bps.

어디서 문제가 있었는지는 모르겠지만, 일단 9600bps의 통신 속도를 가지고 입력을 받을 수 있었기에 모듈에서 출력되는 신호를 시리얼 터미널에 출력해 보았다.

 

GPS 쉴드 보드와 아두이노 보드의 연결은 D0, D1으로 표시되어 있지만, 실제로는  점퍼핀을 이용해서 D0~D7까지 선택이 가능하며, 이 강좌에서는 D3(TXD), D4(RXD)를 이용하기로 한다.

, 아두이노 보드와 GPS 쉴드 보드는 소프트웨어 시리얼을 이용하여 9600bps의 속도로 연결을 하며, 아두이노의 시리얼 포트는 115200bps의 속도로 시리얼 터미널에 GPS 데이터를 출력하도록 한다.

 

 

#include

 

SoftwareSerial nss(3, 4);

 

void setup()

{

  Serial.begin(115200);

  nss.begin(9600);

}

 

void loop()

{

  if(nss.available()){

    Serial.write(nss.read());

  }

}

 

 

위 코드의 내용은 어렵지 않을 것으로 생각된다. GPS 쉴드에서 전송된 데이터를 아두이노와 연결되어 있는  PC 시리얼 포트로 전송하는 예제로 실제 GPS 모듈에서 출력되는 GPS 데이터를 출력하기 위한 코드이다. 일반적으로 GPS 데이터는 1초에 한번씩 출력이 되며, 암호(?) 같은 데이터들이 전송되는 것을 볼 수 있다.

 

 

위에 표시되는 GPS 데이터에 대해서는 이곳에서는 별도로 설명하지는 않겠다. 친절하게도 필요한 라이브러리가 제공되고, 간단한 예제도 제공되기 때문에 이를 이용하기로 한다. TinyGPS라는 라이브러리로 첨부 파일에서 확인 할 수 있다.

일단, 첨부 파일을 다운 받아서 본인의 아두이노 라이브러리 폴더에 설치한 후에, 아래와 같은 예제를 열어 보자.

 

 

 

#include

 

#include

 

/* This sample code demonstrates the normal use of a TinyGPS object.

   It requires the use of SoftwareSerial, and assumes that you have a

   4800-baud serial GPS device hooked up on pins 3(rx) and 4(tx).

*/

 

TinyGPS gps;

SoftwareSerial nss(3, 4);

 

static void gpsdump(TinyGPS &gps);

static bool feedgps();

static void print_float(float val, float invalid, int len, int prec);

static void print_int(unsigned long val, unsigned long invalid, int len);

static void print_date(TinyGPS &gps);

static void print_str(const char *str, int len);

 

void setup()

{

  Serial.begin(115200);

  nss.begin(4800);

 

Serial.print("Testing TinyGPS library v. ");

Serial.println(TinyGPS::library_version());

  Serial.println("by Mikal Hart");

  Serial.println();

  Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));

  Serial.println();

Serial.println("Sats HDOP Latitude Longitude Fix  Date       Time

       Date Alt     Course Speed Card  Distance Course Card  Chars

 Sentences Checksum");

  Serial.println("          (deg)    (deg)     Age                        Age  (m)     --- from GPS ----  ---- to London  ----  RX    RX        Fail");

  Serial.println("--------------------------------------------------------------------------------------------------------------------------------------");

}

 

void loop()

{

  bool newdata = false;

  unsigned long start = millis();

 

  // Every second we print an update

  while (millis() - start < 1000)

  {

    if (feedgps())

      newdata = true;

  }

 

  gpsdump(gps);

}

 

static void gpsdump(TinyGPS &gps)

{

  float flat, flon;

  unsigned long age, date, time, chars = 0;

  unsigned short sentences = 0, failed = 0;

  static const float LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

 

  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);

  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);

  gps.f_get_position(&flat, &flon, &age);

  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5);

  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5);

  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);

 

  print_date(gps);

 

  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2);

  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);

  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);

  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);

  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);

  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 51.508131, -0.128002), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);

  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

 

  gps.stats(&chars, &sentences, &failed);

  print_int(chars, 0xFFFFFFFF, 6);

  print_int(sentences, 0xFFFFFFFF, 10);

  print_int(failed, 0xFFFFFFFF, 9);

  Serial.println();

}

 

static void print_int(unsigned long val, unsigned long invalid, int len)

{

  char sz[32];

  if (val == invalid)

    strcpy(sz, "*******");

  else

    sprintf(sz, "%ld", val);

  sz[len] = 0;

  for (int i=strlen(sz); i

    sz[i] = ' ';

  if (len > 0)

    sz[len-1] = ' ';

  Serial.print(sz);

  feedgps();

}

 

static void print_float(float val, float invalid, int len, int prec)

{

  char sz[32];

  if (val == invalid)

  {

    strcpy(sz, "*******");

    sz[len] = 0;

        if (len > 0)

          sz[len-1] = ' ';

    for (int i=7; i

        sz[i] = ' ';

    Serial.print(sz);

  }

  else

  {

    Serial.print(val, prec);

    int vi = abs((int)val);

    int flen = prec + (val < 0.0 ? 2 : 1);

    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;

    for (int i=flen; i

      Serial.print(" ");

  }

  feedgps();

}

 

static void print_date(TinyGPS &gps)

{

  int year;

  byte month, day, hour, minute, second, hundredths;

  unsigned long age;

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);

  if (age == TinyGPS::GPS_INVALID_AGE)

    Serial.print("*******    *******    ");

  else

  {

    char sz[32];

    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d   ",

        month, day, year, hour, minute, second);

    Serial.print(sz);

  }

  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);

  feedgps();

}

 

static void print_str(const char *str, int len)

{

  int slen = strlen(str);

  for (int i=0; i

    Serial.print(i

  feedgps();

}

 

static bool feedgps()

{

  while (nss.available())

  {

    if (gps.encode(nss.read()))

      return true;

  }

  return false;

}

 

추가한 라이브러리의 헤더 파일을 포함시키고,

 

#include

 

GPS 라이브러리에 대한 변수를 지정한다.

 

           TinyGPS gps;

 

원 소스의 GPS 모듈과의 전송 속도는

 

           nss.begin(4800); -> nss.begin(9600);

 

로 되어 있지만, 여기서는 9600bps로 수정한다.

 

loop() 함수 이하의 소스는 GPS 데이터를 덤프(dump)하는 코드로 별도의 설명 없이 넘어가기로 한다.

 

컴파일 후에 업로드 한 후, 시리얼 터미널을 실행 시키면, 아래와 같은 데이터가 출력되는 것을 확인 할 수 있다.

 

 

첫 번째 예제에서 출력된 암호와 같은 코드를 디코딩 한 결과가 위와 같이 나오며, 위도, 경도, 시간 등의 데이터를 추출 할 수가 있다. 만일, 위의 데이터가 출력이 되지 않고, 아래와 같이 출력이 된다고 하면,

 

 

안테나의 연결 상태와 GPS 쉴드 보드의 시리얼 포트의 선택이 문제 없는지 확인 해 본다. 안테나는 가능한 외부에 위치하는 것이 좋으며, 본인은 책상이 창가 근처여서 책상 위에 놓고도 정상 수신이 되었다.

 

 

GPS 데이터를 어떤 목적으로 사용될지는 모르지만, gpsdump() 함수의 내용을 천천히 보면서 필요한 데이터를 추출할 수 있다. 외부에서 이동하는 물체에 장착하여 현재 위치와 움직이는 속도도 알 수 있고, 현재의 시간을 알 수도 있다. 물론, 시간은 표준 시간대의 시간이 출력이 되기 때문에 한국의 경우는 +9시간을 하면 된다.

 

이번 강좌에서는 GPS 쉴드의 사용법에 대해서 간단히 알아 보았다. 앞으로도 예제는 가능한 자세한 설명은 하지 않도록 할 예정이다. 응용 강좌의 목적은 다양한 쉴드 보드를 사용하는데 있다. 코드의 자세한 설명은 사용자의 몫으로 하고, 쉴드 보드를 사용하는데 있어서 쉽게 접근을 할 수 있도록 도움이 되고자 한다.

 

다음 강좌에서는 GPS 쉴드를 이용하여 GPS 시계를 한번 만들어 보기로 한다. 문자형 LCD를 사용하여, 날짜와 시간이 출력되는 시계를 간단히 구성하여 코딩해 보도록 한다.

 

첨부파일 : circuit.pdf – 회로도

          DataSheet.pdf – 쉴드 보드 설명서

          TinyGPS.zip – 라이브러리 & 예제

 

비밀번호 확인 닫기
name password
  Content name date hits
[아두이노 응용] 3. GPS 쉴드 - 1  
2014/07/18 7089
상호명 : R&C사 사업자등록번호 : 106-02-43112 통신판매업신고번호 : 용산 03564
대표 : 곽민수 사업장소재지 : 서울시 용산구 갈월동 17-1번지 세기빌딩 101호
전화 : ☎ : 02-776-4868 ,F: 02-779-6757 개인정보담당자 : 곽민수
[회사소개] [이용안내] [이용약관] [개인정보취급방침]
Copyright ⓒ 도서출판 OHM사와 학습기기 R&C사 All Rights Reserved.