Руководство по GPS-модулю NEO-6M с Arduino

В этом руководстве показано, как использовать GPS-модуль NEO-6M с Arduino для получения GPS-данных. GPS расшифровывается как Global Positioning System (Глобальная система позиционирования) и может использоваться для определения местоположения, времени и скорости, если вы находитесь в движении.

Руководство по GPS-модулю NEO-6M с Arduino

Вы узнаете, как:

  • Подключить GPS-модуль NEO-6M к Arduino UNO

  • Получить необработанные GPS-данные

  • Разобрать необработанные данные для получения выбранной и читаемой GPS-информации

  • Получить местоположение

Знакомство с GPS-модулем NEO-6M

GPS-модуль NEO-6M показан на рисунке ниже. Он поставляется с внешней антенной и не имеет распаянных штыревых контактов. Поэтому вам нужно будет приобрести и припаять их.

GPS-модуль NEO-6M с внешней антенной
  • Этот модуль имеет внешнюю антенну и встроенную EEPROM.

  • Интерфейс: RS232 TTL

  • Питание: от 3В до 5В

  • Скорость передачи по умолчанию: 9600 бод

  • Работает со стандартными NMEA-предложениями

GPS-модуль NEO-6M также совместим с другими микроконтроллерными платами. Чтобы узнать, как использовать GPS-модуль NEO-6M с Raspberry Pi, вы можете прочитать: Email Alert System on Location Change with Raspberry Pi and GPS Module.

Где купить?

Вы можете приобрести GPS-модуль NEO-6M по цене от $5 до $20. Мы рекомендуем посетить страницу GPS-модуля NEO-6M на Maker Advisor, чтобы сравнить цены в разных магазинах и найти лучшую.

Распиновка и подключение

GPS-модуль NEO-6M имеет четыре контакта: VCC, RX, TX и GND. Модуль обменивается данными с Arduino через последовательное соединение, используя контакты TX и RX, поэтому подключение максимально простое:

GPS-модуль NEO-6M

Подключение к Arduino UNO

VCC

5V

RX

TX-пин, определённый в SoftwareSerial

TX

RX-пин, определённый в SoftwareSerial

GND

GND

Получение необработанных GPS-данных

Для получения необработанных GPS-данных вам просто нужно установить последовательную связь с GPS-модулем с помощью Software Serial. Продолжайте читать, чтобы узнать, как это сделать.

Необходимые компоненты

Для тестирования этого примера вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения

Подключите GPS-модуль NEO-6M к вашему Arduino, следуя схеме ниже.

Схема подключения GPS-модуля NEO-6M к Arduino
  • Контакт GND модуля подключён к контакту GND Arduino

  • Контакт RX модуля подключён к контакту 3 Arduino

  • Контакт TX модуля подключён к контакту 4 Arduino

  • Контакт VCC модуля подключён к контакту 5V Arduino

Код

Скопируйте следующий код в Arduino IDE и загрузите его на вашу плату Arduino.

/*
 * Rui Santos
 * Complete Project Details https://randomnerdtutorials.com
 */

#include <SoftwareSerial.h>

// The serial connection to the GPS module
SoftwareSerial ss(4, 3);

void setup(){
  Serial.begin(9600);
  ss.begin(9600);
}

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

Посмотреть исходный код

Этот скетч предполагает, что вы используете пины 4 и 3 в качестве последовательных пинов RX и TX для установления связи с GPS-модулем. Если вы используете другие пины, вам следует изменить это в следующей строке:

SoftwareSerial ss(4, 3);

Также, если ваш модуль использует скорость передачи по умолчанию, отличную от 9600 бод, вам следует изменить код в следующей строке:

ss.begin(9600);

Этот скетч слушает последовательный порт GPS, и когда данные получены от модуля, они отправляются в монитор последовательного порта.

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

Откройте монитор последовательного порта на скорости 9600 бод.

