Подключение GPS-модуля GY-NEO6MV2

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1607
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 16 октября 2017, 20:56

GPS-модуль GY-NEO6MV2.jpg
GPS-модуль GY-NEO6MV2
GPS-модуль GY-NEO6MV2.jpg (87.86 КБ) 9039 просмотров


Принцип работы, подключение, примеры

В этом эксперименте рассмотрим работу модуля GPS-приемника, позволяющего определять наше местоположение с помощью глобальной системы GPS, и подключение данного приемника к плате Arduino.

GPS (Global Positioning System) – это система, позволяющая с точностью не хуже 100 м определить местоположение объекта, то есть определить его широту, долготу и высоту над уровнем моря, а также направление и скорость его движения. Кроме того, с помощью GPS можно определить время с точностью до 1 наносекунды. GPS состоит из совокупности определенного количества искусственных спутников Земли (спутниковой системы NAVSTAR) и наземных станций слежения, объединенных в общую сеть. В качестве абонентского оборудования служат индивидуальные GPS-приемники, способные принимать сигналы со спутников и по принятой информации вычислять свое местоположение.

Назначение выводов:


• GND – общий вывод;
• RX – вход для данных в последовательном формате UART;
• TX – выход для данных в последовательном формате UART;
• VCC – вход напряжения питания от 3,3 до 5 В;

Холодный старт происходит, когда GPS-приемник был выключен длительное время, перемещался в выключенном состоянии на значительное расстояние или его часы не совпадают с данными спутника. При холодном старте со спутников скачивается альманах. Время обновления альманаха – от 5 до 15 минут в зависимости от условий приема и количества видимых спутников. Особенность – приемник в это время должен быть неподвижен. Теплый старт происходит, когда приемник был выключен более 30 мин. При этом происходит прием уточняющих данных. Занимает 0,5–1,5 мин. Горячий старт происходит, когда приемник был отключен непродолжительное время. Данные считаются свежими, и приемник просто находит спутники (опираясь на данные альманаха). Для проверки работоспособности подключим модуль к плате Arduino и будем выводить данные о местоположении – географические широту и долготу в монитор последовательного порта Arduino. Схема подключения показана на рисунке

Подключение GPS-модуля GY-NEO6MV2.jpg
Подключение GPS-модуля GY-NEO6MV2
Подключение GPS-модуля GY-NEO6MV2.jpg (167 КБ) 9039 просмотров


Приступим к написанию скетча. Будем использовать библиотеки SoftwareSerial и TinyGPS, позволяющую выделять нужные данные из всего потока, передаваемого приемником. Содержимое скетча

Код: Выделить всё

#include <SoftwareSerial.h>
#include <TinyGPS.h>
TinyGPS gps;
SoftwareSerial gpsSerial(7, 8);
bool newdata = false;
unsigned long start;
long lat, lon;
unsigned long time, date;
void setup()
{
gpsSerial.begin(9600); // скорость обмена с GPS-приемником
Serial.begin(9600);
Serial.println("Waiting data of GPS...");
}
void loop()
{
// задержка в секунду между обновлениями координат
if (millis() - start > 1000)
{
newdata = readgps();
if (newdata)
{
start = millis();
gps.get_position(&lat, &lon);
gps.get_datetime(&date, &time);
Serial.print("Lat: "); Serial.print(lat);
Serial.print(" Long: "); Serial.print(lon);
Serial.print(" Date: "); Serial.print(date);
Serial.print(" Time: "); Serial.println(time);
}
}
}
// проверка наличия данных
bool readgps()
{
while (gpsSerial.available())
{
int b = gpsSerial.read();
//в TinyGPS есть ошибка: не обрабатываются данные с \r и \n
if('\r' != b)
{
if (gps.encode(b))
return true;
}
}
return false;
}


Смотрим в мониторе последовательного порта Arduino вывод данных широты и долготы. Также получаем текущую дату и время по Гринвичу

вывод данных широты и долготы.jpg
вывод данных широты и долготы
вывод данных широты и долготы.jpg (20.48 КБ) 9039 просмотров


Или ещё один скетч

Код: Выделить всё

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

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 7(rx) and 8(tx).
   
   Этот пример кода демонстрирует нормальное использование объекта TinyGPS.
    Это требует использования SoftwareSerial и предполагает, что у вас есть
    Последовательное устройство GPS 4800-baud подключено к контактам 7 (rx) и 8 (tx)
*/

TinyGPS gps;
SoftwareSerial ss(7, 8);

static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);
void setup()
{
  Serial.begin(9600);
  
  Serial
.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.println("Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");

  ss.begin(9600);
}

void loop()
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  print_date(gps);
  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
  

  
  
  smartdelay
(1000);
}

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  
{
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
  if (val == invalid)
  {
    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 print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    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 print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("********** ******** ");
  else
  
{
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
        month, day, year, hour, minute, second);
    Serial.print(sz);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  smartdelay(0);
}

static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartdelay(0);
}


И смотрим результат в мониторе последовательного порта
вывод данных широты и долготы1.jpg
вывод данных широты и долготы
вывод данных широты и долготы1.jpg (56.62 КБ) 9039 просмотров


Вот и всё, а в следующих статьях буду описывать метод графического вывода данных GPS-модуля GY-NEO6MV2
[center]i love you [s]mxIni[/s] Mysql[/center]


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Аппаратная часть»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя