Arduino gps: подключение и использование neo-6m

Модуль UBlox Neo 6M GPS не отвечает

Недавно я начал работу с модулем GPS uBlox Neo 6M (технический паспорт http://www.u-blox.com/images/downloads/Product_Docs/NEO-6_DataSheet_%28GPS.G6-HW-09005%29.pdf). Я подключил его к Arduino Uno, как показано ниже:

GPS Arduino VCC— 3.3V RX — D11 TX — D10 GND— GND

Я попробовал этот пример кода из TinyGPS ++ (из конечно, изменение контактов и gpsbaud до 9600, что по умолчанию является gps).

#include #include /* This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object. It requires the use of SoftwareSerial, and assumes that you have a 4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx). */ static const int RXPin = 10, TXPin = 11; 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(115200); ss.begin(GPSBaud); Serial.println(F(«DeviceExample.ino»)); Serial.println(F(«A simple demonstration of TinyGPS++ with an attached GPS module»)); Serial.print(F(«Testing TinyGPS++ library v. «)); Serial.println(TinyGPSPlus::libraryVersion()); Serial.println(F(«by Mikal Hart»)); Serial.println(); } void loop() { // This sketch displays information every time a new sentence is correctly encoded. while (ss.available() > 0) if (gps.encode(ss.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while(true); } } void displayInfo() { Serial.print(F("Location: ")); if (gps.location.isValid()) { Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print(gps.location.lng(), 6); } else { Serial.print(F("INVALID")); } Serial.print(F(" Date/Time: ")); if (gps.date.isValid()) { Serial.print(gps.date.month()); Serial.print(F("/")); Serial.print(gps.date.day()); Serial.print(F("/")); Serial.print(gps.date.year()); } else { Serial.print(F("INVALID")); } Serial.print(F(" ")); if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(F(":")); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(F(":")); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print(F(".")); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.print(gps.time.centisecond()); } else { Serial.print(F("INVALID")); } Serial.println(); }

Однако, я не получаю GPS LED моргать, а также RX LED моего Arduino, поэтому модуль не передает никаких данных. Это вывод кода:

A simple demonstration of TinyGPS++ with an attached GPS module Testing TinyGPS++ library v. 0.92 by Mikal Hart Location: INVALID Date/Time: 0/0/2000 00:00:00.00 Location: INVALID Date/Time: 0/0/2000 00:00:00.00

Спасибо!

arduino-uno tinygps gps14k<\p>

Источник: https://arduino.stackovernet.com/ru/q/3813

Подключение GPS приемника EB500 к Arduino UNO

В данной статье речь пойдет о подключении GPS приемника EB-500 к плате Arduino UNO. Сам приемник прост в подключении и относительно недорог.

Для подключения мы будем использовать UART, схема подключения показана на рисунке.

Подключение осуществляется по трем проводам: 1) +3.3В — питание модуля;

2) TXD — передача данных от модуля к плате Arduino;

3) GND — «земля», общий провод.

На фото показано собранный макет устройства и модель платы.

TXD (EB_RX0) подключается к Digital2 платы Arduino.

Если подключить TXD подключить к выводу Digital 1 непрошитой платы, то можно увидеть необработанные данные, приходящие от приемника.

Но наша задача состоит в получении уже готовых данных, таких как: долгота/широта, точность, время, дата, скорость, направление движения, высота над уровнем моря.

Можно пойти двумя путями получения этих данных: самостоятельно разобрать получаемые строки, но это требует написания своего алгоритма, поэтому не будем изобретать велосипед, и воспользуемся готовой библиотекой TinyGPS. Построим в консоли табличку.

Получаем эту табличку, используя следующий код:

