Содержание
Здравствуйте. В этой статье я расскажу Вам о своем опыте подключения к Arduino GPS-модуля, о том с какими проблемами я при этом столкнулся и как эти проблемы были решены.
GPS-модуль интересен не только тем, что определяет координаты, высоту над уровнем моря, время по Гринвичу, ряд других географических параметров Вашего местоположения. Когда у меня получилось установить связь с модулем, я был рад, в первую очередь тому, что установил связь с космосом. Спутники GPS движутся по геостационарной орбите – а это катастрофически высоко – почти 36 000 км.
Итак, у меня есть GPS-модуль GY- neo6mv2. Существует библиотека для работы с этим модулем, прямая ссылка на библиотеку есть в конце статьи. Ставлю библиотеку, открываю стандартный скетч для тестирования модуля, который шел в комплекте с библиотекой. Логично предположить, что он готов к работе. Подключаю свой GPS-модуль к Arduino по рекомендуемой схеме.
Загружаю скетч в контроллер, смотрю на результат. Видно, что монитор последовательного порта предлагает к прочтению бессвязный набор символов.
Редактирую стандартный скетч. Выставляю в коде скетча скорость интерфейса Arduino с ПК 9600 бод. Пробую снова. Теперь набор символов осмысленный, но не видно данных с самого модуля.
Снова редактирую скетч. Теперь выставляю скорость интерфейса модуля с контроллером – тоже 9600 бод. После нового компилирования и загрузки видно, что данные с модуля всё-таки начали поступать.
Полученной связью как-то нужно воспользоваться. Подключим дисплей, и выведем на него значение координат своей локации.
В этот же стандартный скетч в четырех местах вставляю дополнительный код, для инициализации дисплея и вывода на дисплей нужных данных.
Когда я искал информацию по этому устройству, нашел несколько роликов, где автор залил в контроллер неработающий стандартный скетч, увидел в мониторе звездочки, и на этом, почему – то, успокоился. Я постарался построить изложение так, чтобы этого было достаточно для успешного запуска модуля.
В этой статье я расскажу про подключение GPS приемника к микроконтроллеру, на примере модуля u-blox GY-NEO6MV2. Приемник представляет из себя небольшую плату на которой расположены модуль NEO-6M-0-001, стабилизатор напряжения 3.3В, EEPROM память, аккумулятор и светодиод. Модуль продается вместе с активной антенной квадратной формы. Как и все GPS приемники, для передачи данных, модуль использует широко распространенный интерфейс UART, что облегчает его сопряжение с микроконтроллером.
Связь с GPS приемниками осуществляется по протоколу NMEA 0183, это текстовый стандарт связи, использующийся в морском (навигационном) оборудовании. Протокол NMEA 0183 включает в себя множество различных сообщений и команд, я рассмотрю несколько основных сообщений, связанных с глобальной системой позиционирования.
Модуль можно приобрести здесь , есть более дешевый вариант собранный на красной плате с маленькой антенной, можно заказать тут .
По стандарту NMEA все сообщения начинаются с символа “$” и заканчиваются спецсимволами – возврат каретки (шестнадцатеричное значение 0x0D) и – перевод строки (шестнадцатеричное значение 0x0A). Первые два символа после “$” являются идентификатором системы, следующие три символа – идентификатор сообщения, например $GPZDA, где GP – глобальная система позиционирования, ZDA – означает, что сообщение содержит информацию о дате по UTC и локальный часовой пояс. После идентификатора сообщения следуют поля, содержащие значения параметров, в конце сообщения после символа “*” находится контрольная сумма. Поля разделяются запятыми, некоторые значения в полях могут отсутствовать, при этом запятые в сообщении не удаляются.
Для того чтобы увидеть сообщения которые выдает GPS модуль, я подключил его к компьютеру через USB-UART преобразователь на чипе PL2303. Для подключения использовал только один вывод на GPS модуле, выход передатчика TX, так как отправлять команды на модуль я не буду, только принимать сообщения. В качестве терминальной программы использовал Terminal v1.9b by Bray. По умолчанию модуль настроен на скорость 9600 бит/сек, в программе необходимо установить следующие настройки: 8 бит данных, без проверки четности, один стоповый бит, управление потоком отключаем.
Ниже приведен скриншот окна программы с сообщениями, полученными от GPS модуля.
В зависимости от количества видимых спутников, данный модуль выдает от 6 до 8 сообщений, которые обновляются каждую секунду (стандартное время для большинства приемников). При достаточном количестве спутников и устойчивом сигнале на модуле начинает мигать светодиод.
Информация о координатах местоположения, времени и скорости в разных сообщениях могут дублироваться. Рассмотрим назначение полей каждого сообщения:
RMC – минимальная рекомендуемая навигационная информация, содержит информацию о времени, дате, координатах местоположения, скорости и направлении курса.
$GPRMC,170840.00,A,5509.68339,N,06125.49498,E,0.204,,311015. A*7D | |
170840.00 | Время UTC: 17ч. 08м. 40.00 сек. |
A | Статус достоверности: A – достоверные данные, V – недостоверные данные |
5509.68339 | Широта: 55 градусов, 09.68339 минут |
N | N – северная, S – южная |
06125.49498 | Долгота: 061 градусов, 25.49498 минут |
E | E – восточная, W – западная |
0.204 | Горизонтальная скорость (узлов в час) |
– | Направление курса относительно истинного севера (градусы) |
311015 | Дата: 31 октября 2015 года |
– | Магнитное склонение (градусы) |
– | Направление склонения: E – восточное, W – западное |
A | Режим: A – автономный, D – дифференциальный, E – аппроксимация, N – недостоверные данные |
*7D | Контрольная сумма |
VTG – текущее направление курса и скорость относительно Земли.
$GPVTG,,T,,M,0.204,N,0.378,K,A*29 | |
– | Направление курса (градусы) |
T | Курс относительно истинного севера |
– | Направление курса (градусы) |
M | Курс относительно магнитного севера |
0.204 | Горизонтальная скорость |
N | Единица измерения скорости (узлов в час) |
0.378 | Горизонтальная скорость |
K | Единица измерения скорости (километров в час) |
A | Неизвестный параметр |
*29 | Контрольная сумма |
GGA – зафиксированные данные глобальной системы позиционирования, содержит информацию о времени, координатах местоположения, высоте, статусе определения координат, количестве использованных спутников.
$GPGGA,170840.00,5509.68339,N,06125.49498,E,1,07,2.41,186.2,M,-13.5,M,,*77 | |
170840.00 | Время UTC: 17ч. 08м. 40.00 сек. |
5509.68339 | Широта: 55 градусов, 09.68339 минут |
N | N – северная, S – южная |
06125.49498 | Долгота: 061 градусов, 25.49498 минут |
E | E – восточная, W – западная |
1 | Статус определения координат: 0 – позиция не определена, 1 – позиция определена, 2- позиция определена с повышенной точностью (DGPS) |
07 | Количество использованных спутников |
2.41 | Снижение точности в горизонтальной плоскости (HDOP) |
186.2 | Высота над уровнем моря |
M | Единица измерения высоты (метры) |
-13.5 | Геоидальное различие — различие между земным эллипсоидом WGS-84 и уровнем моря (геоидом) |
M | Единица измерения геоидального различия (метры) |
– | Время с момента последнего обновления DGPS (секунды), 0 – DGPS не используется |
*77 | Контрольная сумма |
GSA – Уровень точности определения координат и активные спутники, содержит информацию о режиме работы, спутниках, снижении точности в различных плоскостях.
$GPGSA,A,3,06,29,23,26,02,09,31. 3.48,2.41,2.51*0D | |
A | Режим 1: М – ручной 2D или 3D, A – автоматический 2D-разрешено переключение 2D/3D |
3 | Режим 2: 1 – позиция не определена, 2 – 2D позиция определена, высота не определена, 3 – 3D позиция и высота определена |
06 | Идентификатор 1-го спутника использованного для определения координат |
29 | Идентификатор 2-го спутника использованного для определения координат |
…… | |
– | Идентификатор 12-го спутника использованного для определения координат |
3.48 | Снижение точности по местоположению (PDOP) |
2.41 | Снижение точности в горизонтальной плоскости (HDOP) |
2.51 | Снижение точности в вертикальной плоскости (VDOP) |
*0D | Контрольная сумма |
GSV – Информация о видимых спутниках, содержит число видимых спутников, их идентификаторы, высота, азимут, уровень сигнала.
$GPGSV,3,1,11,02,13,325,27,03,34,182,17,06,19,287,23,07,15,237,15*70 | |
3 | Количество сообщений GSV, (от 1 до 3), зависит от количества видимых спутников |
1 | Порядковый номер сообщения, (от 1 до 3) |
11 | Количество видимых спутников |
02 | Идентификатор спутника |
13 | Высота спутника (градусы) |
325 | Азимут спутника (градусы) |
27 | Уровень сигнала, отношение сигнал/шум от 00 до 99 дБ, 0 – нет сигнала. |
03,34,182,17 | То же самое для 2-го спутника |
06,19,287,23 | То же самое для 3-го спутника |
07,15,237,15 | То же самое для 4-го спутника |
*70 | Контрольная сумма |
GLL – географическая позиция – широта/долгота, содержит информацию о времени, координатах местоположения.
$GPGLL,5509.68339,N,06125.49498,E,170840.00,A,A*65 | |
5509.68339 | Широта: 55 градусов, 09.68339 минут |
N | N – северная, S – южная |
06125.49498 | Долгота: 061 градусов, 25.49498 минут |
E | E – восточная, W – западная |
170840.00 | Время UTC: 17ч. 08м. 40.00 сек. |
A | Статус достоверности: A – достоверные данные, V – недостоверные данные |
*65 | Контрольная сумма |
Теперь рассмотрим подключение GPS модуля к микроконтроллеру, для вывода информации я решил использовать LCD дисплей Nokia 5110, так как буду выводить значительное количество символов. Ниже приведена схема подключения:
Микроконтроллер PIC16F628A и LCD дисплей питаются напряжением 3,3В, для того чтобы избежать согласования уровней между линиями ввода/вывода дисплея и микроконтроллера. Чтение сообщений с GPS приемника осуществляется встроенным в микроконтроллер модулем USART. Светодиод HL1 служит индикатором приема и мигает при получении сообщения GPRMC.
- Цена: $10.00
- Перейти в магазин
Данная плата содержит на себе GPS-модуль NEO-6M от u-blox и была приобретена пару месяцев назад с целью создания GPS-логгера своими руками.
В статье описывается «комплект» с модулем, программа u-center, немного USB-to-TTL-адаптер CH340G, а также проводится срвнение записи трека.
В «комплект» входит: сам модуль u-blox NEO-6M, стабилизатор напряжения (чтоб можно было питат от 5В) и активная керамическая антенна. ИМХО, реальная цена раза в два ниже, поскольку есть более дешевый конкурент — VK172 ($8.58) — с поддержкой ГЛОНАСС и USB-интерфейсом — $8.58, например. Может, и в нём есть UART, но его я в руках не держал.
Антенна телепается на тонком на экранированном кабеле длинной 2.5 см. Сильно телепать ею не стоит: за два дня телепаний у меня нарушился контакт экрана кабеля с землей антенны — и спутники перестали ловиться. Пришлось её разбирать и восстанавливать контакт экрана. Разбирается активная антенна при помощи паяльника ватт на 40-60, снимаем припой лёгкими прикосновениями к краям металлической крышки, одновременно подковыривая её:
(фото сделано через пару месяцев, взято из из этого обзора).
Практика показала, что, несмотря на металлическую пластину с обратной стороны, положение антенны в пространстве на точность определения позиции слабо влияет. Близкое расположение домов, и низкая скорость, как мне показалось, сильнее снижает точность. Если стоять на одном месте, начинают появляться точки на 5-30 метров от реальной позиции.
В описании сказано.
А ничего там не сказано, продавец снимает с себя всю ответственность =)
Модуль NEO-6M питается от напряжения 3.3В, он может выйти из строя при подключении к большему напряжению или некорректно работать при меньшем, но здесь имеется стабилизатор — и питать можно от 5В. Также, есть энергонезависимая память и батарейка:
Светодиод — зелёный, по умолчанию «мигает при 3D-виксации», настроить его поведение можно из приложения u-ctnter.
Пробовал подключать к 3.3В — вместо нужных данных, выдает текстовые сообщения с какой-то информацией, думаю, мощности не хватает. Вывод контактов J1 состоит из:
GND — минуса питания,
TX — линии передачи данных (от модуля),
RX — линии приёма данных (модулем),
VCC — плюса питания (5В).
Из всех особенностей UART для взаимодействия с данным модулем нужно знать только одну — скорость работы, у меня она установлена в 9600 бод. Из коробки пакетика, модуль, когда поймает, выдает такую информацию:
Это — текстовые сообщения протокола NMEA, подробнее о них можно почитать в Википедии, они могут немного отличаться от задокументированных.
По сути, этот модуль — микроконтроллер, который анализирует данные со спутников и производит действия, заданные в его настройках — не только выводит текущее положение… Есть подозрение, что он может вести объект по заданному маршруту (по треку, сохранённому в его памяти). Такие модули используют любители квадрокоптеров, они должны знать о нём больше.
CH340
Подключить GPS-модуль к компьютеру (или планшету) через USB можно с помощью USB to TTL модуля CH340 ($0.60) — это переходник USB-UART с возможностью выбора напряжения питания: 3.3 или 5В.
С верхней стороны, имеются три светодиода: питания — красный и два одинаковых синих, мигающих в унисон передаче или приёма данных… Так как цвета светодидов одинаковы, отличить передачу от приёма можно, разве что, выучив их расположение =)
С торца имеются следующие контакты:
первые три контакта — вывод плюса питания: ненужный соединяется с VCC, нужный — со входом питания устройства;
TXD — линия передачи данных (от компьютера к внешнему устройству);
RXD — линия приёма данных (от устройства);
GND — минус питания.
Таким образом, для подключения GPS-модуля к компьютеру, нужно соединить: RX с TXD; TX с RXD; GND с GND; VCC с 5V,
затем вставить USB в компьютер. После подключения к компьютеру и установки драйверов (кажется, сами ставятся), появляется виртуальный COM-порт, при подключении к новому USB-порту, создается еще один COM-порт…
После установки драйверов запускаем программу, указываем скорость обмена данными и выбираем в нужный COM-порт:
Показано на примере программы разработчика GPS-модуля, но в любой другой программе работы с COM-портом, будет то же самое. Если после сопряжения устройств ожидаемых данных не появляется (в терминале), то можно попробовать изменить скорость порта: вдруг мы забыли ее правильно вставить.
После работы — сначала в программе отключиться от пота, затем выдернуть USB; имхо, так более безопасно. Если ошибаюсь, — поправьте; также, могу слишком подробно описывать очевидные вещи, но я хотел бы изъясняться максимально понятно для минимально осведомлённого читателя.
Этим же модулем можно «прошивать» и популярный микроконтроллер Arduino.
Вообще-то, можно было на один из компьютерных COM-портов или на LPT-порт резисторов напаять и не покупать модуль… Но его еще можно к планшету с OTG подключать! Кстати, не всякая программа поддерживает данный адаптер; я успешно мониторил порт пргграммой UsbTerminal,
если скорость низкая (выбранного бодрейта недостаточно для объемов передачи данных), плохой контакт или неправильно настроены биты чётности, то будут теряться части строк;
если же бодрейт на двух устройствах не одинаков, то будут выводиться либо «крякозябрики», либо вообще не будет виден никакой вывод…
u-center
Разработчик модуля предоставляет специализированную программу для работы с ним, скачать её и другие программы можно бесплатно с официального сайта — www.u-blox.com/en/evaluation-software-and-tools — однако, их использование требует не только понимания английского, но и знания предметной области.
Посмотреть на передающиеся данные, можно открыв одну из консолей, или все вместе:
через меню, иконку или нажав соответствующий хоткей.
Настройки сообщений, GPS-модуля находятся в окне View -> Messages, иконкой или по F9:
Когда приходит то или иное сообщение, подсвечивается соответствующая ветка, из меню этого дерева можно отключать или подключать ненужные сообщения. Стоит отметить, что интерфейс программы рассчитан на множество разных модулей и некоторые функции не будут работать с нашим, например, даже если мы разрешим сообщения GLRMC, они не будут приходить, так как модуль не поддерживает ГЛОНАСС. Особо продвинутые отключают все NMEA-, подключают нужные UBX-сообщения — и экономят на этом гигабиты трафика и километры строк кода!
Кстати, у автора видео такой же модуль. Как видно из того же видео, можно настроить скорость работы GPS-модуля из окна
UBX -> CFG -> PRT:
А из UBX -> CFG -> RATE, путем подбора Measurement Period выставляется значение Navigation Frequency — на сколько я понял, это частота, с которой данные приходят в порт, если выставить 0.5 Гц, то порция данных будет отправляться нам по порту раз в две секунды.
Если нужно сохранить текущую конфигурацию устройства, выбираем из меню Receiver -> Action -> Save Config, после чего можно проверить, сохранилась ли конфигурация, отключив его (USB) и подключив обратно.
Там имеется еще много всякоразных настроек, как то частота кварцевого резонатора или энергосбережение; я еще не разбираюсь в них на столько, чтобы кому-то рассказывать. К сожалению, на русском я не нашел подробного описания настроек, применимого к реальным задачам. Но для их понимания можно прочесть документацию и подумать, как ими пользоваться.
Тест в реальных условиях
Подключив данный GPS-модуль и MicroSD-карту к Arduino Promini, я собрал GPS-логгер:
Положил его в сумку вместе с планшетом Asus MemoPad 7, запустил запись трека и прокатился на велике по району, по пути выехал к огородом, где нет домов, затем вернулся обратно, сделав круг и заехал в пару дворов.
Белым пунктиром отмечен путь, который не зафиксировал ни модуль, ни планшет; синяя линия — планшет, красная — модуль.
Постояв минуты три, мне надоело ждать, когда GPS на планшете стартанёт — и я поехал в огороды, вернувшись обратно, достал планшет, посмотрел, как там дела — и трек на нём начал записываться с этого места.
Оцениваю работу данного модуля по записи велотрека как достойную замену телефонного, главным образом, потому что он стартует быстрее; однако его поведение при стационарном положении меня немного пугает. Трек с него был получен путем конвертирования упомянутых выше NMEA-сообщений в GPX-файл посредством команды:
-x discard,hdop=1.2 — фильтр по hdop, теоретически, чем меньше величина — тем больше менее достоверных точек удаляется из трека; практически же, если поставить в 1, — удалятся все позиции.
За время поездки (20 минут), аккумулятор пятилетней давности BL-5CP (телефона Nokia 1616), от которого питается микроконтроллер, записывающий лог, разрядился с 4.10 до 3.97В. Ток GPS-модуля при старте, если верить дешёвому мультиметру DT832, составляет 70мА.