본문 바로가기

메이커 Maker

Arduino Uno NEO-M8N GPS 모듈 인터페이스

반응형

NEO-M8N GPS 모듈이 포함된 Arduino: 위도, 경도, 고도, 날짜 및 시간 가져오기 

 

이 가이드에서는 Arduino 보드와 NEO-M8N GPS 모듈을 연결하는 방법을 알아봅니다. 모듈을 보드에 연결하는 방법과 위도, 경도, 고도, UTC 시간, 가시 위성 수 등의 GPS 데이터를 수신하도록 프로그래밍하는 방법을 알아봅니다.

 

포스팅한 튜토리얼의 목록입니다. 참고하세요.

ESP32를 사용하여 간단한 GPS 추적기 

NEO-6M GPS 모듈 GY-GPS6MV2 GPS 추적기 프로젝트 

ESP32 NEO-6M GPS 모듈 인터페이스 

ESP32 NEO-6M GPS 모듈 문제 해결 가이드 

NEO-M8N GPS 모듈 

ESP32 NEO-6M GPS Module과 데이터 파싱 

ESP32 SIM800L 및 NEO-6M 모듈을 사용한 GPS 추적기 

SIM800L GSM 모듈과 NEO-6M GPS 모듈을 사용한 Arduino Uno 위치 추적기 

ESP32 NEO-M8N GPS 모듈 인터페이스 

Arduino Uno NEO-M8N GPS 모듈 인터페이스 

 

 

NEO-M8N GPS 모듈이 포함된 Arduino

 

이 가이드에서는 다음 내용을 배울 수 있습니다.

  • 직렬로 NEO-M8N GPS 모듈을 Arduino에 연결합니다.
  • 원시 GPS 데이터를 얻으세요.
  • TinyGPSPlus 라이브러리를 사용하여 원시 데이터를 파싱하여 선택되고 읽기 쉬운 GPS 정보를 얻습니다.

 

목차

다음 주제를 다루겠습니다.

  • NEO-M8N GPS 모듈 소개
  • NEO-M8N GPS 모듈을 Arduino에 연결
  • 원시 GPS 데이터 가져오기 – Arduino를 사용하여 NEO-M8N GPS 모듈 테스트
  • TinyGPSPlus 라이브러리를 사용한 NMEA 문장 구문 분석

 

NEO-M8N GPS 모듈 소개

 

NEO-M8N GPS 모듈은 내비게이션 및 추적 프로젝트에서 마이크로컨트롤러와 함께 사용되는 가장 널리 사용되는 GPS 수신기 중 하나입니다. 위도, 경도, 고도 및 시간 데이터를 수신할 수 있습니다.

 

GPS, Galileo, GLONASS, BeiDou 등 다양한 위성 시스템을 지원합니다. NEO-6M 보다 향상된 위성 추적 기능을 제공하여 까다로운 환경에서도 더욱 안정적으로 작동합니다.

 

 

NEO-M8N-GPS 모듈

 

데이터시트에 따르면, 수평 위치 정확도는 2.5~4m이고 시작 시간은 빠릅니다(핫 스타트 시 1초, 콜드 스타트 ​​시 26~57초. 건물 근처에 있는 경우 시간이 더 오래 걸릴 수 있음).

 

이 모듈에는 백업 배터리, 내장 EEPROM, 위치 결정이 완료되면 깜박이는 LED 표시등이 포함되어 있습니다.

 

이 모듈에는 일반적으로 세라믹 GPS 안테나가 함께 제공됩니다. 하지만 프로젝트에 더 적합한 다른 호환 안테나로 교체할 수 있습니다. 예를 들어, 저는 아래 사진의 오른쪽 안테나를 사용하는 것을 선호하는데, 방수 기능이 있고 안테나에 긴 케이블이 포함되어 있어 더욱 유연하게 사용할 수 있기 때문입니다.

 

 

GPS 모듈용 안테나

 