#include «SoftwareSerial.h»
#include «TinyGPS.h» TinyGPS gps;
SoftwareSerial ssGPS(2, 3); 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); /*———————————————————-*/ //Sats — количество найденных спутников //HDOP — горизонтальная точность //Latitude — широта в градусах //Longitude — долгота в градусах //Date — дата //Time — времы UTC(-4 часа от Московского) //Alt — высота над уровнем моря (в метрах) //Course — путевой угол (направление скорости) в градусах. Значение 0 — север, 90 — восток, 180 — юг, 270 — запад. //Speed — скорость(км/ч) /*———————————————————-*/ Serial.println(«Sats HDOP Latitude Longitude Date Time Alt Course Speed»); Serial.println(«————————————————————————«); ssGPS.begin(9600);
} void loop()
{ float flat, flon; unsigned long date, time; print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5); //Количество спутников print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5); //Горизонтальная точность gps.f_get_position(&flat, &flon); print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6); //Широта print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6); //Долгота print_date(gps); //Дата/Время по UTC 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); //Скорость Serial.println(); smartdelay(1000);
} static void smartdelay(unsigned long ms)
{ unsigned long start = millis(); do { while (ssGPS.available()) gps.encode(ssGPS.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 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); } smartdelay(0);
} static void print_str(const char *str, int len)
{ int slen = strlen(str); for (int i=0; i

Что мы в итоге получаем: при подключении устройства к питанию мы получаем табличку со звездочками:

до тех пор, пока не найдутся спутники, и светодиод не начнет мигать, тогда мы увидим следующее:

Вот и все. Данные пошли, теперь их можно использовать по своему усмотрению, например подключить дисплей, вывести на него скорость и использовать как спидометр. Или подключить SD-карту и сделать GPS — логгер.

Список радиоэлементов

Скачать список элементов (PDF)

Прикрепленные файлы:

Источник: http://cxem.net/arduino/arduino123.php

GY-GPS6MV2 – NEO6MV2 (Neo 6M) GPS Module with Arduino / USB TTL

Ublox Neo 6M (Ublox NEO6MV2) is a I2C compliant GPS module. This post discusses details on wiring Ublox Neo 6M with Arduno or an USB to Serial/TTL adapter, basic interactions with module using serial communication, using u-center GUI in visualizations, as well as using TinyGPS library to extract fine grained results from the module output.

Please note that most of the points (except for “TinyGPS” library based sample) can be checked only with USB to Serial/TTL adapters. Hence, all other steps can be followed even without an Arduino.

Wiring

I recently purchased a Neo 6M board labeled “GY-GPS6MV2” and according to descriptions of board, input voltage range was 3.

3V – 6V (Caution!! Be careful and check if input voltage of 5V can be directly applied with the board / module being used). But I/O maximum logic level is rated at 3.

6V which might be a problem while connecting the device with Arduino (which works with 5V logic level).

After going through ATmega328 datasheet and further reading the nice explanation of jippie, it was clear that 3.6V should be just enough for Arduino to pick up.

Therefore, TX pin of NEO 6M can be directly connected with Arduino (Sparkfun has a nice article on serial communication) . However, it is problematic if NEO 6M would be able to handle 5V logic signals coming from Arduino.

Even though, some sources confirm that directly connecting module with Arduino does not do any harm, it is not clear if there really is any side effect in long run.

Note : Same applies to USB to Serial/TTL adapters.

Perfect method to overcome all these logic level problems is to use a “Bi-Directional Logic Level Converter“. Advantage of “Bi-Directional Logic Level Converter” is that in can step-down voltage in one direction while being able to step-up the voltage in the reverse direction.

For an example, it can step down  5V signal to 3.3V signal and, if signal is sent in reverse direction it will step up the 3.3V signal to 5V.

However, “Bi-Directional Logic Level Converter” can be an expensive option for such task (because we are only worried about the RX pin of NEO 6M) and I did not have a converter around to try out.

Connecting two 1N4148 diods in parallel which gives a voltage drop of around 1.4V is another option.

Final Solution

The optimal solution was to use a voltage divider circuit. Nice voltage divider calculator is available at Raltron as well. After few calculations it was decided to use 4.7K as R1 and 10K as R2. Given input voltage of 5V, mentioned voltage divider will give around 3.4V which is well above the minimum logic level.

Note : Same applies to USB to Serial/TTL adapters. If you are using a USB to Serial/TTL adapter, connect TX of GPS module to RX of adapter and RX of GPS module to TX of adapter through the voltage divider. Vcc can be directly attached if you are using “GY-GPS6MV2” board with input voltage range of 3.3V – 6V.

Arduino Code  – Serial Communication

Below serial communication logic will print modules output to Arduino Serial Monitor available in Tools menu of IDE.

#include //Create software serial object to communicate with GPS SoftwareSerial gps(4, 3); void setup() { //Begin serial comunication with Arduino and Arduino IDE (Serial Monitor) Serial.begin(9600); while(!Serial); //Being serial communication witj Arduino and GPS Module //Important rate must be 9600 gps.begin(9600); delay(1000); Serial.println(«Setup Complete!»); } void loop() { //Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor if(gps.available()){ Serial.write(gps.read()); } //Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800 if(Serial.available()){ gps.write(Serial.read()); } }

Output is similar to what is seen below. As GPS data is somewhat sensitive I have masked actual values, leaving headers as they are.

If you are using USB to Serial/TTL adapter, please follow Pololu’s Guide on Communicating via the USB-to-TTL-Serial Adapter using Putty.

NMEA (National Marine Electronics Association) Data

Values printed in the previous experiment are called “NEMA Data”. More details about NEMA data is available at http://www.gpsinformation.org/dale/nmea.htm.

For an example “$GPVTG” seen in screenshot stands for “vector track and speed over ground”, while “$GPRMC” stands for minimum recommend data. Example breakdown of “$GPRMC” is as follows :

Источник: https://www.ayomaonline.com/iot/gy-gps6mv2-neo6mv2-neo-6m-gps-module-with-arduino-usb-ttl/

GPS Модуль.GYNEO6MV2

GPS(Global Positioning System, Глобальная система позиционирования) — Спутниковая навигационная система, определяющая положение объектов в пространстве согласно всемирной системе координат.

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

Именно об одном из таких модулей сейчас и пойдет речь.

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

Зная расстояния до спутников, используя геометрические преобразования, можно найти положение объекта в пространстве. Для определения координат на плоскости (т.е. широты и долготы), достаточно получить данные с 3 спутников, а для определения положения в 3D пространстве необходимы данные уже 4 спутников.

Гражданские системы GPS позволяют достичь точности в несколько метров.

Для работы с данной системой посредством микроконтроллера, существует целый десяток модулей, стоимостью от 150 до нескольких тысяч рублей. Некоторые модули GPS совмещены с GPRS/GSM модулями, например A7 или SIM808. Мы же обсудим один из самых дешевых модулей GY-NEO6MV2. Данный модуль стоит от 180 до 400рублей, в зависимости от обвязки и поставляемой с ним антенной. Вот он:

Номинальное напряжение питания модуля 5 Вольт. При подключении питания красный светодиод начинает гореть. После установки связи со спутниками, светодиод начинает мигать. По умолчанию модуль настроен на скорость 9600 или 38400, какая именно у вас можно узнать лишь экспериментальным путем.

При подключении к UART модуль начинает отправлять сообщения по протоколу NMEA примерно раз в секунду. Настройка передаваемых сообщений производится посредством специализированной программы U-Center. Выглядит она следующим образом:

Читайте также  Измерение периода сигнала

Для настройки модуля, подключите его по USB-UART(COM-UART) преобразователю. Для этих целей я использую преобразователь на базе CH340. Для настройки подключения используйте меню Receiver-Port.

После установки соединения, загорится зеленым соответствующий индикатор в программе. После того как модуль поймает спутники, в программе будут показаны текущие координаты, спутники, время и так далее.Настройка сообщений производится в окне Messages, которое можно вызвать из меню:

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

Краткое описание сообщений указано в программе:

После этого, необходимо сохранить изменения нажав кнопку Save Config.

Если модуль не может установить связь со спутниками, первым делом необходимо проверить правильность подключения антенны (Разъем должен быть надежно прижат). После этого проверьте питающее напряжение, оно должно быть равно 5 Вольтам.

Затем, если антенна подключена правильно, попробуйте разместить модуль как можно ближе к окну (если вы находитесь в здании) или выйти на открытую площадку (вне здания).

Читайте также:  Дроны - перспективная технология для современного кино - arduino+

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

Спасибо за внимание, в следующем уроке мы подключим данный модуль к микроконтроллеру.

Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG.RU. Незаконное копирование, цитирование, воспроизведение преследуется по закону!

Источник: http://mkprog.ru/avr/gps-modul-gyneo6mv2.html

GSM-модуль — SIM900 и NEO-6M Gps модуль arduino не работает вместе

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

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

Здесь ваш эскиз, измененный, чтобы всегда проверять символы GPS, а затем проверить статус вызова:

#include
#include
#include SMSGSM sms;
CallGSM call;
boolean started=false; #undef STATUS_NONE // bad SIM900 library!
#include
NMEAGPS gps;
gps_fix fix; // create variable that holds latitude and longitude // BEST:
//#include
//AltSoftSerial gpsSerial; // GPS TX to UNO pin 8 (optional: GPS RX to UNO pin 9) // 2nd BEST:
#include
NeoSWSerial gpsSerial( 10, 11 ); void setup()
{ Serial.begin(9600); if (gsm.begin(9600)) { Serial.println( F(»
status=READY») ); // F macro saves RAM started=true; } else Serial.println( F(»
status=IDLE») ); gpsSerial.begin(9600);
} void loop()
{ // Always check for GPS characters. A GPS fix will become available // ONCE PER SECOND. After the fix comes in, the GPS device will // be quiet for a while. That a good time to check the phone status. if (gps.available( gpsSerial )){ fix = gps.read(); // get latest PARSED gps data // Display what was received Serial.print( F(«Latitude= «) ); Serial.println( fix.latitude(), 6 ); Serial.print( F(«Longitude= «) ); Serial.println( fix.longitude(), 6 ); // Then check the current GSM status, ONLY ONCE PER SECOND CheckCall(); } //delay(1000); NEVER use delay! You will lose GPS characters.
} void CheckCall()
{ // You can use the 'fix' structure in here, if you want. switch (call.CallStatus()) { case CALL_NONE: // Nothing is happening break; case CALL_INCOM_VOICE : // Yes! Someone is calling us Serial.println(«RECEIVING CALL»); call.HangUp(); break; case CALL_COMM_LINE_BUSY: // In this case the call would be established Serial.println(«TALKING. Line busy.»); break; }
}

Обратите внимание, что использует мои библиотеки NeoGPS и NeoSWSerial. NeoGPS меньше, быстрее, надежнее и точнее всех других библиотек.

Вам следует избегать SoftwareSerial, потому что это очень неэффективно. Он отключает прерывания в течение длительных периодов времени, когда символ отправляется или принимается. Отключение прерываний на 1 мс — это вечность для 16-мегагерцового Arduino. Он не может ничего сделать, кроме как дожидаться окончания персонажа. За это время он мог бы выполнить 10 000 инструкций.

И AltSoftSerial и NeoSWSerial намного эффективнее, и они могут отправлять и получать в одно и то же время.

Если вы можете подключить GPS к контактам 8 и 9, вместо этого используйте AltSoftSerial. Его можно надежно использовать до 19200, а затем все менее надежно до 115200, в зависимости от того, сколько обработок прерывается.

Если вы не можете переместить его на эти контакты, вместо этого используйте мой NeoSWSerial. Он почти так же эффективен, как и AltSoftSerial, но все же намного лучше, чем SoftwareSerial. Он может использовать любые два контакта, но только при скорости передачи 9600, 19200 и 38400.

НОТА:

Чтобы использовать NeoSWSerial на этих двух выводах, вам необходимо изменить файлы в библиотеке SIM900 (возможно, в каталоге Libraries/GSM-GPRS-GPS-Shield-GSMSHIELD). Вы должны искать и заменять все вхождения «SoftwareSerial» на «NeoSWSerial». Эти 4 файла должны быть изменены:

GSM.h SIM900.h WideTextFinder.h and cpp

NeoGPS и NeoSWSerial доступны в Диспетчере библиотек Arduino IDE в меню Sketch → Include Library → Управление библиотеками. Примеры NMEAsimple.ino и NMEAloc.ino — хорошее место для начала. Tabular.ino отображает все части в конфигурации по умолчанию.

Источник: http://qaru.site/questions/13843309/gsm-module-sim900-and-neo-6m-gps-module-arduino-code-not-working-together

Создаем GPS часы на Arduino

Вам необходим источник точного времени от GPS? Данная статья покажет вам, как использовать модуль GPS для получения времени, даты и координат, и как показать их на LCD индикаторе с помощью Arduino.

Что необходимо?

Введение

Создание системы глобального позиционирования, или GPS, началось в начале 1970-х годов. Каждая страна (Россия, США, Китай и т.д.) обладают своей собственной системой, но большинство средств спутниковой навигации в мире используют систему США.

Каждый спутник системы имеет атомные часы, которые непрерывно контролируются и корректируются NORAD (командованием воздушно-космической обороны Северной Америки) каждый день.

По сути, приемник по своим часам измеряет TOA (время получения сигнала, time of arrival) четырех спутниковых сигналов.

Исходя из TOA и TOT (времени отправки сигнала, time of transmission), приемник вычисляет четыре значения времени «пролета» сигнала (TOF, time of flight), которые отличаются друг от друга в зависимости от расстояния спутник-приемник.

Затем, исходя из четырех значений TOF, приемник вычисляет свое положение в трехмерном пространстве и отклонение своих часов.

Самые недорогие GPS приемники обладают точностью около 20 метров для большинства мест на Земле. Теперь посмотрим, как изготовить свои собственные часы GPS с помощью Arduino.

Аппаратная часть

Мой GPS модуль имеет 6 контактов: GND, Vin, Tx, Rx и снова GND. Шестой вывод никуда не подключен.

Контакт GND соединен с корпусом на Arduino, Vin подключаем к шине +5В на Arduino, Tx подключен к выводу 10 на Arduino, а вывод Rx никуда не подключаем, так как не будем посылать на GPS модуль никаких сообщений.

Мой модуль передает спутниковые данные, используя интерфейс RS-232, со скоростью 4800 бит/сек, которые принимаются Arduino на выводе 10.

Ниже показана фотография GPS модуля:

GPS модуль EM-411

Модуль отправляет то, что известно как NMEA сообщения. Здесь вы можете увидеть пример одного NMEA сообщения и его разъяснение (выдержка из технического описания):

$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M,,,,0000*18

Формат данных GGA

НазваниеПримерЕдиницыОписание
ID сообщения $GPGGA Заголовок протокола GGA
Время UTC 161229.487 hhmmss.sss (две цифры часы, две цифры минуты, затем секунды с точностью до тысячных)
Широта 3723.2475 ddmm.mmmm (первые две цифры градусы, затем минуты с точностью до десятитысячных)
Флаг N/S N N – север, S – юг
Долгота 12158.3416 ddmm.mmmm (первые две цифры градусы, затем минуты с точностью до десятитысячных)
Флаг E/W W E – восток, W – запад
Индикатор местоположения 1
  • 0 – местоположение недоступно или некорректно;
  • 1 – режим GPS SPS, местоположение корректно;
  • 2 – дифференциальный GPS, режим SPS, местоположение корректно;
  • 3 – режим GPS PPS, местоположение корректно.
Количество используемых спутников 07 В диапазоне от 0 до 12
HDOP 1.0 Ухудшение точности по горизонтали
Высота относительно уровня моря 9.0 метры
Единицы измерения M метры
Геоидальное различие Различие между земным эллипсоидом WGS-84 и уровнем моря (геноидом)
Единицы измерения M метры
Возраст дифференциальных данных GPS секунды Нулевые поля, когда DGPS не используется
ID станции, передающей дифференциальные поправки 0000
Контрольная сумма *18
Конец сообщения

Все эти данные принимаются Arduino через вывод 10. Библиотека TinyGPS читает сообщения GPGGA и GPRMC (для подробной информации о GPRMC смотрите техническое описание).

Arduino на схеме не показан. Подключите периферийные устройства согласно подписанным соединениям.

Схема GPS часов на arduino

Программное обеспечение

При подаче питания GPS модуль затрачивает некоторое время, чтобы получить правильное местоположения от спутников. Когда местоположение получено, модуль шлет NMEA сообщения на Arduino.

Библиотека TinyGPS содержит функцию для получения времени и даты из GPRMC сообщения.

Она называется crack_datetime() и принимает в качестве параметров семь указателей на переменные: год year, месяц month, день месяца day, часы hour, минуты minute, секунды second, и сотые доли секунды hundredths. Вызов функции выглядит так:

gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);

