Руководство по GPS-модулю NEO-6M с Arduino
В этом руководстве показано, как использовать GPS-модуль NEO-6M с Arduino для получения GPS-данных. GPS расшифровывается как Global Positioning System (Глобальная система позиционирования) и может использоваться для определения местоположения, времени и скорости, если вы находитесь в движении.
Вы узнаете, как:
Подключить GPS-модуль NEO-6M к Arduino UNO
Получить необработанные GPS-данные
Разобрать необработанные данные для получения выбранной и читаемой GPS-информации
Получить местоположение
Знакомство с 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, следуя схеме ниже.
Контакт 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 — 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.
Библиотека предоставляет несколько примеров использования. В 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-информации с помощью библиотеки 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-карты, так что следите за обновлениями.
Если вам понравился этот проект, вам также могут понравиться:
Спасибо за чтение.