NEO-M8N GPS 모듈은 직렬 통신 프로토콜을 사용하여 마이크로컨트롤러와 통신하며, 표준 NMEA 문장으로 작동합니다. NMEA는 National Marine Electronics Association의 약자로, GPS 분야에서는 GPS 제조업체가 지원하는 표준 데이터 형식입니다.

 

어디서 구매하나요?

 

Maker Advisor Tools 페이지에서 다양한 매장의 NEO-M8N GPS 수신기 모듈 가격을 비교해 보세요.

  • NEO-M8N GPS 수신기 모듈

 

NEO-M8N GPS 모듈을 Arduino에 연결

 

NEO-6M GPS 모듈과 통신하기 위해 소프트웨어 시리얼을 사용하므로 사용 가능한 모든 핀을 사용할 수 있습니다. 5번 핀(TX -> 모듈 RX에 연결)과 6번 핀(RX -> 모듈 TX에 연결)을 사용합니다.

 

 

NEO-M8N GPS 모듈을 Arduino에 연결

 

NEO-M8N GPS Module Arduino
VCC 5V
RX Pin 5
TX Pin 6
GND GND

 

 

원시 GPS 데이터 가져오기 – Arduino로 NEO-M8N GPS 모듈 테스트

 

원시 GPS 데이터를 얻으려면 GPS 모듈과 직렬 통신을 시작하고 사용 가능한 데이터를 읽어야 합니다.

 

다음 코드는 GPS 모듈과 직렬 통신을 설정하고 사용 가능한 데이터를 읽습니다.

 

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/arduino-neo-m8n-gps-module/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/

#include <SoftwareSerial.h>

static const int RXPin = 6, TXPin = 5;
static const uint32_t GPSBaud = 9600;

// The serial connection to the GPS module
SoftwareSerial gpsSerial(RXPin, TXPin);

void setup(){
  Serial.begin(9600);
  gpsSerial.begin(GPSBaud);
}

void loop(){
  while (gpsSerial.available() > 0){
    // get the byte data from the GPS
    byte gpsData = gpsSerial.read();
    Serial.write(gpsData);
  }
}

 

 

코드는 어떻게 작동하나요?

 

이제 코드를 코드 블럭에 넣어야 하지만 시간이 없어 그냥 텍스트로 쓰니 이해하시라는 설명도 하기 힘들다. 알아서 하셔!

 

이 스케치는 GPS 모듈과 시리얼 통신을 설정하기 위해 RX 및 TX 시리얼 핀으로 핀 6과 핀 5를 사용한다고 가정합니다. 다른 핀을 사용하는 경우 다음 줄에서 해당 핀 번호를 수정해야 합니다:

 

static const int RXPin = 6, TXPin = 5;

 

또한, 모듈이 9600bps가 아닌 다른 기본 통신 속도를 사용하는 경우 다음 줄의 코드를 수정해야 합니다.

 

static const uint32_t GPSBaud = 9600;

 

그런 다음 인스턴스를 생성합니다.소프트웨어 시리얼이전에 정의된 핀에 대해 호출됨gps시리얼.

 

// The serial connection to the GPS device

SoftwareSerial gpsSerial(RXPin, TXPin);

 

setup() 함수에서 시리얼 모니터를 초기화합니다.

 

Serial.begin(9600);

 

그런 다음 GPS 모듈과 직렬 통신을 초기화합니다.

 

gpsSerial.begin(GPSBaud);

 

loop() 함수 내에서 코드는 GPS 시리얼 포트를 수신 대기하며, 모듈로부터 데이터가 수신되면 시리얼 모니터에 출력됩니다.

 

void loop(){
  while (gpsSerial.available() > 0){
    // get the byte data from the GPS
    byte gpsData = gpsSerial.read();
    Serial.write(gpsData);
  }
}

 

 

코드 테스트

 

코드를 보드에 업로드하세요.

 

Arduino IDE 2 업로드 버튼

 

안테나가 연결되어 있고, 모듈이나 안테나가 창문 밖이나 옆에 놓여 위성에서 데이터를 받을 수 있는지 확인하세요.

 

 