Вызов данной функции возвращает вам в переменных правильные значения до тех пор, пока с железом всё в порядке.

Чтобы получить ваше местоположение, можно вызвать функциюf_get_position(). Данная функция принимает в качестве параметров два указателя на переменные: широта latitudeи долгота longitude. Вызов данной функции выглядит так:

gps.f_get_position(&latitude, &longitude);

 Исходный текст программы:

#include #include #include #define RXPIN 10 #define TXPIN 9 #define GPSBAUD 4800 #define RS 2 #define EN 3 #define D4 4 #define D5 5 #define D6 6 #define D7 7 TinyGPS gps; SoftwareSerial uart_gps(RXPIN, TXPIN); LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); // Переменные int seconds; int timeoffset = 1; // Пользователь должен изменить единицу на соответствующий часовой пояс. В примере используем сдвиг на +1 час. // Объявление функций. void getgps(TinyGPS &gps); // Функция настройки — запускается только при включении void setup() { Serial.begin(115200); // Запуск последовательного интерфейса для отладки uart_gps.begin(GPSBAUD); // Запуск приемника UART для GPS lcd.begin(16,2); // Объявление LCD lcd.print(» GPS clock»); // Сообщение приветствия delay(1000); // Ждем одну секунду lcd.clear(); // Очистить LCD } // Цикл главной программы — запущен всегда void loop() { while(uart_gps.available()) { int c = uart_gps.read(); if(gps.encode(c)) { getgps(gps); } } } /* * Данная функция получает данные от GPS модуля * и отображает их на LCD */ void getgps(TinyGPS &gps) { int year; float latitude, longitude; byte month, day, hour, minute, second, hundredths; gps.f_get_position(&latitude, &longitude); gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths); hour = hour + timeoffset; lcd.clear();//lcd.setCursor(0, 0); lcd.print(«Time: «); if (hour