Необработанные GPS-данные в мониторе последовательного порта Arduino

Вы должны получить множество информации на стандартном языке GPS — NMEA. Каждая строка, которую вы видите в мониторе последовательного порта, является NMEA-предложением.

NMEA расшифровывается как National Marine Electronics Association (Национальная ассоциация морской электроники), и в мире GPS это стандартный формат данных, поддерживаемый производителями GPS.

Понимание NMEA-предложений

NMEA-предложения начинаются с символа $, и каждое поле данных разделяется запятой.

$GPGGA,110617.00,41XX.XXXXX,N,00831.54761,W,1,05,2.68,129.0,M,50.1,M,,*42
$GPGSA,A,3,06,09,30,07,23,,,,,,,,4.43,2.68,3.53*02
$GPGSV,3,1,11,02,48,298,24,03,05,101,24,05,17,292,20,06,71,227,30*7C
$GPGSV,3,2,11,07,47,138,33,09,64,044,28,17,01,199,,19,13,214,*7C
$GPGSV,3,3,11,23,29,054,29,29,01,335,,30,29,167,33*4E
$GPGLL,41XX.XXXXX,N,00831.54761,W,110617.00,A,A*70
$GPRMC,110618.00,A,41XX.XXXXX,N,00831.54753,W,0.078,,030118,,,A*6A
$GPVTG,,T,,M,0.043,N,0.080,K,A*2C

Существуют различные типы NMEA-предложений. Тип сообщения обозначается символами перед первой запятой.

GP после $ означает, что это GPS-позиция. $GPGGA — это базовое NMEA-сообщение GPS, которое предоставляет данные о 3D-местоположении и точности. В следующем предложении:

$GPGGA,110617.00,41XX.XXXXX,N,00831.54761,W,1,05,2.68,129.0,M,50.1,M,,*42
  • 110617 — время фиксации местоположения, 11:06:17 UTC

  • 41XX.XXXXX,N — широта 41 градус XX.XXXXX“ N

  • 00831.54761,W — долгота 008 градусов 31.54761“ W

  • 1 — качество фиксации (0 = недействительно; 1 = GPS-фиксация; 2 = DGPS-фиксация; 3 = PPS-фиксация; 4 = кинематика реального времени; 5 = Float RTK; 6 = оценка (экстраполяция); 7 = ручной режим ввода; 8 = режим симуляции)

  • 05 — количество отслеживаемых спутников

  • 2.68 — горизонтальное снижение точности

  • 129.0, M — высота в метрах над уровнем моря

  • 50.1, M — высота геоида (средний уровень моря) над эллипсоидом WGS84

  • пустое поле — время в секундах с момента последнего обновления DGPS

  • пустое поле — идентификатор станции DGPS

  • *42 — контрольная сумма, всегда начинается с *

Остальные NMEA-предложения предоставляют дополнительную информацию:

  • $GPGSA — DOP и активные спутники GPS

  • $GPGSV — подробная информация о спутниках GPS

  • $GPGLL — географическая широта и долгота

  • $GPRMC — основные данные GPS pvt (положение, скорость, время)

  • $GPVTG — скорость относительно земли

Чтобы узнать, что означает каждое поле данных в каждом из этих предложений, вы можете обратиться к данным NMEA здесь.

Разбор NMEA-предложений с помощью библиотеки TinyGPS++

Вы можете работать с необработанными данными GPS или преобразовать NMEA-сообщения в читаемый и удобный формат, сохраняя последовательности символов в переменные. Для этого мы будем использовать библиотеку TinyGPS++.

Эта библиотека упрощает получение информации о местоположении в удобном и понятном формате.

Установка библиотеки TinyGPS++

В Arduino IDE перейдите в Sketch > Include Library > Manage Libraries или нажмите на иконку Library Manager на левой боковой панели.

Найдите TinyGPSPlus и установите библиотеку от Mikal Hart.