NEO-6M용 액티브 GPS 안테나

 

모듈의 파란색 LED는 위치가 고정되면 깜박이기 시작합니다.

 

직렬 모니터는 GPS 데이터가 포함된 NMEA 문장을 표시합니다(직렬 모니터의 통신 속도를 9600으로 선택해야 합니다).

 

중요: 이 스케치를 처음 실행하는 경우 모듈이 위치를 확인하는 데 몇 분 정도 걸릴 수 있습니다. 파란색 LED가 깜박이기 시작하면 실제 데이터를 수신하기 시작합니다. 건물 내부에 있는 경우 GPS 데이터를 수신할 가능성이 매우 낮습니다. 위성 신호를 수신할 가능성을 높이려면 실외로 나가거나 안테나를 실외에 설치하세요.

 

 

Arduino와 NEO-M8N을 사용하여 원시 GPS 데이터 가져오기

 

GPS 표준 언어인 NMEA로 많은 정보를 얻을 수 있을 겁니다. 직렬 모니터에 표시되는 각 줄은 NMEA 문장입니다.

 

NMEA는 National Marine Electronics Association의 약자로, GPS 분야에서는 GPS 제조업체가 지원하는 표준 데이터 형식입니다.

 

NMEA 문장

 

NMEA 문장은 $ 문자로 시작하고, 각 데이터 필드는 쉼표로 구분됩니다.

 

$GNRMC,115209.00,A,4114.5500,N,00861.4900,W,0.129,,160125,,,D*XX
$GNVTG,,T,,M,0.129,N,0.239,K,D*XX
$GNGGA,115209.00,4114.5500,N,00861.4900,W,2,10,0.93,130.6,M,50.1,M,,0000*XX
$GNGSA,A,3,24,25,28,32,29,,,,,,,,1.65,0.93,1.37*XX
$GNGSA,A,3,78,66,67,77,,86,26,083,20*XX
$GLGSV,3,3,09,87,13,131,*XX
$GNGLL,4114.5500,N,00861.4900,W,115209.00,A,D*XX

 

 

NMEA 문장에는 여러 유형이 있습니다. 메시지 유형은 첫 번째 쉼표 앞의 문자로 표시됩니다.

 

$ 뒤의 GN 은 GPS 위치임을 나타냅니다. $GNGGA는 3D 위치 및 정확도 데이터를 제공하는 기본 GNSS NMEA 메시지입니다.

 

다음 문장에서:

 

$GNGGA , 110827.00, 4114.32485, N, 00831.79799, W, 1, 10, 0.93, 130.6, M, 50.1, M,, *5F

 

M8N의 필드 모양은 다음과 같습니다.

  • $GNGGA: 글로벌 GNSS 위치 데이터.
  • 110827.00: UTC 시간(11:08:27).
  • 4114.32485,N: 위도.
  • 00831.79799,W: 경도.
  • 1: 품질 수정(1 = GPS 수정, 2 = DGPS 등).
  • 10: 추적된 위성 수(NEO-6M에 비해 M8N이 더 높음).
  • 0.93: 정밀도의 수평 희석(낮을수록 좋음).
  • 130.6,M: 해발 고도(미터)
  • 50.1,M: WGS84 타원체 위의 지오이드 높이.
  • *5F: NEO-M8N에 대한 체크섬을 재계산했습니다.

 

다른 NMEA 문장은 추가 정보를 제공합니다.

  • $GNRMC – 필수 GNSS PVT(위치, 속도, 시간) 데이터
  • $GNVTG – 속도 및 트랙 정보
  • $GNGGA – GNSS 수정 정보
  • $GNGSA – GNSS DOP 및 활성 위성
  • $GLGSV – 상세 위성 정보(GLONASS)
  • $GNGLL – 지리적 위도와 경도.

 

NMEA 문장에 대한 자세한 내용을 알고 싶은 경우, 매우 자세한 정보를 제공하는 이 웹사이트를 찾았습니다 .

 