Источник: https://radioprog.ru/post/125

GPS uBlox NEO-6M and arduino

Here is the GPS module. This  NEO-6M GPS module communicate with Arduino with a serial. You can learn more about serial communication in my previous post.

In order to plug the module to the Arduino, it requires a bit of soldering.

So you have 4 wire to plug. Each one is labelled on the GPS with:

VCC: Positive 5 volts

RX: Serial reception

TX: Serial output

GND: Ground

Because I’m using the Arduino Mega, I have several Serial ports already available. I decide to wire the GPS module to the Serial1. I use a code found on Ladyada that I modified to work with my configuration.

// A simple sketch to read GPS data and parse the $GPRMC string// see http://www.ladyada.net/make/gpsshield for more info#define BUFFSIZ 90 // plenty biguint8_t hour, minute, second, year, month, date;uint32_t latitude, longitude;uint8_t groundspeed, trackangle;    pinMode(powerpin, OUTPUT);  // prints title with ending line break  Serial.println(«GPS parser»);   digitalWrite(powerpin, LOW);         // pull low to turn on!  Serial.print(»

read: «);  // check if $GPRMC (global positioning fixed data)  if (strncmp(buffer, «$GPRMC»,6) == 0) {    tmp = parsedecimal(parseptr);    minute = (tmp / 100) % 100;    parseptr = strchr(parseptr, ',') + 1;    // grab latitude & long data    latitude = parsedecimal(parseptr);      parseptr = strchr(parseptr, '.')+1;      latitude += parsedecimal(parseptr);    parseptr = strchr(parseptr, ',') + 1;    // read latitude N/S data    if (parseptr[0] != ',') {    //Serial.println(latdir);    parseptr = strchr(parseptr, ',')+1;    longitude = parsedecimal(parseptr);      parseptr = strchr(parseptr, '.')+1;      longitude += parsedecimal(parseptr);    parseptr = strchr(parseptr, ',')+1;    // read longitude E/W data    if (parseptr[0] != ',') {    parseptr = strchr(parseptr, ',')+1;    groundspeed = parsedecimal(parseptr);    parseptr = strchr(parseptr, ',')+1;    trackangle = parsedecimal(parseptr);    parseptr = strchr(parseptr, ',')+1;    tmp = parsedecimal(parseptr);    month = (tmp / 100) % 100;    Serial.print(»
Time: «);    Serial.print(hour, DEC); Serial.print(':');    Serial.print(minute, DEC); Serial.print(':');    Serial.println(second, DEC);    Serial.print(month, DEC); Serial.print('/');    Serial.print(date, DEC); Serial.print('/');    Serial.println(year, DEC);    Serial.print(latitude/1000000, DEC); Serial.print('°', BYTE); Serial.print(' ');    Serial.print((latitude/10000)%100, DEC); Serial.print('''); Serial.print(' ');    Serial.print((latitude%10000)*6/1000, DEC); Serial.print('.');    Serial.print(((latitude%10000)*6/10)%100, DEC); Serial.println('»');    Serial.print(longitude/1000000, DEC); Serial.print('°', BYTE); Serial.print(' ');    Serial.print((longitude/10000)%100, DEC); Serial.print('''); Serial.print(' ');    Serial.print((longitude%10000)*6/1000, DEC); Serial.print('.');    Serial.print(((longitude%10000)*6/10)%100, DEC); Serial.println('»');  //Serial.println(buffer);uint32_t parsedecimal(char *str) {   if ((str[0] > '9') || (str[0]

Источник: http://jules.dourlens.com/gps-ublox-neo-6m-and-arduino/

Reading GPS data using Arduino and a U-blox NEO-6M GPS receiver

It is possible to read, and log GPS data, such as time, position, speed, and so on, using an Arduino microcontroller plus an U-blox NEO-6M GPS receiver.

For my test, I used an Arduino Ethernet and a U-blox NEO-6M GPS, which I bought on Amazon Japan for 2,580Yen (about 17 Euro), a very cheap price.

In order to interface the Arduino with the GPS receiver, you have to connect the following pins: power supply VCC (5V), GND (0V), and serial RX and TX. You need to connect the GPS receiver TX to the Arduino RX, and RX with TX.

Actually, the NEO-6M GPS serial communication works with 3.3V voltage signal, while Arduino works with 5V voltage signals. However, it is possible to connect the Arduino serial pins directly to the NEO-6M pins without any problem.

U-blox NEO-6M GPS

On Arduino side, I used the pins 7 (RX) and 8 (TX) and the Software Serial Library. In fact, the Arduino built-in serial port (0=RX, 1=TX) was already used for the communication with the PC. In the picture below, pins 3, 5 and 6 are also connected to an other Arduino Micro, but these pins are not used in this sketch.

U-blox NEO-6M GPS Arduino Ethernet

The following Arduino sketch is continuously polling, once in a second, data from the GPS receiver. In order to poll GPS data, the command PUBX,00 is used (this is a proprietary command of U-blox). The received data is then forwarded to the PC serial connection, and visualized on the screen.

GPS_data_screenshot_2

I removed part of the information, for privacy (otherwise you would know exactly the coordinates of the place where I live). The message forwarded to the PC is as below (instead of «xxxx» and «yyyy», the latitude, longitude and height positions were received).

The original message received by the GPS receiver has a «$» at the beginning, and a «*» at the end (before the checksum). I used these 2 character to understand when the message starts and when it ends.

The data which Arduino sends to the PC is only the characters between «$» and «*» (I did not implement any checksum check at the moment).

The sketch that I used is as following, and can be downloaded here: GPS_serial_test. In order to run this sketch, you will also need the «Tempo» library which uses Timer1 and can be downloaded here: tempo_library_v1. I used Timer1 in to create a 10ms scheduler, and manage the polling request every 100 scheduler tasks (10ms x 100 = 1s).

By default, the NEO-6M outputs RMC, VTG, CGA, GSA, GSV, GLL messages once a second (these are standard NMEA messages). Since I wanted to receive the info by polling message (i.e.

not automatically, to avoid Arduino sofware serial reception overloading), I first had to disable the automatic sending of the messages (for example, for RMC, this can be done by sending to the GPS receiver the command: $PUBX,40,RMC,0,0,0,0*47).

This configuration is performed at the first loop execution. The software then polls the info (time, position, speed) by using the proprietary $PUBX,00*33 request.