Установка библиотеки TinyGPSPlus в Arduino IDE

Библиотека предоставляет несколько примеров использования. В Arduino IDE вам просто нужно перейти в File > Examples > TinyGPS++ и выбрать один из предоставленных примеров.

Примечание: примеры, предоставленные в библиотеке, предполагают скорость передачи 4800 бод для GPS-модуля. Вам нужно изменить её на 9600, если вы используете GPS-модуль NEO-6M.

Получение местоположения с помощью GPS-модуля NEO-6M и библиотеки TinyGPS++

Вы можете получить местоположение в удобном и полезном формате, используя библиотеку TinyGPS++. Ниже мы приводим код для получения местоположения от GPS. Это упрощённая версия одного из примеров библиотеки.

/*
 * Rui Santos
 * Complete Project Details https://randomnerdtutorials.com
 */

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

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(9600);
  ss.begin(GPSBaud);
}

void loop(){
  // This sketch displays information every time a new sentence is correctly encoded.
  while (ss.available() > 0){
    gps.encode(ss.read());
    if (gps.location.isUpdated()){
      Serial.print("Latitude= ");
      Serial.print(gps.location.lat(), 6);
      Serial.print(" Longitude= ");
      Serial.println(gps.location.lng(), 6);
    }
  }
}

Посмотреть исходный код

Вы начинаете с импорта необходимых библиотек: TinyGPSPlus и SoftwareSerial

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

Затем вы определяете пины RX и TX для программного последовательного порта, а также скорость передачи GPS. Если вы используете другие пины для SoftwareSerial, вам нужно изменить это здесь. Также, если ваш GPS-модуль использует другую скорость передачи по умолчанию, вам следует изменить и её.

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

Затем вы создаёте объект TinyGPS++:

TinyGPSPlus gps;

И запускаете последовательное соединение на определённых ранее пинах:

SoftwareSerial ss(RXPin, TXPin);

В функции setup() вы инициализируете последовательную связь — как для просмотра показаний в мониторе последовательного порта, так и для связи с GPS-модулем.

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

В функции loop() происходит запрос информации. Чтобы TinyGPS++ работал, вам нужно постоянно передавать ему символы от GPS-модуля с помощью метода encode().

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

Затем вы можете запросить у объекта gps, были ли обновлены какие-либо поля данных:

if (gps.location.isUpdated()){
  Serial.print("Latitude="); Serial.print(gps.location.lat(), 6);
  Serial.print("Longitude="); Serial.println(gps.location.lng(), 6);
}

Получение широты и долготы так же просто, как использование gps.location.lat() и gps.location.lng() соответственно.

Загрузите код на ваш Arduino, и вы должны увидеть местоположение, отображаемое в мониторе последовательного порта. После загрузки кода подождите несколько минут, пока модуль скорректирует позицию для получения более точных данных.

Получение GPS-координат в мониторе последовательного порта Arduino

Получение дополнительной GPS-информации с помощью библиотеки TinyGPS++

Библиотека TinyGPS++ позволяет получить гораздо больше информации, чем просто местоположение, и делает это простым способом. Помимо местоположения, вы можете получить:

  • дату

  • время

  • скорость

  • курс

  • высоту

  • спутники

  • hdop

Приведённый ниже код демонстрирует, как можно получить всю эту информацию простым способом.

/*
 * Rui Santos
 * Complete Project Details https://randomnerdtutorials.com
 *
 * Based on the example TinyGPS++ from arduiniana.org
 *
 */

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

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(9600);
  ss.begin(GPSBaud);
}