온라인 NME 분석기를 사용하여 문장을 붙여넣어 GPS 데이터를 해석할 수 있습니다.

 

하지만 원하는 GPS 데이터를 얻고 해석하는 가장 쉬운 방법은 코드에서 NMEA 문장을 직접 파싱하는 것입니다. 이를 위해 NMEA 문장에서 데이터를 쉽게 추출하는 메서드를 제공하는 TinyGPSPlus 라이브러리를 사용할 수 있습니다.

 

TinyGPSPlus 라이브러리를 사용한 NMEA 문장 구문 분석

 

 

NEO-M8N GPS 모듈이 포함된 Arduino 가이드

 

TinyGPSPlus 라이브러리를 사용하면 GPS 데이터를 이해하기 쉬운 형식으로 쉽게 얻을 수 있습니다. TinyGPSPlus 라이브러리에 대한 자세한 내용은 여기를 클릭하세요.

 

TinyGPSPlus 라이브러리 설치

 

Arduino IDE에서 스케치 > 라이브러리 포함 > 라이브러리 관리 로 이동 하거나 왼쪽 사이드바에서 라이브러리 관리자 아이콘을 클릭합니다.

 

TinyGPSPlus 를 검색하여 Mikal Hart의 라이브러리를 설치하세요.

 

 

TinyGPSPlus 라이브러리 Arduino IDE 설치

 

NEO-6M GPS 모듈과 TinyGPSPlus 라이브러리를 사용하여 GPS 데이터 가져오기

 

다음 코드는 다음을 사용하여 GPS 데이터를 가져오는 방법을 보여줍니다.타이니GPS플러스라이브러리. 날짜, 시간, 속도, 고도, 가시 위성 수, 그리고 HDOP(신호 정확도 측정 기준)를 얻을 수 있습니다.

 

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/arduino-neo-m8n-gps-module/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = 6, TXPin = 5;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial gpsSerial(RXPin, TXPin);

void setup() {
  // Serial Monitor
  Serial.begin(9600);
  
  // Start Serial for the GPS module
  gpsSerial.begin(GPSBaud);
  Serial.println("Software Serial started at 9600 baud rate");
}

void loop() {
  // This sketch displays information every time a new sentence is correctly encoded.
  unsigned long start = millis();

  while (millis() - start < 2000) {
    while (gpsSerial.available() > 0) {
      gps.encode(gpsSerial.read());
    }
    if (gps.location.isUpdated()) {
      Serial.print("LAT: ");
      Serial.println(gps.location.lat(), 6);
      Serial.print("LONG: "); 
      Serial.println(gps.location.lng(), 6);
      Serial.print("SPEED (km/h) = "); 
      Serial.println(gps.speed.kmph()); 
      Serial.print("ALT (min)= "); 
      Serial.println(gps.altitude.meters());
      Serial.print("HDOP = "); 
      Serial.println(gps.hdop.value() / 100.0); 
      Serial.print("Satellites = "); 
      Serial.println(gps.satellites.value()); 
      Serial.print("Time in UTC: ");
      Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
      Serial.println("");
    }
  }
}

 

 

코드는 어떻게 작동하나요?

 

먼저 TinyGPSPlus 라이브러리를 임포트합니다.

 

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

 

 

그런 다음 RX와 TX로 사용할 핀과 GPS 전송 속도를 정의합니다.

 

static const int RXPin = 6, TXPin = 5;

static const uint32_t GPSBaud = 9600;

 

그런 다음 TinyGPSPlus 객체를 생성합니다:

 

TinyGPSPlus gps;

 

인스턴스를 생성합니다소프트웨어 시리얼이전에 정의한 핀에 대해서.

 

SoftwareSerial gpsSerial(RXPin, TXPin);

 

setup() 함수에서 시리얼 모니터와 GPS 모듈과의 시리얼 통신을 초기화합니다.

 

void setup() {
  // Serial Monitor
  Serial.begin(9600);
  
  // Start Serial for the GPS module
  gpsSerial.begin(GPSBaud);
  Serial.println("Software Serial started at 9600 baud rate");
}

 

 