#include #define GPS_INFO_BUFFER_SIZE 128char GPS_info_buffer[GPS_INFO_BUFFER_SIZE];unsigned int received_char;SoftwareSerial mySerial_GPS(7, 8); // 7=RX, 8=TX (needed to communicate with GPS)// REAL TIME SCHEDULER PARAMETERS AND VARIABLES#define SCHEDULER_TIME 10000 // scheduler interrupt runs every 20000us = 20ms#define DIVIDER_STD 200 // logging message sent every 100 scheduler times (20ms) 1s#define DIVIDER_DELAY 500 // delay after forwarding meggages is 3sunsigned int divider_max=DIVIDER_DELAY;// SENDS THE POLLING MESSAGE TO GPSvoid scheduled_interrupt()  if (divider==divider_max) {    mySerial_GPS.println(«$PUBX,00*33»); // data polling to the GPS  // Open serial communications and wait for port to open:    ; // wait for serial port to connect. Needed for native USB port only  Serial.println(«Connected»);  mySerial_GPS.begin(9600);  mySerial_GPS.println(«Connected»);  Timer1.initialize(); // initialize 10ms scheduler timer  Timer1.setPeriod(SCHEDULER_TIME); // sets the main scheduler time in microseconds (10ms in this case)  Timer1.attachInterrupt(scheduled_interrupt); // attaches the interrupt  Timer1.start(); // starts the timervoid loop() { // run over and over  if (first_loop_exec == true){    mySerial_GPS.println(F(«$PUBX,40,RMC,0,0,0,0*47»)); //RMC OFF    mySerial_GPS.println(F(«$PUBX,40,VTG,0,0,0,0*5E»)); //VTG OFF    mySerial_GPS.println(F(«$PUBX,40,GGA,0,0,0,0*5A»)); //CGA OFF    mySerial_GPS.println(F(«$PUBX,40,GSA,0,0,0,0*4E»)); //GSA OFF    mySerial_GPS.println(F(«$PUBX,40,GSV,0,0,0,0*59»)); //GSV OFF    mySerial_GPS.println(F(«$PUBX,40,GLL,0,0,0,0*5C»)); //GLL OFF  // MANAGES THE CHARACTERS RECEIVED BY GPS  while (mySerial_GPS.available()) {    GPS_info_char=mySerial_GPS.read();    if (GPS_info_char == '$'){ // start of message    }else if (GPS_info_char == '*'){ // end of message      for (i=0; i

Источник: https://www.monocilindro.com/2016/03/28/reading-gps-data-using-arduino-and-a-u-blox-neo-6m-gps-receiver/

Простой GPS-стандарт частоты и генератор RF | hardware | adminstuff

Простой GPS-стандарт частоты и генератор RF
Добавил(а) microsin   
Здесь приведен перевод интересной статьи [1], где описан простой стандарт частоты, собранный из модуля приемника GPS. Автор собирал конструкции на основе моделей NEO-6M (тип NEO-6M-0-001) и NEO-7M (тип NEO-7M-0-000) компании «u-blox AG». Эти модули можно довольно недорого купить на AliExpress.Модуль NEO-6M-0-001 позволяет генерировать максимальную опорную частоту 1 кГц, более современный модуль NEO-7M-0-000 может генерировать частоты до 10 МГц с дискретностью настройки 1 Гц (100 ppm) и минимальной точностью 2·10-8. Можно генерировать также и частоты выше 10 МГц ценой дополнительного джиттера в выходном сигнале. Получается точный RF-генератор, отлично подходящий для всех видов приложений. К сожалению, сигнал этого генератора получается недостаточно чистый по спектру, чтобы его можно было использовать в качестве VFO передатчика или приемника (точнее говоря, качество спектра зависит от генерируемой частоты, см. [7]).Ayoma Gayan Wijethunga описал в своем блоге, как этот GPS-модуль подключить к Arduino Nano, чтобы компьютер PC мог обмениваться с ним данными. Очень простая программа Arduino отправляет команды от PC к GPS-модулю и получает от него данные обратно. Получаемые данные можно увидеть с помощью встроенного в IDE Arduino монитора последовательного порта (окно Serial Monitor), либо с помощью любой программы терминала (SecureCRT, Putty, TerraTerm и т. п.). Также можно очень просто программировать импульсы времени, что рассмотрим далее. Схема подключения GPS-модуля NEO-7M-0-000 к Arduino Nano (модули NEO-6M-0-001 и NEO-7M-0-000 подключаются одинаково):Информационные сигналы обмена данными между модулем GSM и Arduino Nano передаются по последовательному порту TTL UART. Приемник GPS работает с уровнями логики 3.3V, поэтому для согласования с уровнями логики 5V Arduino Nano нужна либо микросхема преобразования уровней (GTL2003 и т. п.), либо цепочка делителя напряжения, составленная из резисторов 4,7 кОм и 10 кОм, подключенная между выходом TX Arduino Nano и входом RX модуля GSM. Уровень 3.3V на выходе TX модуля GSM достаточен, чтобы его подать на вход RX Arduino Nano. Автор для безопасности добавил на выходе TX модуля GSM резистор 1 кОм.Конечно, мы не можем подключить выход импульсов времени (ножка PPS модуля GSM) напрямую ко всем видам приложений. На выход PPS были добавлены резистор 5.6 кОм и емкость 0.1 мкФ, что позволяет избежать коротких замыканий на выходе и удаляет постоянную составляющую. Важный момент — резистор следует подключить как можно ближе к выводу, чтобы в антенну не попадал сигнал помехи, наводимый выводом PPS. В противном случае гармоники выходного сигнала опорной частоты могут нарушить прием сигнала GPS.Вся нехитрая конструкция была собрана в деревянной коробочке из-под пакетиков чая. В верхней крышке выпилено окошко, чтобы можно было видеть мерцание светодиодов.[Программа для Arduino Nano]Программирование микроконтроллера, который стоит на платке Arduino Nano, делается очень просто, всего за несколько минут! Загрузите среду разработки Arduino IDE с сайта arduino.cc и установите. Подключите платку Arduino Nano к компьютеру. Выберите тип подключенной платы (меню Сервис -> Плата -> Arduino Nano), выберите COM-порт, через который компьютер видит Arduino Nano (Сервис -> Последовательный порт). Откройте скетч ublox6a.ino (находится в архиве []). Выберите в меню Скетч -> Проверить / Компилировать (Ctrl+R). Через меню Файл -> Загрузить (Ctrl+U) загрузите скомпилированную программу в память микроконтроллера.#include < SoftwareSerial.h> // Создание программного serial-объекта для обмена данными// с модулем GPS. Ножка порта D3 Arduino используется как// сигнал TX, передающий данные выводу RX модуля GPS,// и ножка порта D4 Arduino работает как вход RX, получающий// сигнал от выхода TX модуля GPS. SoftwareSerial gps(4, 3); void setup() { // Запуск последовательного обмена между платой Arduino // и Arduino IDE (Serial Monitor). Вместо Serial Monitor // среды Arduino IDE можно использовать любую программу // последовательного терминала (SecureCRT, Putty, TerraTerm). Serial.begin(9600); while(!Serial); // Запуск последовательного обмена между платой Arduino // и модулем GPS. Скорость обмена должна быть 9600 бод. gps.begin(9600); delay(1000); Serial.println(«Setup Complete!»); } void loop() { // Чтение данных модуля GPS (если они доступны) и передача их // в последовательный порт. В результате эти данные будут // напечатаны в окне Arduino IDE Serial Monitor. if(gps.available()) { Serial.write(gps.read()); } // Чтение данных из окна Arduino IDE Serial Monitor (если // эти данные доступны, т. е. если их ввел пользователь) // и отправка их модулю GPS. if(Serial.available()) { gps.write(Serial.read()); } }

