아두이노 메가와 NEO-6M GPS 모듈 연결하기: 단계별 가이드
부품 및 소모품
| 부품 |
수량 |
| 아두이노 메가 2560 |
1 |
| u-blox NEO-6M GPS 모듈 |
1 |
앱 및 온라인 서비스
프로젝트 소개
아두이노 메가와 NEO-6M GPS 모듈 인터페이싱 튜토리얼이 없어 직접 만들게 되었습니다. 도움이 되길 바랍니다!
필요한 부품
하드웨어
- 아두이노 메가 ≈ $30
- NEO-6M GPS 모듈 ≈ $30
소프트웨어
총 비용: 약 $60
GPS 정보
GPS란?
글로벌 포지셔닝 시스템(GPS)은 최소 24개 위성으로 구성된 위성 기반 항법 시스템입니다. 날씨에 상관없이 전 세계 어디서든 24시간 작동하며, 구독료나 설정 비용이 없습니다.
GPS 작동 원리
GPS 위성은 하루에 두 번 정밀한 궤도로 지구를 돕니다. 각 위성은 고유 신호와 궤도 매개변수를 전송하며, GPS 수신기는 이 정보를 삼각측량해 사용자의 정확한 위치를 계산합니다. 본질적으로 수신기는 신호 도달 시간으로 각 위성까지의 거리를 측정하고, 여러 위성 데이터로 3D 위치(위도, 경도, 고도)를 결정합니다.
2D 위치(위도, 경도)만 구하려면 최소 3개 위성, 3D 위치는 4개 이상 위성이 필요합니다. 일반적으로 8개 이상 위성을 추적하지만 시간과 위치에 따라 다릅니다. 위치가 결정되면 속도, 방위, 궤적, 이동 거리, 목적지까지 거리 등도 계산 가능합니다.
GPS 신호
GPS 위성은 최소 2개의 저전력 무선 신호를 전송합니다. 신호는 직진하므로 구름, 유리, 플라스틱은 통과하지만 건물이나 산 같은 고체 물체는 차단합니다(최신 수신기는 건물 내부에서도 수신 가능). GPS 신호에는 3가지 정보가 포함됩니다:
- 의사난수 코드: 위성 식별 ID
- 에페메리스 데이터: 위성 위치, 건강 상태, 현재 날짜/시간
- 알마낙 데이터: 모든 위성의 궤도 정보와 하루 중 언제 어디에 있어야 하는지
NEO-6M GPS 모듈
외장 안테나 포함, 헤더 핀은 미포함이라 납땜 필요합니다.
NEO-6M GPS 모듈 상세
NEO-6M GPS 칩
u-blox NEO-6M 칩이 핵심입니다. 50채널로 최대 22개 위성 추적, 업계 최고 감도 -161 dB, 전류 소모 45mA. TTFF(Time-To-First-Fix) 1초 미만. 전력 절약 모드(PSM)로 11mA까지 낮출 수 있어 웨어러블 등에 적합. 0.1" 피치 헤더로 UART 통신 핀 등이 나와 있습니다.
참고: 보드레이트 4800~230400bps 지원, 기본값 9600bps.
위치 고정 LED 표시
- 깜빡임 없음: 위성 탐색 중
- 1초마다 깜빡임: 위치 고정 완료
3.3V LDO 레귤레이터
NEO-6M 칩 동작 전압은 2.7~3.6V지만, 모듈에 MIC5205 3.3V 레귤레이터가 내장되어 있습니다. 로직 핀은 5V 톨러런트라 아두이노 등 5V 마이컴과 레벨 컨버터 없이 직접 연결 가능합니다.
배터리 & EEPROM
HK24C32 4KB I2C EEPROM과 충전식 버튼 배터리(슈퍼커패시터 역할)가 탑재되어 있습니다. EEPROM과 배터리는 배터리 백업 RAM(BBR)을 유지하며, 여기에는 클럭 데이터, 최신 위치 데이터, 모듈 설정이 저장됩니다. 영구 저장용은 아닙니다. 배터리 덕분에 콜드 스타트 없이 1초 만에 빠른 위치 고정 가능. 배터리는 전원 인가 시 자동 충전되며, 무전원 상태에서 최대 2주간 데이터 유지.
핀아웃
- GND: 아두이노 GND에 연결
- TxD: 시리얼 통신 송신
- RxD: 시리얼 통신 수신
- VCC: 아두이노 5V 핀에 직접 연결 가능
아두이노 메가
아두이노는 사용하기 쉬운 하드웨어/소프트웨어 기반 오픈소스 전자 플랫폼입니다. 센서 입력(빛, 버튼, 트위터 메시지 등)을 읽고 출력(모터, LED, 온라인 게시 등)으로 변환합니다. 아두이노 프로그래밍 언어(와이어링 기반)와 IDE(프로세싱 기반)로 보드를 제어합니다.
아두이노 메가 2560은 ATmega2560 기반 마이크로컨트롤러 보드입니다.
- 54개 디지털 I/O 핀(중 15개 PWM), 16개 아날로그 핀
- 16MHz 크리스탈 오실레이터
- USB 포트, DC 파워 잭
- 5V/3.3V 듀얼 전압 레귤레이터
- 리셋 버튼, 4개 하드웨어 시리얼 포트(USART)
- USB, Vin, 파워 잭, 배터리 3가지 전원 공급 방식
핀 설명
- 5V & 3.3V: 레귤레이트된 출력 전압. 최대 50mA(3.3V)
- GND: 5개 그라운드 핀
- Reset: LOW로 리셋
- Vin: 7~20V 입력 전압
- 시리얼 통신: 4개 포트(Serial0: 0/1, Serial1: 18/19, Serial2: 16/17, Serial3: 14/15)
- 외부 인터럽트: 6개 핀(0,3,21,20,19,18)
- 내장 LED: 디지털 13번 핀
- AREF: 아날로그 기준 전압
- 아날로그 핀: A0~A15, 10비트 분해능, 디지털 I/O 겸용
- I2C: 20(SDA), 21(SCL)
- SPI: 50(MISO), 51(MOSI), 52(SCK), 53(SS)
아두이노 IDE 설정
- TinyGPS 라이브러리 다운로드
- 압축 해제 후
Documents\Arduino\libraries 폴더에 이동(폴더명에 하이픈 없도록 주의)
- 아두이노 IDE에서 코드 복사
- Tools → Board → Arduino Mega 2560 선택
- Tools → Port 선택
- 업로드 클릭
연결 방법
아두이노 메가 → NEO-6M GPS
- 3.3V → VCC
- GND → GND
- Tx1 (핀 18) → Rx
- Rx1 (핀 19) → Tx
Serial2(핀 16/17) 또는 Serial3(핀 14/15)도 사용 가능합니다.
결과
시리얼 모니터에 위도/경도가 6자리 소수점까지 출력됩니다.
코드
Arduinomega_GPS (아두이노)
// Serial1(핀 18, 19) 사용 예제
#include <TinyGPS.h>
float lat, lon;
TinyGPS gps;
void setup() {
Serial.begin(57600);
Serial.println("The GPS Received Signal:");
Serial1.begin(9600);
}
void loop() {
while (Serial1.available()) {
if (gps.encode(Serial1.read())) {
gps.f_get_position(&lat, &lon);
Serial.print("Position: ");
Serial.print("Latitude: ");
Serial.print(lat, 6);
Serial.print(",");
Serial.print("Longitude: ");
Serial.println(lon, 6);
}
}
}
/*
// Serial2(핀 16, 17) 사용 시
#include <TinyGPS.h>
float lat, lon;
TinyGPS gps;
void setup() {
Serial.begin(57600);
Serial.println("The GPS Received Signal:");
Serial2.begin(9600);
}
void loop() {
while (Serial2.available()) {
if (gps.encode(Serial2.read())) {
gps.f_get_position(&lat, &lon);
Serial.print("Position: ");
Serial.print("Latitude: ");
Serial.print(lat, 6);
Serial.print(",");
Serial.print("Longitude: ");
Serial.println(lon, 6);
}
}
}
*/
/*
// Serial3(핀 14, 15) 사용 시
#include <TinyGPS.h>
float lat, lon;
TinyGPS gps;
void setup() {
Serial.begin(57600);
Serial.println("The GPS Received Signal:");
Serial3.begin(9600);
}
void loop() {
while (Serial3.available()) {
if (gps.encode(Serial3.read())) {
gps.f_get_position(&lat, &lon);
Serial.print("Position: ");
Serial.print("Latitude: ");
Serial.print(lat, 6);
Serial.print(",");
Serial.print("Longitude: ");
Serial.println(lon, 6);
}
}
}
*/