루프() 함수 내에서 정보를 요청합니다. GPS 모듈의 데이터를 encode() 메서드를 사용하여 다음과 같이 TinyGPSPlus 객체로 파싱합니다.

 

while (gpsSerial.available() > 0) {
  gps.encode(gpsSerial.read());
}

 

 

그런 다음 다음을 쿼리할 수 있습니다.GPS데이터 필드가 업데이트되었는지 확인하려면 객체를 사용하세요.

 

if (gps.location.isUpdated()) {

 

새로운 데이터가 있는 경우 다음과 같이 얻을 수 있습니다.

 

Latitude gps.location.lat()
Longitude gps.location.lng()
Speed (km/h) gps.speed.kmph()
Altitude (meters) gps.altitude.meters()
HDOP gps.hdop.value()
The number of visible satellites gps.satellites.value()
Year gps.date.year()
Month gps.date.month()
Day gps.date.day()
Hour gps.time.hour()
Minutes gps.time.minute()
Seconds gps.time.second()

 

위도 gps.위치.위도()

경도 gps.위치.lng()

속도(km/h) gps.속도.kmph()

고도(미터) gps.고도.미터()

HDOP gps.hdop.value()

눈에 보이는 위성의 수 gps.위성.값()

년도 gps.날짜.년()

월 gps.날짜.월()

낮 gps.날짜.요일()

시간 gps.시간.시간()

분 gps.시간.분()

초 gps.시간.초()

 

코드에서는 데이터를 가져와서 모든 정보를 직렬 모니터에 출력합니다.

 

Serial.print("LAT: ");
Serial.println(gps.location.lat(), 6);
Serial.print("LONG: "); 
Serial.println(gps.location.lng(), 6);
Serial.print("SPEED (km/h) = "); 
Serial.println(gps.speed.kmph()); 
Serial.print("ALT (min)= "); 
Serial.println(gps.altitude.meters());
Serial.print("HDOP = "); 
Serial.println(gps.hdop.value() / 100.0); 
Serial.print("Satellites = "); 
Serial.println(gps.satellites.value()); 
Serial.print("Time in UTC: ");
Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
Serial.println("");

 

 

코드 테스트

 

아두이노 보드에 코드를 업로드하세요. 시리얼 모니터를 9600 통신 속도로 실행하세요. 위성에서 데이터를 수신하려면 GPS 모듈이 창문 밖이나 창문 옆에 있어야 합니다.

 

참고: 모듈이 위치를 확정할 때까지 몇 초 또는 몇 분 정도 기다려야 할 수도 있습니다.

 

 

Arduino와 NEO-M8N을 사용하여 TinyGPSPlus로 파싱된 데이터 가져오기

 

현재 위치, 속도, 고도, 가시 위성 수(HDOP) 및 시간에 대한 데이터가 직렬 모니터에 표시됩니다.

 

HDOP는 수평 정밀도 희석(Horizontal Dilution of Precision)의 약자입니다. 이는 위치 결정 정확도를 측정하는 기준입니다. HDOP 값이 높을수록 위치 결정 정확도가 떨어집니다. 이상적으로는 2보다 낮은 값을 얻어야 합니다. 값이 낮을수록 정확도가 높아집니다.

 

마무리하기

 

이 가이드에서는 아두이노와 함께 NEO-M8N GPS 모듈을 사용하는 방법을 알아보았습니다. NEO-6M 과 매우 유사 하지만 GPS뿐만 아니라 여러 위성 시스템을 지원합니다. 위치와 시간 정보를 얻는 방법도 다루었습니다.

 

 

Arduino 센서와 모듈에 대한 유용한 가이드가 더 있습니다.

 

여기까지 고생 많으셨습니다. 즐거운 개발하세요. 마찬가지로 위 튜토리얼의 출처로 직접 가시려면 다음 링크를 따라가세요.

 

시간 내어 읽어 주셔서 감사합니다.

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