Программа Arduino состоит из двух основных частей. Функция void setup () содержит код конфигурирования, т. е.

здесь может быть определено, какие порты Arduino Nano работают как выходы, какие периферийные устройства должны быть настроены. Вторая часть это функция void loop (), содержащая саму программу.

Дополнительную информацию о том, как эта вся система работает, можно найти на официальном сайте Arduino (также см. [4]).

После загрузки и запуска этой простой программы на плате Arduino Nano откройте окно Serial Monitor, это делается через меню Сервис -> Монитор порта (Ctrl+Shift+M). В окне Serial Monitor Вы увидите данные, которые передает модуль GPS.

[ПО для модуля GPS]

Мы запрограммировали плату Arduino Nano и подключили с её помощью модуль GPS к компьютеру PC через порт USB. Закройте среду разработки Arduino IDE, она больше не понадобится. Плата Arduino Nano теперь работает как устройство переходника USB-UART.

Примечание: вместо платы Arduino Nano можно было использовать готовый переходник USB-TTL-UART, переключив его в режим уровней 3.3V. Такие переходники также продаются в большом разнообразии на сайте AliExpress, и стоят очень дешево.

Источник: http://microsin.net/adminstuff/hardware/simple-10-mhz-gps-frequency-standard-and-rf-generator.html

Connecting u-blox NEO-6M GPS to Arduino

I picked up a u-blox NEO-6M GPS like this:

for $28 from yourduino.com:

http://yourduino.com/sunshop2/index.php?l=product_detail&p=389

Connecting the GPS a PC First

My first step was to connect the GPS to a PC first and make sure I could get it to work. The GPS outputs TTL serial data. So I just needed to connect the GPS to an FTDI to USB cable. You can pickup such a cable here if you don’t already have one:

https://www.sparkfun.com/products/9718

My basic clues to make this happen were found here:

http://diydrones.com/profiles/blogs/tutorial-programming-your?id=705844%3ABlogPost%3A148030&page=3

The pinout for the FTDI cable is:

Interconnecting the FTDI cable to the GPS is easy:

FTDI Color        GPS Pin Black(GND)        GND Yellow(RX)        TX Orange(TX)        RX Red(VCC)         VCC

I connected the FTDI cable to my laptop and it immediately recognized the GPS as COM11. I set my terminal emulator for 9600 baud and it came right up!

There is a tiny green LED on the GPS board (at least the version I have). When it flashes green, it has locked onto the satellites.

I went to the u-blox site to get their board evaluation software:

http://www.u-blox.com/en/evaluation-tools-a-software/u-center/u-center.html

Came up fine and even told me exactly which room I was testing it in:

Connecting the GPS to an Arudino

It seems there is a library for EVERYTHING these days and that certainly is true for the GPS module. I downloaded the TinyGPSPlus library from here:

http://arduiniana.org/libraries/tinygpsplus/

I followed their instructions to install the library into the Arduino IDE. I then compiled and ran BasicExample from the GPS examples. This code doesn’t actually interface with the GPS. Instead, it really just let’s you know the GPS software library is working OK. No issues were found with this.

Next, I opened the kitcheSink example. This example wants to connect to the GPS with pin 3 of the arduino connected to the RX pin of the GPS and pin 4 of the Arduino connected to the TX pin of the GPS. You HAVE to verify the baud rate for the GPS. The software is setup to use 4800 and, at least for me, the default is 9600.

Once that was done, the software came up w/o a single hitch and started displaying GPS information:

I perused the TinyGPSPlus library and using it is very straight forward.

Connecting a GPS to your Arduino and extracting location, date, time, speed, etc. is very simple!

Источник: https://bigdanzblog.wordpress.com/2015/01/15/connecting-u-blox-neo-6m-gps-to-arduino/

How to Interface GPS Module (NEO-6m) with Arduino

What is GPS

The Global Positioning System (GPS) is a satellite-based navigation system made up of at least 24 satellites. GPS works in any weather conditions, anywhere in the world, 24 hours a day, with no subscription fees or setup charges.

How GPS works

GPS satellites circle the Earth twice a day in a precise orbit. Each satellite transmits a unique signal and orbital parameters that allow GPS devices to decode and compute the precise location of the satellite.

GPS receivers use this information and trilateration to calculate a user's exact location. Essentially, the GPS receiver measures the distance to each satellite by the amount of time it takes to receive a transmitted signal.

With distance measurements from a few more satellites, the receiver can determine a user's position and display it.

To calculate your 2-D position (latitude and longitude) and track movement, a GPS receiver must be locked on to the signal of at least 3 satellites. With 4 or more satellites in view, the receiver can determine your 3-D position (latitude, longitude and altitude). Generally, a GPS receiver will track 8 or more satellites, but that depends on the time of day and where you are on the earth.

Once your position has been determined, the GPS unit can calculate other information, such as:

What's the signal?

GPS satellites transmit at least 2 low-power radio signals. The signals travel by line of sight, meaning they will pass through clouds, glass and plastic but will not go through most solid objects, such as buildings and mountains. However, modern receivers are more sensitive and can usually track through houses.

A GPS signal contains 3 different types of information:

  • Pseudorandom code is an I.D. code that identifies which satellite is transmitting information. You can see which satellites you are getting signals from on your device's satellite page.
  • Ephemeris data is needed to determine a satellite's position and gives important information about the health of a satellite, current date and time.
  • Almanac data tells the GPS receiver where each GPS satellite should be at any time throughout the day and shows the orbital information for that satellite and every other satellite in the system.

2. Download and install required libraries for GPS to work in Arduino IDE

  • (i) SoftwareSerial library

3. NEO-6M GPS module and Arduino UNO

4. Connection of Arduino UNO and GPS module

Connect the four pins from UBLOX to an Arduino as follows:

Here, I suggest you to use external power supply to power the GPS module because minimum power requirement for GPS module to work is 3.3 V and Arduino is not capable of providing that much voltage.

To provide voltage use prolific USB TTL.

One more thing I have found while working with GPS antenna comes with module is its not receiving signal inside the house so I used this antenna — it's much better.

  • https://linxtechnologies.com/wp/product/sh-series-gps-antenna/

For connecting this antenna, you have to use connector:

5. Connection of Arduino UNO and JHD162a LCD

LCD ======= Arduino

  • RS ======= A0 (Analog pin)

Programming

Arduino IDE

#include #include #include float lat = 28.5458,lon = 77.1703; // create variable for latitude and longitude object SoftwareSerial gpsSerial(3,4);//rx,tx LiquidCrystal lcd(A0,A1,A2,A3,A4,A5); TinyGPS gps; // create gps object void setup(){ Serial.begin(9600); // connect serial //Serial.println(«The GPS Received Signal:»); gpsSerial.begin(9600); // connect gps sensor lcd.begin(16,2); } void loop(){ while(gpsSerial.available()){ // check for gps data if(gps.encode(gpsSerial.read()))// encode gps data { gps.f_get_position(&lat,&lon); // get latitude and longitude // display position lcd.clear(); lcd.setCursor(1,0); lcd.print(«GPS Signal»); //Serial.print(«Position: «); //Serial.print(«Latitude:»); //Serial.print(lat,6); //Serial.print(«;»); //Serial.print(«Longitude:»); //Serial.println(lon,6); lcd.setCursor(1,0); lcd.print(«LAT:»); lcd.setCursor(5,0); lcd.print(lat); //Serial.print(lat); //Serial.print(» «); lcd.setCursor(0,1); lcd.print(«,LON:»); lcd.setCursor(5,1); lcd.print(lon); } } String latitude = String(lat,6); String longitude = String(lon,6); Serial.println(latitude+»;»+longitude); delay(1000); }

