본 절은 [GPS 쉴드] 를 사용하기 위해 알아야 할 내용과 실습 방법에 대해 설명한다. GPS의 특징, 동작원리, 사양, 연결 핀 배열, 출력 값, 주의사항을 알아본다. 아두이노와 GPS쉴드를 연결하고, 간단한 코딩으로 센서를 쉽게 실습할 수 있다.
목차
아두이노 3.0 / 5.0VDC NEO-6M GPS쉴드 NEO-6M-GPS-SHIELD
NEO-6M GPS 확장 쉴드란?
본 제품은 ublox사의 NEO-6M GPS 모듈을 탑재한 GPS 쉴드이다. GPS핀은 RX, Tx 핀을 통해 아두이노와 통신한다. microSD 카드 인터페이스를 지원하여 데이터 로깅 어플리케이션에 사용이 가능하다.
GPS 확장 SPI 통신 쉴드는 아두이노와 시리얼 통신을 통해 비교적 간단하게 GPS를 확인할 수 있는 쉴드이디. GPS 쉴드는 아두이노 우노/메가 보드등과 연동되어 사용할 수 있다.
쉴드에서 GPS 통신핀 (rx, tx)은 아두이노 D0 ~ D7핀과 연결되어 있다.
Arduino 또는 Arduino 호환 보드가 있는 다음 애플리케이션에 적합하다.
- 자동차 내비게이션
- 개인 포지셔닝
- 함대 관리
- 해양 항해
기능 및 사양:
- UBlox Neo 6M GPS 모듈
- 마이크로 SD 인터페이스 포함
- 수신 감도가 높은 능동형 안테나 설계, 호환 가능한 일반 안테나
- 낮은 신호 레벨에서 처음 수정하는 데 매우 빠른 시간
- UART 인터페이스
- 작동 온도: -40 ~ +85
- 실드 기능 : 스토리지, 무선
- 보드 크기 : 56mm x 54mm
- 동작 레벨 : 디지털 3.3V/5v
- 무게 : 25.00g
GPS 쉴드 특징
GPS 쉴드 센서의 특징은 다음과 같다.
- Arduino GPS 쉴드 GPS 레코드 확장 보드 GPS 모듈 (SD 카드 슬롯 포함)
- 확장 보드는 Arduino UNO 및 기타 GPS 기록 확장 보드를 위해 특별히 설계되었다.
- GPS 안테나 인터페이스의 두 종류를 제공한다.
- 아날로그 인터페이스 리드의 다수를 가진 IO 항구 핀은, 직접 급속한 prototyping 전자 빌딩 블록을 연결할 수 있다.
- SD 카드로, GPS 정보는 기록된다.
- 한 번에 최대 20개의 위성을 추적하고 약한 신호 환경에서 빠른 TTFF를 수행할 수 있는 SiRF Star III 칩셋을 사용한다.
GPS 쉴드 센서 동작 원리
GPS는 Global Positioning System의 약어로 지구 궤도를 돌고 있는 위성으로부터 나온 데이터의 분석을 통해 현재 위치의 위도와 경도, 시간, 속도 등을 알 수 있다.
GPS 쉴드 구입하기
[GPS 쉴드 센서]는 알리익스프레스, 네이버 쇼핑몰, 아마존 등에서 센서를 구입할 수 있다
GPS 쉴드 센서 하드웨어 연결
다음과 같이 GPS 쉴드 아두이노 센서를 연결할 수 있다.
Shield 버전의 다이어그램은 미니 점퍼로 제어되는 핀이 Arduino D1 ~ D7의 물리적 핀에 연결된 연결을 볼 수 있다. 선택된 2개의 핀은 직렬 통신을 담당하므로 다른 용도로 사용해서는 안된다.
쉴드에서 선택한 TX 핀은 Arduino의 RX에 연결해야 한다는 점을 항상 기억해야 한다. 프로그래밍할 때 이 점에 주의해야 한다.
GPS 신호를 받기 위해 사용되는 통신핀(TX/RX)을 예젱코드에 해당하는 핀번호에 맞춰 연결한다.
안테나를 IPX 어댑터에 연결하고 커넥터를 차폐에 연결합니다.
GPS 쉴드 센서 소프트웨어 코딩
하드웨어 연결이 완료되면, 아두이노 IDE를 이용해 아두이노 센서 소스코드를 코딩할 수 있다.
TinyGPS 라이브러리를 설치한다.
https://github.com/mikalhart/TinyGPSPlus
GitHub - mikalhart/TinyGPSPlus: A new, customizable Arduino NMEA parsing library
A new, customizable Arduino NMEA parsing library. Contribute to mikalhart/TinyGPSPlus development by creating an account on GitHub.
github.com
예제 파일을 실행한다.
센서 코드는 다음과 같다.
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
/*
This sample code demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
It requires the use of SoftwareSerial, and assumes that you have a
4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
void setup()
{
Serial.begin(115200);
ss.begin(GPSBaud);
Serial.println(F("FullExample.ino"));
Serial.println(F("An extensive example of many interesting TinyGPS++ features"));
Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
Serial.println(F("Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum"));
Serial.println(F(" (deg) (deg) Age Age (m) --- from GPS ---- ---- to London ---- RX RX Fail"));
Serial.println(F("----------------------------------------------------------------------------------------------------------------------------------------"));
}
void loop()
{
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
printFloat(gps.hdop.hdop(), gps.hdop.isValid(), 6, 1);
printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
printInt(gps.location.age(), gps.location.isValid(), 5);
printDateTime(gps.date, gps.time);
printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.deg()) : "*** ", 6);
unsigned long distanceKmToLondon =
(unsigned long)TinyGPSPlus::distanceBetween(
gps.location.lat(),
gps.location.lng(),
LONDON_LAT,
LONDON_LON) / 1000;
printInt(distanceKmToLondon, gps.location.isValid(), 9);
double courseToLondon =
TinyGPSPlus::courseTo(
gps.location.lat(),
gps.location.lng(),
LONDON_LAT,
LONDON_LON);
printFloat(courseToLondon, gps.location.isValid(), 7, 2);
const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);
printStr(gps.location.isValid() ? cardinalToLondon : "*** ", 6);
printInt(gps.charsProcessed(), true, 6);
printInt(gps.sentencesWithFix(), true, 10);
printInt(gps.failedChecksum(), true, 9);
Serial.println();
smartDelay(1000);
if (millis() > 5000 && gps.charsProcessed() < 10)
Serial.println(F("No GPS data received: check wiring"));
}
// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
static void printFloat(float val, bool valid, int len, int prec)
{
if (!valid)
{
while (len-- > 1)
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
Serial.print(' ');
}
smartDelay(0);
}
static void printInt(unsigned long val, bool valid, int len)
{
char sz[32] = "*****************";
if (valid)
sprintf(sz, "%ld", val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz[i] = ' ';
if (len > 0)
sz[len-1] = ' ';
Serial.print(sz);
smartDelay(0);
}
static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
if (!d.isValid())
{
Serial.print(F("********** "));
}
else
{
char sz[32];
sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
Serial.print(sz);
}
if (!t.isValid())
{
Serial.print(F("******** "));
}
else
{
char sz[32];
sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
Serial.print(sz);
}
printInt(d.age(), d.isValid(), 5);
smartDelay(0);
}
static void printStr(const char *str, int len)
{
int slen = strlen(str);
for (int i=0; i<len; ++i)
Serial.print(i<slen ? str[i] : ' ');
smartDelay(0);
}
GPS 모듈과의 전송 속도를 4800bps에서 9600bps로 수정한다.
GPS 쉴드 센서 동작확인
하드웨어 연결, 소프트웨어 코딩이 완료되면 다음과 같이 동작 화면을 확인할 수 있다.
------------------------------------------------------
개발환경 : WINDOWS 10
아두이노 IDE : 1.8.13
------------------------------------------------------
01 연결
- 아두이노와 PC 연결
- 아두이노 IDE 실행
- 메뉴 → 툴 → 보드:아두이노 UNO 확인
- 메뉴 → 스케치 → 확인/컴파일
02 컴파일 확인
스케치>확인/컴파일(CTRL+R) 를 선택해서 컴파일을 진행한다.
03 아두이노 우노 업로드
컴파일이 이상없이 완료되면 스케치>업로드(CTRL+U) 를 선택해서 컴파일 파일을 업로드 한다.
04 동작 확인
다음과 같이 동작을 확인할 수 있다.
마무리
아두이노와 GPS 쉴드 센서를 연결하고, 간단한 코딩으로 센서를 쉽게 실습할 수 있다.
https://www.u-blox.com/en/product/u-center
u-center
GNSS evaluation software for Windows
www.u-blox.com
마무리
아두이노와 GPS 쉴드 센서를 연결하고, 간단한 코딩으로 센서를 쉽게 실습할 수 있다.
+더알아보기
[센서] 아두이노 NEO-6M GPS 확장 쉴드 SD 카드 사용하기 (MicroSD)
본 절은 [NEO-6M] 아두이노 GPS 확장 쉴드를 사용하기 위해 알아야 할 내용과 실습 방법에 대해 설명한다. 아두이노 센서의 특징, 동작원리, 사양, 연결 핀 배열, 출력 값, 주의사항을 알아본다. 아두
makerspace.steamedu123.com
모두의 아두이노 환경 센서 책
[모두의 아두이노 환경 센서] 책은 예스24, 인터넷 교보문고, 알라딘, 인터파크도서, 영풍문고, 반디앤루니스 , 도서11번가 등에서 구입할 수 있다. 이 책에서는 PMS7003, GP2Y1010AU0F, PPD42NS, SDS011 미세먼지 센서, DHT22 온습도 센서, MH-Z19B 이산화탄소 센서, ZE08-CH2O 포름알데히드 센서, CCS811 총휘발성유기화합물 TVOC, GDK101 방사선(감마선) 센서, MQ-131 오존(O3) 센서, MQ-7 일산화탄소, MICS-4514 이산화질소 센서, MICS-6814 암모니아 센서, DGS-SO2 아황산가스(SO2) 센서, BME280 기압 센서, GUVA-S12SD 자외선(UV) 센서, MD0550 기류 센서, QS-FS01 풍속 센서(Wind speed) 를 사용한다.
모두의 아두이노 환경 센서
아두이노와 센서로 내 건강을 지킬 수 있다!다양한 환경 센서를 실생활 프로젝트에 응용해보자!시중에 판매되고 있는 간이측정기도 센서로 값을 측정합니다. 똑같은 센서를 아두이노에 연결하
book.naver.com
'모두의 아두이노' 카테고리의 다른 글
[아두이노][센서] NEO-6M GPS 확장 쉴드 SD 카드 사용하기 (MicroSD) - ReadWrite 테스트 (0) | 2021.11.16 |
---|---|
[아두이노] 조이스틱 쉴드 (0) | 2021.11.11 |
[아두이노] 레이저 수신 모듈 (PP-A435) (0) | 2021.11.07 |
[아두이노] 네오픽셀 RGB LED 모듈 (0) | 2021.10.19 |
[아두이노] MG90s 서보모터 (0) | 2021.10.15 |
댓글