void loop(){
  // This sketch displays information every time a new sentence is correctly encoded.
  while (ss.available() > 0){
    gps.encode(ss.read());
    if (gps.location.isUpdated()){
      // Latitude in degrees (double)
      Serial.print("Latitude= ");
      Serial.print(gps.location.lat(), 6);
      // Longitude in degrees (double)
      Serial.print(" Longitude= ");
      Serial.println(gps.location.lng(), 6);

      // Raw latitude in whole degrees
      Serial.print("Raw latitude = ");
      Serial.print(gps.location.rawLat().negative ? "-" : "+");
      Serial.println(gps.location.rawLat().deg);
      // ... and billionths (u16/u32)
      Serial.println(gps.location.rawLat().billionths);

      // Raw longitude in whole degrees
      Serial.print("Raw longitude = ");
      Serial.print(gps.location.rawLng().negative ? "-" : "+");
      Serial.println(gps.location.rawLng().deg);
      // ... and billionths (u16/u32)
      Serial.println(gps.location.rawLng().billionths);

      // Raw date in DDMMYY format (u32)
      Serial.print("Raw date DDMMYY = ");
      Serial.println(gps.date.value());

      // Year (2000+) (u16)
      Serial.print("Year = ");
      Serial.println(gps.date.year());
      // Month (1-12) (u8)
      Serial.print("Month = ");
      Serial.println(gps.date.month());
      // Day (1-31) (u8)
      Serial.print("Day = ");
      Serial.println(gps.date.day());

      // Raw time in HHMMSSCC format (u32)
      Serial.print("Raw time in HHMMSSCC = ");
      Serial.println(gps.time.value());

      // Hour (0-23) (u8)
      Serial.print("Hour = ");
      Serial.println(gps.time.hour());
      // Minute (0-59) (u8)
      Serial.print("Minute = ");
      Serial.println(gps.time.minute());
      // Second (0-59) (u8)
      Serial.print("Second = ");
      Serial.println(gps.time.second());
      // 100ths of a second (0-99) (u8)
      Serial.print("Centisecond = ");
      Serial.println(gps.time.centisecond());

      // Raw speed in 100ths of a knot (i32)
      Serial.print("Raw speed in 100ths/knot = ");
      Serial.println(gps.speed.value());
      // Speed in knots (double)
      Serial.print("Speed in knots/h = ");
      Serial.println(gps.speed.knots());
      // Speed in miles per hour (double)
      Serial.print("Speed in miles/h = ");
      Serial.println(gps.speed.mph());
      // Speed in meters per second (double)
      Serial.print("Speed in m/s = ");
      Serial.println(gps.speed.mps());
      // Speed in kilometers per hour (double)
      Serial.print("Speed in km/h = ");
      Serial.println(gps.speed.kmph());

      // Raw course in 100ths of a degree (i32)
      Serial.print("Raw course in degrees = ");
      Serial.println(gps.course.value());
      // Course in degrees (double)
      Serial.print("Course in degrees = ");
      Serial.println(gps.course.deg());

      // Raw altitude in centimeters (i32)
      Serial.print("Raw altitude in centimeters = ");
      Serial.println(gps.altitude.value());
      // Altitude in meters (double)
      Serial.print("Altitude in meters = ");
      Serial.println(gps.altitude.meters());
      // Altitude in miles (double)
      Serial.print("Altitude in miles = ");
      Serial.println(gps.altitude.miles());
      // Altitude in kilometers (double)
      Serial.print("Altitude in kilometers = ");
      Serial.println(gps.altitude.kilometers());
      // Altitude in feet (double)
      Serial.print("Altitude in feet = ");
      Serial.println(gps.altitude.feet());

      // Number of satellites in use (u32)
      Serial.print("Number os satellites in use = ");
      Serial.println(gps.satellites.value());

      // Horizontal Dim. of Precision (100ths-i32)
      Serial.print("HDOP = ");
      Serial.println(gps.hdop.value());
    }
  }
}

Посмотреть исходный код

Заключение

Мы надеемся, что это руководство было для вас полезным. Мы планируем создать GPS-логгер данных с GPS-модулем NEO-6M и модулем SD-карты, так что следите за обновлениями.

Если вам понравился этот проект, вам также могут понравиться:

Спасибо за чтение.