In Visual Studio, I have made an application in which current GPS location can be find.Its only work when it is connected serially with PC or laptop.

  • GPS map application and program

If you want to make some changes in application, you can do it by opening sln file in Visual Studio (2012 and above) or you can directly install setup and use it.

Result

If anyone wants the code for GSM as well, message me.

Источник: https://create.arduino.cc/projecthub/ruchir1674/how-to-interface-gps-module-neo-6m-with-arduino-8f90ad

Собираем GPS-радар на базе STM32F3DISCOVERY и u-blox Neo-6M — «Хакер»

Содержание статьи

  • Матчасть
  • GPS
  • NMEA-0183
  • Алгоритм Брезенхема
  • Железо
  • NEO-6M
  • Программа
  • FIN

Конечно, ты можешь купить GPS-приемник в Китае за несколько долларов.

А можешь и не покупать — все равно он есть у тебя в телефоне, в навигаторе в машине… Но если ты хочешь быть настоящим хакером-инженером и разобраться в технологии GPS на низком уровне, то добро пожаловать в эту статью.

Разберемся так, что мало не покажется!

История разработки глобальной системы позиционирования (Global Positioning System, GPS) уходит корнями в 50-е годы прошлого века, а первый спутник был запущен в 1974 году.

Первоначально система использовалась лишь военными, но после трагедии с самолетом авиакомпании Korean Airlines, который был сбит над территорией СССР, гражданские службы также получили возможность работы с GPS.

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

В наши дни точность продолжает увеличиваться, а стоимость приемников — снижаться. Поэтому сделать GPS-логгер, ну или навигатор, может любой, кто родился с паяльником вместо…ладно-ладно, это шутка была. Одно другого не исключает :).

Итак, что же должно делать наше устройство?

  1. Получить информацию о текущем положении от GPS-приемника.
  2. Разобрать ее.
  3. Показать на экране текущее положение приемника, а также видимые спутники.

Для этого придется узнать, что таится за терминами GPS, NMEA-0183 и алгоритм Брезенхема.

Конечно, детально разбираться в нюансах работы GPS не требуется, поскольку всю работу по вычислению координат, скорости, курса и других параметров за нас возьмет на себя GPS-приемник. Но базу знать надо.

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

Задача спутниковой навигации заключается в определении приемником своих координат, если известны точные координаты передатчиков.

Если мы знаем расстояние до спутников, то с помощью элементарных геометрических построений можно с некоторой точностью рассчитать свои координаты.

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

Как я уже писал выше, приемнику необходимо знать точные положения передатчиков. Подобная информация предоставляется передатчиком и называется «альманах».

Естественно, эта информация устаревает, поэтому в зависимости от «свежести» альманаха можно выделить три типа задержки между включением приемника и определения его первых точных координат: «холодный старт», «теплый старт» и «горячий старт».

Существуют способы, которые позволяют уменьшить время старта: AGPS (получение альманаха альтернативными способами — через интернет или Почтой России), DGPS (исключение искажения сигнала атмосферой) и другие. Но я их рассматривать не буду, поскольку для выполнения поставленной задачи этого не нужно.

Теперь разберемся с тем, в каком же виде рассчитанные координаты появляются на выходе устройства. Для этого существует специальный стандарт.

NMEA — National Marine Electronics Association, а NMEA-0183 (согласно Википедии) — текстовый протокол связи морского (как правило, навигационного) оборудования (или оборудования, используемого в поездах) между собой. Вот строки, приходящие от моего приемника.

(…)
$GPRMC,174214.00,A,5541.23512,N,03749.12634,E,3.845,178.09,150914,,,A*6F
$GPVTG,178.09,T,,M,3.845,N,7.121,K,A*35
$GPGGA,174214.00,5541.23512,N,03749.12634,E,1,04,4.98,178.2,M,13.1,M,,*56
$GPGSA,A,3,20,14,04,17,,,,,,,,,8.85,4.98,7.31*02
$GPGSV,4,1,16,01,67,242,,02,,,15,03,,,15,04,53,284,35*74
$GPGSV,4,2,16,05,,,23,07,,,19,08,,,21,10,,,24*7F
$GPGSV,4,3,16,11,,,14,12,,,12,14,35,058,37,17,24,311,34*72
$GPGSV,4,4,16,20,40,275,29,22,08,097,,37,25,199,27,39,25,195,32*73
$GPGLL,5541.23512,N,03749.12634,E,174214.00,A,A*6D
(…)

Сначала определим похожие части каждой строки. Легко видеть, что все они начинаются одинаково и более-менее одинаково заканчиваются.

$GP — информация идет от приемника GPS (ты ведь понимаешь, что на корабле куча других датчиков: если бы у нас был аварийный маяк, то строка начиналась бы с $EP, а если эхолот, то с $SD, ну и так далее).

Каждая строка обязательно заканчивается контрольной XOR-суммой всех байтов в строке начиная от $ и заканчивая * — это как раз те два символа в конце строки. И не забываем про символы и после контрольной суммы. Разберем каждую из строк подробнее.

$GPRMC,hhmmss.ss,A,aaaa.aaaa,N,bbbb.bbbb,E,c.c,d.d,DDMMYY,z1,z2,e*ff

  • GPRMC — GPS Recommended Minimum Navigation Information sentence C — рекомендуемый минимум навигационной информации, строка типа С.
  • hhmmss.ss — время по всемирному координированному времени UTC, когда была произведена фиксация положения.
  • A — флаг достоверности информации. Если V, то информации верить нельзя.
  • aaaa.aaaaa — величина широты. Первые две цифры — градусы, вторые две — целое значение количества угловых минут, после точки — дробная часть количества угловых минут (переменной длины).
  • N — северная широта. Если S, то южная.
  • bbbb.bbbbb — величина долготы. Первые две цифры — градусы, вторые две — целое значение количества угловых минут, после точки — дробная часть количества угловых минут (переменной длины).
  • E — восточная долгота. Если W, то западная.
  • c.c — горизонтальная скорость в узлах (умножить на 1,852 для получения скорости в километрах в час), целая и дробная части имеют переменную длину.
  • d.d — направление скорости (путевой угол, курс) в градусах, целая и дробная части имеют переменную длину.
  • DDMMYY — текущая дата.
  • z1 — отсутствующая у нас величина направления магнитного склонения.
  • z2 — также отсутствующее у нас направление магнитного склонения.
  • e — индикатор режима.
  • ff — контрольная сумма.

$GPVTG,a.a,T,b.b,M,c.c,N,d.d,K,A*e

  • $GPVTG — GPS Track Made Good and Ground Speed — строка с информацией о курсе и скорости.
  • a.a — курс в градусах.
  • T — True, флаг достоверности информации.
  • b.b — направление магнитного склонения (у нас его нет).
  • M — Magnetic, да, действительно магнитное.
  • c.c — горизонтальная скорость в узлах (умножить на 1,852 для получения скорости в километрах в час).
  • N — kNots, узлы.
  • d.d — горизонтальная скорость в километрах в час (и умножать ничего не надо).
  • K — километры в час.
  • ee — контрольная сумма.

$GPGGA,hhmmss.ss,a.a,N,b.b,E,c,d,e.e,f.f,M,g.g,M,h.h,*i

  • $GPGGA — Global Positioning System Fix Data — строка с информацией о текущем местоположении.
  • hhmmss.ss — время по всемирному координированному времени UTC, когда была произведена фиксация положения.
  • a.a — величина широты.
  • N — северная широта. Если S, то южная.
  • b.b — величина долготы.
  • E — восточная долгота. Если W, то западная.
  • c — флаг качества сигнала GPS.
  • d — количество используемых спутников.
  • e.e — фактор снижения точности (DOP, Dilution of precision).
  • f.f — высота расположения приемника над уровнем моря.
  • M — высота дается в метрах.
  • g.g — различие между геоидом (истинной формой нашей планеты) и эллипсоидом по WGS84 (трехмерная система координат для позиционирования).
  • M — различие дается в метрах.
  • h.h — номер станции, передающей поправки DGPS.
  • i — контрольная сумма.

$GPGSA,A,x,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,z1,z2,z3*i

  • $GPGSA — GPS DOP and Active satellites — строка с информацией о спутниках, использованных для определения местоположения и о факторах снижения точности.
  • A — автоматический режим выбора работы в 2D или 3D, M — ручной режим, когда жестко выбран, например, 2D.
  • x — режим работы приемника: 0 — координаты не определены, 1 — режим 2D, 2 — режим 3D.
  • y1..y12 — номера спутников, используемых для определения местоположения приемника.
  • z1..z2 — PDOP, HDOP, VDOP (факторы снижения точности по положению, в горизонтальной плоскости и в вертикальной плоскости соответственно).
  • i — контрольная сумма.

$GPGSV,a,b,c1,d1,e1,f1,c2,d2,e2,f2,c3,d3,e3,f3,c4,d4,e4,f4*i

  • GPGSV — GPS Satellites in View — строка содержит в себе информацию о номере, азимуте, высоте над горизонтом и соотношением сигнал/шум спутника. В строке максимально может быть четыре спутника.
  • a — общее количество строк GPGSV.
  • b — номер текущей строки.
  • c1..c4 — номер спутника.
  • d1..d4 — высота над горизонтом в градусах (0..90).
  • e1..e4 — азимут спутника в градусах (0..359).
  • f1..f4 — соотношение сигнал/шум в дБ (0..99).

$GPGLL,5541.23512,N,03749.12634,E,174214.00,A,A*6D — на этой строке нет смысла останавливаться подробно, поскольку она содержит в себе координаты и время, а это мы уже имеем в строках GPRMC и GPGGA.

Разумеется, производителям GPS-приемников не запрещается добавлять собственные строки. У моего приемника можно при запуске увидеть такие:

$GPTXT,01,01,02,u-blox ag — www.u-blox.com*50
$GPTXT,01,01,02,HW UBX-G60xx 00040007 FF7FFFFFp*53
$GPTXT,01,01,02,ROM CORE 7.03 (45969) Mar 17 2011 16:18:34*59
$GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20
$GPTXT,01,01,02,ANTSTATUS=DONTKNOW*33
$GPTXT,01,01,02,ANTSTATUS=INIT*25
$GPTXT,01,01,02,ANTSTATUS=OK*3B

Этот алгоритм является одним из самых старых алгоритмов компьютерной графики — он был разработан Джеком Брезенхемом (IBM) аж в 1962 году. С его помощью происходит растеризация графического примитива, другими словами, этот алгоритм определяет координаты пикселей, которые необходимо зажечь на экране, чтобы полученный рисунок примитива совпадал с оригиналом.

Представим, что мы рисуем линию, идущую из точки (0; 0) в (100, 32), как ты помнишь, у нашего экрана разрешение 128 x 64 точки. Несложно посчитать, что угол между этой прямой и осью Х составляет менее 45 градусов.

Работа алгоритма заключается в последовательном переборе всех координат по оси Х в диапазоне от 0 до 100 и расчете соответствующей координаты Y. Логично, что в большинстве случаев значение координаты Y будет дробным, а это значит, что надо каким-то образом выбрать целочисленное значение координаты. Это делается путем выбора ближайшего пикселя.

Для других углов наклона прямой, а также для окружностей, эллипсов и прочего алгоритм имеет аналогичный вид (подробнее о нем можно почитать в Википедии).

Алгоритм Брезенхема использует только операции сложения и вычитания целых чисел: обычно использование арифметики дробных чисел замедляет работу контроллера. Обычно, но не в нашем случае, поскольку внутри контроллера STM32F303VC находится ядро ARM Cortex-M4 с FPU.

FPU (Floating Point Unit) — устройство, ускоряющее работу с дробными числами (математический сопроцессор), поэтому нас ничто не ограничивает и мы можем использовать алгоритм DDA-линии.

Интересную демонстрацию ускорения работы МК при рисовании фракталов можно посмотреть на YouTube.

Что же мы используем в проекте?

  • Отладочную плату STM32F3-Discovery;
  • модуль UART GPS NEO-6M от WaveShare на базе приемника u-blox NEO-6M;
  • ЖК-матрицу МТ-12864А.

Про ЖК-экран я рассказывал в сентябрьском номере (№ 188), кратко лишь скажу, что сделан он на базе контроллеров KS0108, а схема подключения к STM32F3-Discovery не изменилась: разъем для подключения экрана содержит в себе 20 пинов, описание представлено в списке по следующей маске: — — — .

  • 1 — Ucc — питание — к 5V на Discovery.
  • 2 — GND — земля — к GND на Discovery.
  • 3 — Uo — вход питания ЖК-панели для управления контрастностью — к подстроечному резистору.
  • 4..11 — DB0..DB7 — шина данных — к PD0..PD7 на Discovery.
  • 12, 13 — E1, E2 — выбор контроллера — к PD8,PD9 на Discovery.
  • 14 — RES — сброс — к PD10 на Discovery.
  • 15 — R/W — выбор: чтение/запись — к PD11 на Discovery.
  • 16 — A0 — выбор: команда/данные — к PD12 на Discovery.
  • 17 — E — стробирование данных — к PD13 на Discovery.
  • 18 — Uee — выход DC-DC преобразователя — к подстроечному резистору.

Данный приемник производится швейцарской компанией u-blox, основанной в 1997 году.

Линейка модулей Neo-6 представлена разновидностями G, Q, M, P, V и T, каждый из которых обладает своими характерными возможностями: например, Neo-6P имеет возможность очень точного (с ошибкой PDOP = atof(charTokens[15]);
fixInfo->HDOP = atof(charTokens[16]);
fixInfo->VDOP = atof(charTokens[17]);

Теперь можно разобранную информацию смело выводить на экран (рис. 3).

Источник: https://xakep.ru/2015/01/23/gps-radar-diy/

Ссылка на основную публикацию