Получение и вывод GPS координат на Arduino. Создаем GPS часы на Arduino

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

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

U-Center

Программа u-center используется для работы с GNSS-проемниками от фирмы U-Blox. С помощью этого программного обеспечения можно тестировать точность позиционирования, изменять конфигурацию ресивера и проводить общую диагностику, обрабатывать полученные данные и отображать их в режиме реального времени. Координаты приемник получает с помощью GPS, ГЛОНАСС. Полученную информацию можно экспортировать и показывать в картах Google Maps, Google Earth. Программа позволяет создавать двухмерные диаграммы, гистограммы и другие виды графиков. u-center можно использовать при работе с несколькими приемниками.

Возможности программного обеспечения U-Center:

  • Работа с Windows;
  • Чтение NMEA , SiRF данных, UBX;
  • Вывод полученных данных в виде текста и графиков;
  • Запись данных, и воспроизведение;
  • Полное управление модулем GPS;
  • Возможность изменения конфигурации GPS-модуля;
  • Запись новой конфигурации в модуль;
  • Запись конфигурации в файл формата.txt;
  • Обновление прошивки модуля;
  • Возможность холодного, теплого и горячего старта модуля.

Программа позволяет оценивать работоспособность приемника, анализировать его быстродействие и устанавливать его настройки. Помимо U-Center могут использоваться и другие программы, например, Visual GPS, Time Tools GPS Clock и другие.

Visual GPS

Эта программа используется для отображения GPS данных по протоколу NMEA 0183 в графическом виде. Программа позволяет записывать лог GPS данных в файл. Существует два режима работы в программе – в первом Visual GPS связывается с приемником GPS, а во втором Visual GPS считывает показания NMEA из файла. Программа имеет 4 основных окна – Signal Quality (качество сигнала), Navigation (навигация), Survey (исследование), Azimuth and Elevation (азимут и высота).

Time Tools GPS Clock

Эта программа работает на Windows и любых рабочих станциях, она проверяет время со стандартного приемника времени NMEA GPS, который подключен к компьютеру, и позволяет синхронизировать время на ПК. Отображается информация о времени, дате, состоянии GPS, полученная от приемника. Недостатком программы является невозможность высокоточного определения времени, так как GPS-устройства не имеют секундного импульса для последовательного порта компьютера.

GPS TrimbleStudio

Программное обеспечение используется для работы с приемником Copernicus в Windows. Программа отображает принимаемые навигационные данные. Полученные координаты можно отобрать на картах Google Maps, Microsoft Visual Earth. Все установленные настройки приемника можно сохранить в конфигурационном файле

Fugawi

Программа используется для планирования маршрута, GPS навигации в реальном времени. Программа позволяет записывать и сохранять маршруты и путевые точки на картах. Навигация производится как на суше, так и на воде и в воздухе. В программе используются различные виды цифровых карт – топографические карты, стандарты NOAA RNC, отсканированные копии бумажных карт, Fugawi Street Maps.

3D World Map

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

Обзор GPS-модулей для Ардуино

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

Модуль EM-411. Устройство создано на базе высокопроизводительного чипа SiRF Star III, который обладает низким потреблением энергии. Модуль имеет большой объем памяти для сохранения данных альманаха, поддерживает стандартный протокол NMEA 0183. Время холодного старта составляет около 45 секунд.

VK2828U7G5LF. Этот модуль построен на базе чипа Ublox UBX-G7020-KT. С его помощью можно получать координаты по GPS и ГЛОНАСС. В приемнике имеется встроенная память, в которую можно сохранять настройки. Модуль оснащен встроенной керамической антенной, работает по протоколу NMEA 0183. Напряжение питания модуля 3,3-5В.

SKM53 GPS. Один из самых дешевых модулей, обладающий низким потреблением тока. Время холодного запуска примерно 36 секунд, горячего – 1 секунда. Для позиционирования используются 66 каналов, для слежения 22 канала. В модуле имеется встроенная GPS антенна, устройство обеспечивает высокую производительность навигации при различных условиях видимости.

Neo-6M GPS. Приемник производится компанией u-blox. В этом модуле используются новейшие технологии для получения точной информации о местоположении. Напряжение питания модуля 3-5В. Линейка устройств представлена типами G, Q, M, P, V и T со своими уникальными характеристиками. Время холодного старта около 27 секунд.

locosys 1513. Этот модуль поддерживает работу с GPS, ГЛОНАСС, Galileo, QZSS, SBAS. Базируется на чипе MediaTek MT333, который обладает низким энергопотреблением, высокой чувствительностью и стабильной работой в различных условиях. В приемнике имеется поддержка текстового протокола управления. Время холодного старта примерно 38 секунд.

Arduino GPS модуль GY-NEO6MV2

Модуль использует стандартный протокол NMEA 0183 для связи с GPS приемниками. Приемник представляет собой плату, на которой располагаются модуль NEO-6M-0-001, стабилизатор напряжения, энергонезависимая память, светодиод и аккумулятор.

Технические характеристики модуля:

  • Напряжение питания 3,3-5В;
  • Интерфейс UART 9600 8N1 3.3V;
  • Протокол NMEA;
  • Вес модуля 18 гр.;
  • Наличие EEPROM для сохранения настроек;
  • Наличие встроенной батареи;
  • Возможность подключения антенны к разъему U-FL;
  • Время холодного старта примерно 27 секунд, время горячего старта – 1 секунда;
  • Наличие более 50 каналов позиционирования;
  • Частота обновления 5 Гц;
  • Рабочие температуры от -40С до 85С.

Модуль широко используется для коптеров, определения текущего положения малоподвижных объектов и транспортных средств. Полученные координаты можно загрузить в карты Google Maps, Google Earth и другие.

После холодного старта модуля начинается скачивание альманаха. Время загрузки – не более 15 минут, в зависимости от условий и количество спутников в зоне видимости.

Распиновка: GND (земля), RX (вход для данных UART), TX (выход для данных UART), Vcc – питание от 3,3В до 5 В.

Для подключения потребуются модуль GY-NEO6MV2, плата Ардуино, провода, антенна GPS. Соединение контактов: VCC к 5V, GND к GND, RX к 9 пину на Ардуино, TX к 10 пину. Затем Ардуино нужно подключить к компьютеру через USB.

Для работы потребуется подключить несколько библиотек. SoftwareSerial – требуется для расширения аппаратных функций устройства и обработки задачи последовательной связи. Библиотека TinyGPS используется для преобразования сообщений NMEA в удобный для чтения формат.

Проверка работы через программу U-Center

Как упоминалось выше, модуль производится компанией u-blox, поэтому для настройки приемника используется программа U-Center.

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

Чтобы настроить модуль, нужно подключить его через USB-UART(COM-UART) преобразователь. Настроить подключение можно с помощью меню Receiver-Port . Как только будет установлено соединение, загорится зеленый индикатор. Приемник начнет устанавливать соединения со спутниками, после чего на экране появятся текущие координаты, время и другая информация. Все сообщения появляются в окне Messages. В меню View – Messages можно выбрать сообщения, которые будут передаваться к микроконтроллеру. В зависимости от поставленной задачи, можно уменьшить количество отправляемых сообщений, что увеличит скорость обработки данных и облегчит алгоритм разбора сообщений контроллером.

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

Посмотреть передающиеся данные можно через меню View.

Все сообщения начинаются символом $, следующие за ним символы – идентификаторы сообщения. GP- это глобальная система, следующие 3 буквы показывают, какая информация содержится.

RMC – наименьшая навигационная информация (время, дата, координаты, скорость, направление).

GGA – зафиксированная информация позиционирования. Записаны время, координаты, высота, статус определения местоположения, количество спутников.

Проверка работы через Arduino IDE

Работать с модулем можно также через стандартную среду разработки Arduino IDE. После подключения модуля к плате, нужно загрузить скетч и посмотреть на результат. Если на мониторе появится бессвязный набор знаков, нужно отрегулировать скорость интерфейса Ардуино с компьютером и скорость интерфейса модуля с контроллером.

Скетч для вывода данных о местоположении.

#include #include //подключение необходимых для работы библиотек TinyGPS gps; SoftwareSerial gpsSerial(8, 9); //номера пинов, к которым подключен модуль (RX, TX) bool newdata = false; unsigned long start; long lat, lon; unsigned long time, date; void setup(){ gpsSerial.begin(9600); // установка скорости обмена с приемником 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; }

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

В мониторе порта появятся данные широты и долготы. Также будет получено значение текущей даты и времени по Гринвичу. Установить свой часовой пояс можно вручную – это делается в строке Serial.print(static_cast(hour+8));

Заключение

Как видим, для начал работы с GPS не требуется каких-то совсем уж сложных манипуляций. На помощь приходят готовые модули или шилды, взаимодействующие с Arduino через UART. Для облегчения написания скетчей можно использовать готовые библиотеки. Кроме того, любой GPS-модуль можно протестировать без Ардуино, подключив к компьютеру и воспользовавшись специальным софтом. Обзор наиболее популярных программ мы привели в этой статье.

Однажды у меня возник интерес к GPS, а еще чуть раньше - к платформе Arduino. Поэтому со Sparkfun были заказаны, с разницей в пару дней, Arduino Duemilanove, GPS Shield и GPS приемник EM-406A .
Заказ пришел и частично лежал на полке, а недавно дошли руки до этого комплекта…

Собранный GPS Shield, подключенный к Arduino

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

  • Arduino Duemilanove
  • GPS Shield
  • GPS приемник EM-406A
  • LCD WH-0802A
Для большей мобильности платформа запитана от отдельного аккумулятора и подключается к компьютеру только для заливки нового скетча.
Распиновка GPS модуля EM-406A

При наличии щилда распиновка, по большому счету, не так важна - нужно просто вставить два разъема. Если щилд отсутствует, то нужно подключить выводы GND к GND, Rx - к digital pin 2, Tx - к digital pin 3, VCC - к POWER 5V. Внимание, серый провод не 1, а 6й!

На GPS модуле имеется светодиодный индикатор состояния:

  • индикатор горит постоянно - идет поиск спутников и определение координат
  • индикатор моргает - координаты установлены, идет их передача
  • индикатор не горит, питание на шилд подано - плохой контакт в разъемах или модуль переключился в бинарный SiRF протокол
Переключатель UART/DLINE


С помощью переключателя можно подключить Rx и Tx GPS модуля к ногам Tx и Rx Arduino (позиция UART) или к pin digital 2 и digital 3 (позиция DLINE, если не снимать перемычки из припоя). Нужно убедиться, что переключатель находится в положении «DLINE», иначе возможны проблемы с заливкой скетчей в Arduino.
Подключение знакосинтезирующего ЖК индикатора
Я не покупал отдельный shield под экран и подключал уже имеющийся индикатор - WH-0802A в 4х битном режиме. В принципе, так можно подключить любой другой знакосинтезирующий индикатор. Для этого нужно найти в даташите распиновку разъема и подключить линии RS, E, D4, D5, D6, D7 к любым цифровым pin"ам (кроме 0…3) и не забыть сконфигурировать куда подключены эти линии в коде, Vss, R/W - к GND, Vdd - к 5V. Вывод Vo (настройка контрастности) нужно подключить к потенциометру, включенному между GND и 5V, но я просто подключил к GND - полученная контрастность меня устроила.
Назначение выводов индикатора WH-0802A
Мой вариант подключения индикатора к Arduino
  • RS - pin 13
  • E - pin 12
  • D4 - pin 11
  • D5 - pin 10
  • D6 - pin 9
  • D7 - pin 8
  • Vss, R/W, Vo - GND
  • Vdd - 5V

Программная часть

Для работы с GPS потребуются две библиотеки TinyGPS и NewSoftSerial . Библиотеки распаковываются в каталог libraries.
#include
#include
#include
TinyGPS gps;
//Tx, Rx
NewSoftSerial nss(2, 3);
//Конфигурация линий, куда подключен lcd: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
bool feedgps();
void setup() {
//4800 скорость обмена с GPS приемником
nss.begin(4800);
//8 символов, 2 строки
lcd.begin(8, 2);
lcd.print("waiting" );
}
void loop() {
bool newdata = false ;
unsigned long start = millis();
long lat, lon;
unsigned long age;
//задержка в секунду между обновлениями координат
while (millis() - start < 1000) {
if (readgps())
newdata = true ;
}
if (newdata) {
gps.get_position(&lat, &lon, &age);
lcd.setCursor(0, 0);
lcd.print(lat);
lcd.setCursor(0, 1);
lcd.print(lon);
}
}
bool readgps() {
while (nss.available()) {
int b = nss.read();
//в TinyGPS есть баг, когда не обрабатываются данные с \r и \n
if ("\r" != b) {
if (gps.encode(b))
return true ;
}
}
return false ;
}


После включения GPS модуля и заливки скетча нужно подождать как минимум 42 секунды (время холодного старта) для того чтобы модуль определил свое местоположение и начал выдавать валидные координаты. Когда модуль перейдет в рабочий режим он начнет моргать светодиодом. У меня на рабочем столе модуль не всегда может найти спутники - приходится переносить его на окно.
Работающий модуль с подключенным дисплеем и полученными координатами


Справа к дисплею подключён источник питания для подсветки.
После определения спутников на дисплее появляются координаты и обновляются раз в секунду.
В итоге получен опыт работы и база для дальнейшего освоения GPS.

На нашем портале уже неоднократно рассказывалось о самоделках на Ардуино, сделал свою - делюсь результатами и опытом с публикой.

В статье описывается начало работы с Arduino Pro mini и небольшая критика Orange Pi PC, в силу моей криворукости.

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

Предыстория

Катаюсь на велике: иногда на работу, иногда за компанию, иногда просто так: бегать суставы «уже не те». В процессе работы механизмы изнашиваются и для своевременного обслуживания желательно как-то журналировать свои покатушки, а, т.к. велокомпьютера у меня не было, я либо записывал трек на телефон, либо после покатушки строил маршрут по памяти на ЯндексКартах (спасибо разработчиком за удобный инструмент «Линейка») и записывал пройденное расстояние в Эксель-таблиицу:
Дата | Название | Дистанция
Потом суммировал Дистанцию и принимал решение, когда надо цепь помыть (или по кругу поменять), когда на техосмотр отдать и т.п. Оказалось, иметь базу данных своих покатушек довольно-таки полезно: самому посмотреть, сколько за прошлый месяц проехал, чтобы в текущем проехать не меньше; друзьям показать, где был; скоростью на отрезке похвастаться… Или, если задержат, как подозрительного типа без документов, хотя бы показать, откуда приехал =)

Телефон мой (Samsung Galaxy Gio) строил нормальные GPS-графики, но всё больше заставляло понервничать время старта, а однажды он стартовал аж через 12 км. Покупать новый чё-то как-то не сложилось: сразу не купил ZenFone4 , а потом не охота стало: старый пока пашет, а новые или недостаточно производительны, или чрезмерно громоздки.

И закралась у меня тогда идея найти специализированное устройство (с антеннкой!) для записи GPS-треков: чтобы и стоило немного, и стартовало быстрее , и определяло позицию более точно. Но, опять же, особого желания что-то мудрить не было… Особенно вымораживает, выйдя из подъезда, стоять и ждать старта GPS!

Прошлой осенью появилась тема - Orange Pi PC! Самая дешевая плата для создания самоделок и изучения робототехники(?!) и еще чего-то, по чему мы в университете сдали лабы и успешно забыли. Кстати, в институте мне преподавали счетчики, компараторы, триггеры, учили проектировать системы с их применением, а также принципы построения микроконтроллеров, их работы и применения, но вероятно, после сессии полученные знания форматировались и воспроизвести я их смогу, разве что, под гипнозом, хоть и закончил с Красным дипломом и сам сдавал все сессии =)
В надежде, что если на Orange Pi PC помигать светодиодами и все-таки реализовать заветный GPS-логгер не удастся, то я смогу хотя бы поднять сервер, ночью качать на него торренты и днём писать какие-нибуть проекты, Чтоб работало постоянно и потребляло немного… Потребляло оно, действительно, не много - порядка 500 мА на 5В с воткнутой USB-флешкой.

К Orange Pi PC я смог даже подключить монитор разрешением 1024x1280 без искажения пропорции, но у него была масса мелких недостатков:
- после второго «отключения на горячую» HDMI-интерфейс начал глючить, после двадцатого перестал работать (позже я обнаружил наличие на других моделях (Orange Pi One, к примеру) шинных формирователей, которых на Pi PC нет - дефект, заложенный на этапе проектирования, ИМХО);
- под Linux плохо работали драйвера (хотя монитор я уже не смог подключить, фиг с ними)
- отсутствие аналоговых портов ввода - очень хотел я не покупаь тестер аккумуляторов, а сделать свой, но выяснилось, что на Pi PC это неврзможно - там нет AnalogRead() .
- (по сравнению с Ардуино) высокое энергопотребление, большой размер;
- нехватка поддержки и информации по наработкам и совместимости: две недели пытался подключить один WIFI-USB-адаптер, потом успешно подключил другой, наименование которого отличалось парой символов .

В общем, Orange Pi - штука неплохая, но не как микроконтроллер, а как недокомпьютер: питается от зарядки для планшета, поддерживает HDMI и видео выход, много USB-портов, можно настроить так, чтоб не грелся, занмает меньше места, чем стационарник.

Итак, к сути, волею судьбы…

Была заказана с интерфейсом UART. Но, если бы была возможность, купил бы ublox neo-m8n , сейчас минимальная цена на такой модуль - $18.39 .

Финал унылости

На момент выбора GPS-модуля, я почему-то не обратил внимания на , возможно, они точнее, лучше бы подошли к Orange Pi и стоили бы дешевле из-за популярности - их ставят в автомобильные GPS-навигаторы и ноутбуки. Однако, . Ну да ладно…
Модуль работал с Orange Pi PC - и я начал написал PHP-скрипт для сохранения треков, а также адаптировать последний к портативному использованию: питание от четырёх аккумуляторов 18650, через понижающий модуль, в корпусе, который может всё это вместить…
Кстати, PHP-скрипт давольно-таки несложный даже для «живой» трансляции в интернет: парсить GLL-строку, пересчитывать координаты и передавать на сервер текущую позицию, а там сохранять ее в базу и, при заходе на страницу, выводить гуглокарту с треком, построенным по точкам.
Корпус решил взять , понижающий модуль , был отпаян от платы, разобран, компактно приклеен к корпусу…
Не знаю, как бы я крепил 4 аккумулятора 18650 и корпус от роутера к велосипеду если бы эксперимент удался, но в процессе заливания термоклеем понижающего модуля, я не заметил, что аккумуляторы подключены к проводам и куда-то не туда ткнул термопистолетом, вероятно, подав на вход Orange Pi напряжение 16В. Линейные стабилизаторы на плате сгорели, на счет остального (процессора, памяти) - не известно, надо как-нибудь заказать их починить.

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

Т.к. «программатор» уже летел из Китайя, после выхода из строя OrangePi, было принято решение заказать Arduino и попытаться сделать GPS-логгер на нём. Понятно, что потребляет он меньше, сам компактнее и в Интернете масса тематических форумов со специалистами, способными наставить новичка на путь истинный! Однако, и у Ардуино есть свои недостатки, которые, по мнению Автора , не очень хорошо влияют на развитие специалистов. Но т.к. стоит полтора бакса и наклепали их немеряно, для себя можно пользоваться.

Программатор

В качестве программатора используется вышеупомянутый переходник на CH340G, для удобства прошивки Ардуино его можно немного доработать. Обычно, при перепрошивке через UART, требуется вручную нажать кнопку Reset на плате Arduino, однако, для автоматизации этого действия можно 13-тую ногу чипа CH340G соеденить с контактов DTR платы Arduino:


Или, если у Вас не плата, а «голый» контроллера Atmega, через последовательно подключенный конденсатор 0.1uF с пином Reset.

Источник питания

Для питания GPS-модуля и контроллера нам нужно 5В. Плата Ардуино имеет на себе понижающий линейный стабилизатор, его можно использовать если источник у нас не ниже 5В. Чтобы это сделать, нужно подать напряжение на пин RAW . Но, т.к. у меня будет один Li-Ion аккумулятор (3-4.2V), было решено использовать повышающий модуль:
или
.
С выхода модуля 5В подключается к пину VСС , RAW не трогаем.

SD / MicroSD карта

Данные карты памяти имеют схожую распиновку и аппаратно совместимы. Они могут работать в двух режимах: SD и SPI . Нас интересует последний.

Можно заказать готовый модуль: подключать его проще. Или, если у Вас есть лишний понижаюший модуль, резисторы на 10 и 4.7 КОм и разъем для карты, можно сделать кардридер своими руками. В указанном модуле уже имеется всё необходимое для подключения карты MicroSD, но у меня как раз под рукой был сломанный кардридер, в который с одной стороны можно вставлять SD или MicroSD карты - и я немного сэкономил, но получил более универсальный кардридер.

Самодельный занимает раза в 3 больше места, но позволяет пользоваться также SD-картами.
Вот подключения. Для питания карты нужно в районе 3.3V, чтобы удобно было монтировать, разделим контакты на три-четыре группы: плюс питания, сигналы от контроллера в карту (10-CS, 11-DI, 13-CLK), земля (минус питания) и сигнал от карты (DO-13).
Плюс питания идет через понижающий модуль или линейный стабилизатор.
Сигналы от контроллера идут к резисторам на 4.7 кО, затем к карте памяти из точки соединения резисторов 4,7 кО и 10 кO.
Минус питания подключается напрямую от общего мотка проводов, или от ближайшего пина Ардуино, также к нему подключаются резисторы 10 кO.
Сигнал от карты подключается напрямую к 13 пину Ардуино.
Так эта страхота выглядела на момент тестирования:


в готовом виде из «толстых» остались только провода питания, интерфейсные же заменил на тонкие медные из ротора жесткого диска трансформатора:

GPS-модуль

Подключается к контроллеру по стандартному последовательному порту одним пином TX модуля - RX Ардуино. Частота - 9600 Бод, если поставить выше, могут возникнуть проблемы из-за задержек обработки других команд (проверки кнопки 7, см. ниже).

Кнопка

Кнопка одна, подключена к пину 7 в режиме INPUT_PULLUP (без внешнего резистора) , обрабатывается только нажатие на неё для отключения SD-карты и остановки устройства. Не уверен полностью, что простое отключение питания никак не повлияет на работу карты памяти, поэтому решил сначала останавливать запись на неё, затем отключать питание. Или, как вариант, вынуть карту памяти, скинуть с нее данные, затем вставить обратно и, нажав ресет, на плате, продолжить запись.

Индикатор

Светодиод подключен сверхъяркий синий через резистор 220 Ом к пину 6. Чтоб было заметно его свечение, пришлось залить чёрным термоклеем все стоковые красные светодиоды (два на Ардуино, два на модулях питания). Индикация со светодиода следующая…
Периодическое моргание - старт GPS - с модуля не поступают валидные данные. При старте GPS отдает актуальную информацию не сразу, поэтому в setup() записал цикл ожидания строки ".00,A," , которая (при моих настройках модуля) свидетельствует о том, что с него пошли достоверные данные о положении.
Двукратное моргание - ошибка начала работы с картой памяти. Иногда можно забыть её вставить или она может случайно не так подключиться. Проверяется только в начале работы, если карта отпадет в другое время, это никак не отлавливается.
Троекратное и четырёхкратное моргание означает остановку после нажатия на кнопку (пин 7). 3 - если GPS так и не отправил данные, 4 - если остановка произошла после начала работы логгера. Полезно, чтобы узнать, как были дела у GPS-модуля в момент отключения =)
Кстати, внизу видны проводки интерфейса SPI, идущие к SD-карте. Всё, что телепалось без надобности, залил прозрачным термоклеем, питание и соединение GPS-модуля сделал разъемное, для подключения программатора к Ардуино и GPS-модуля, там проводки потолще (от IDE-шлейфа) .

Изображение схемы из Fritzing:


Реальное фото, чёрная «шишка» над кард-ридером призвана поддерживать аккумулятор:

Вообще, карты доставать крайне неудобно, пользуюсь пинцетом, за то сами от вибрации не выпадают. В закрытом виде, помещается в карман, корпус был куплен давным-давно, эквивалентная цена сегодня, вероятно, $0.50:

… высотра ~25мм. Имхо, белый пластиковый монтажный короб подойдёт ещё лучше! Еще не мешало бы прикинуть заранее, нужен герметичный корпус или проветриваемый. для себя я еще не решил, возможно придется насверлить отверстий для вентиляции.

Другие «самоелки»

Кроме SD-кардридера, «очумелые ручки» были запущены еще в некоторые места, в которых можно обойтись и без них.
1. Крепление аккумулятора.
На макетную плату напаиваются контакты из старого AT-шного блока питания так, чтобы они попали на соответствующие контакты телефонного аккумулятора. Затем плата с контактами заливается термоклеем. Следующим этапом формуем посадочное место для аккумулятора, у меня это получалось раза с третьего. Чтоб не приклеить аккумулятор термоклеем, проставляем фольгу или гладкую бумажку от наклейки, от бумажки глей отлипнет после засыхания. Можно обойтись и без этого эпичного гемора, если есть нормальный Литиевый аккумулятор, 18650 или просто припаять полимерный.
2. Разъем dupont femail - можно купить сорок проводков за пол-бакса и не мучиться. Но их ждать месяц и, если есть блок питания под рукой, то можно отрезать разъем, предназначенный для питания старых дисководов, вынуть оттуда контакты и обернуть их термоусадочной трубкой:

Конвертирование

О том, как работает GPS-модуль, лучше почитать в приведенной выше статье, здесь я лишь уточню, что настроил его на отправку NMEA-сообщений только типов $GPRMC и $GPGGA , их запись на карту производится без обработки, что позволяет нам упростить задачу и возложить обработку данных на чужие «плечи».
Пожалуй, самой распространённой программой по обработке GPS-данных, является . Полученные файлы обрабатываются таким скриптом:
"Путь к прграмме\gpsbabel.exe" -w -r -t -i nmea -f 0.GPS -x discard,hdop=1.2 -o gpx -F out.gpx pause это позволяет применить фильтр (не учитывать) к точкам, у которых некий параметр точности hdop ниже 1.2 и получить файл out.gpx в удобном для большинства программ формате. GPSBabel поддерживает

14.04.2016. Переработан механизм сохранения GPS-строк: теперь на карту записываются только строки длиной более 48 символов, если встречается строка короче, то запись в файл прекращаться и включается светодиод (6). Так я попытался сделать индикацию появления невалидных GPS-строк. GPS-модуль у меня настроен на вывод только $GPRMC и $GPGGA , когда там появляются валидные данные, длина этих строк становится больше 48, если у Вас будут включены другие строки, с такой настройкой они не попадут в файл. Для отключения этого режима, нужно заменить код
if (btReaded > 48) { // Данные актуальны if (bWaitingGps) { bWaitingGps = false; PORTD &= 0b110111111; // Сбрасываем пин PD6. mkLogFile(); // Открываем лог GPS. } flDataFile.write(chGpsLint, btReaded); // Пишем данные в файл. } else { if (!bWaitingGps) { bWaitingGps = true; PORTD |= 0b001000000; // Усанавливаем пин PD6. flDataFile.close(); // Закрываем лог GPS. } } на код
flDataFile.write(chGpsLint, btReaded); // Пишем данные в файл.

Возможные улучшения

1. Можно сделать устройство в 3 раза компактнее, если правильно разместить элементы, а также взять готовый SD-кардридер, его цена, как и у используемого мною понижающего модуля, - полбакса!
2. Использовать элементы питания 18650 - они дешевле и обладают бОльшей ёмкостью.
3. Так как устройство прикручено к велосипеду, а у большинства есть велофара, которая питается от нескольких аккумуляторов 18650, можно подключиться к двум аккумуляторам (6-4.8В) через пин RAW на Ардуино - и убрать понижающий импульсный модуль - сделать устройство еще компактнее.
4. Так как устройство прикручено к велосипеду, можно добавить как минимум датчик каденса, чем я и займусь в ближайшее время.

Итого, если покупать всё новое:

Модуль Arduino с контроллером Atmega328 ~$1.5
(Micro)SD Card Reader For Arduino ~$0.60
GPS-модуль с UART от ~$10
USB-to-UART (пограмматор) ~$0.70
/ ~$12,8
Повышающий модуль ~$0.70
Аккумулятор ~2.50
/ ~$16
Вот, пожалуй, и всё, и так много текста, если что-то нужно уточнить, спрашивайте. Если утомил, прошу прощения, впредь буду стараться писать больше по сути .

Отдельное спасибо за помощь на форуме.

Планирую купить +60 Добавить в избранное Обзор понравился +50 +94

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

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

  • компьютер с установленной Arduino IDE;
  • Arduino (мы используем Arduino Mega);
  • GPS модуль (мы используем EM-411, возможны и другие, поддерживающие протокол NMEA, например, VK2828U7G5LF или GY-NEO6MV2);
  • макетная плата , перемычки и потенциометр 5 кОм;
  • библиотека TinyGPS (ссылка ниже).

Введение

Создание системы глобального позиционирования, или 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
Флаг 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 <= 9) { lcd.print("0"); lcd.print(hour, DEC); } else { lcd.print(hour, DEC); } lcd.print(":"); if (minute <=9) { lcd.print("0"); lcd.print(minute, DEC); } else { lcd.print(minute, DEC); } lcd.print(":"); if (second <= 9) { lcd.print("0"); lcd.print(second, DEC); } else { lcd.print(second, DEC); } lcd.setCursor(0,1); lcd.print("Date: "); if (day <= 9) { lcd.print("0"); lcd.print(day, DEC); } else { lcd.print(day, DEC); } lcd.print("-"); if (month <= 9) { lcd.print(month, DEC); } else { lcd.print(month, DEC); } lcd.print("-"); lcd.print(year, DEC); delay(2000); lcd.clear(); lcd.print("Lat: "); lcd.print(latitude, DEC); lcd.setCursor(0,1); lcd.print("Lon: "); lcd.print(longitude, DEC); delay(2000); // Debugging purpose only. Serial.print(latitude, DEC); Serial.print(" - "); Serial.println(longitude, DEC); }

После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой GPS-tracker с отправкой координат по GPRS на сервер.
Используется Arduino Mega 2560 (Arduino Uno), SIM900 - GSM/GPRS модуль (для отправки информации на сервер), GPS приёмник SKM53 GPS.

Всё закуплено на ebay.com, в сумме около 1500 р (примерно 500р ардуина, немного меньше - GSM модуль, немного больше - GPS).

GPS приемник

Для начала нужно разобраться с работой с GPS. Выбранный модуль - один из самых дешевых и простых. Тем не менее, производитель обещает наличие батарейки для сохранения данных о спутниках. По даташиту, холодный старт должен занимать 36 секунд, однако, в моих условиях (10 этаж с подоконника, вплотную зданий нет) это заняло аж 20 минут. Следующий старт, однако, уже 2 минуты.

Важный параметр устройств, подключаемых к ардуине - энергопотребление. Если перегрузить преобразователь ардуины, она может сгореть. Для используемого приемника максимальное энергопотребление - 45mA @ 3.3v. Зачем в спецификации указывать силу тока на напряжении, отличном от требуемого (5V), для меня загадка. Тем не менее, 45 mA преобразователь ардуины выдержит.

Подключение
GPS не управляемый, хотя и имеет RX пин. Для чего - неизвестно. Основное, что можно делать с этим приемником - читать данные по протоколу NMEA с TX пина. Уровни - 5V, как раз для ардуины, скорость - 9600 бод. Подключаю VIN в VCC ардуины, GND в GND, TX в RX соответствующего serial. Читаю данные сначала вручную, затем с использованием библиотеки TinyGPS. На удивление, всё читается. После перехода на Uno пришлось использовать SoftwareSerial, и тут начались проблемы - теряется часть символов сообщения. Это не очень критично, так как TinyGPS отсекает невалидные сообщения, но довольно неприятно: о частоте в 1Гц можно забыть.

Небольшое замечание относительно SoftwareSerial: на Uno нет хардверных портов (кроме соединённого с USB Serial), поэтому приходится использовать программный. Так вот, он может принимать данные только на пине, на котором плата поддерживает прерывания. В случае Uno это 2 и 3. Мало того, данные одновременно может получать только один такой порт.

Вот так выглядит «тестовый стенд».

GSM приемник/передатчик


Теперь начинается более интересная часть. GSM модуль - SIM900. Он поддерживает GSM и GPRS. Ни EDGE, ни уж тем более 3G, не поддерживаются. Для передачи данных о координатах это, вероятно, хорошо - не будет задержек и проблем при переключении между режимами, плюс GPRS сейчас есть почти везде. Однако, для каких-то более сложных приложений этого уже может не хватить.

Подключение
Модуль управляется также по последовательному порту, с тем же уровнем - 5V. И здесь нам уже понадобятся и RX, и TX. Модуль - shield, то есть, он устанавливается на ардуину. Причем совместим как с mega, так и с uno. Скорость по умолчанию - 115200.

Собираем на Mega, и тут нас ждет первый неприятный сюрприз: TX пин модуля попадает на 7й пин меги. На 7м пину меги недоступны прерывания, а значит, придется соединить 7й пин, скажем, с 6м, на котором прерывания возможны. Таким образом, потратим один пин ардуины впустую. Ну, для меги это не очень страшно - всё-таки пинов хватает. А вот для Uno это уже сложнее (напоминаю, там всего 2 пина, поддерживающих прерывания - 2 и 3). В качестве решения этой проблемы можно предложить не устанавливать модуль на ардуину, а соединить его проводами. Тогда можно использовать Serial1.

После подключения пытаемся «поговорить» с модулем (не забываем его включить). Выбираем скорость порта - 115200, при этом хорошо, если все встроенные последовательные порты (4 на меге, 1 на uno) и все программные работают на одной скорости. Так можно добиться более устойчивой передачи данных. Почему - не знаю, хотя и догадываюсь.

Итак, пишем примитивный код для проброса данных между последовательными портами, отправляем atz, в ответ тишина. Что такое? А, case sensitive. ATZ, получаем OK. Ура, модуль нас слышит. А не позвонить ли нам ради интереса? ATD +7499… Звонит городской телефон, из ардуины идет дымок, ноутбук вырубается. Сгорел преобразователь Arduino. Было плохой идеей кормить его 19 вольтами, хотя и написано, что он может работать от 6 до 20V, рекомендуют 7-12V. В даташите на GSM модуль нигде не сказано о потребляемой мощности под нагрузкой. Ну что ж, Mega отправляется в склад запчастей. С замиранием сердца включаю ноутбук, получивший +19V по +5V линии от USB. Работает, и даже USB не выгорели. Спасибо Lenovo за защиту.

После выгорания преобразователя я поискал потребляемый ток. Так вот, пиковый - 2А, типичный - 0.5А. Такое явно не под силу преобразователю ардуины. Нужно отдельное питание.

Программирование
Модуль предоставляет широкие возможности передачи данных. Начиная от голосовых вызовов и SMS и заканчивая, собственно, GPRS. Причем для последнего есть возможность выполнить HTTP запрос при помощи AT команд. Придется отправить несколько, но это того стоит: формировать запрос вручную не очень-то хочется. Есть пара нюансов с открытием канала передачи данных по GPRS - помните классические AT+CGDCONT=1,«IP»,«apn»? Так вот, тут то же самое нужно, но слегка хитрее.

Для получения страницы по определенному URL нужно послать следующие команды:
AT+SAPBR=1,1 //Открыть несущую (Carrier) AT+SAPBR=3,1,"CONTYPE","GPRS" //тип подключения - GPRS AT+SAPBR=3,1,"APN","internet" //APN, для Мегафона - internet AT+HTTPINIT //Инициализировать HTTP AT+HTTPPARA="CID",1 //Carrier ID для использования. AT+HTTPPARA="URL","http://www.example.com/GpsTracking/record.php?Lat=%ld&Lng=%ld" //Собственно URL, после sprintf с координатами AT+HTTPACTION=0 //Запросить данные методом GET //дождаться ответа AT+HTTPTERM //остановить HTTP

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

Питание
Поскольку питать GSM модуль от преобразователя Arduino, как я выяснил, плохая идея, было решено купить преобразователь 12v->5v, 3A, на том же ebay. Однако, модулю не нравится питание в 5V. Идем на хак: подключаем 5V в пин, с которого приходит 5V от ардуины. Тогда встроенный преобразователь модуля (существенно мощнее преобразователя ардуины, MIC 29302WU) сделает из 5V то, что нужно модулю.

Сервер

Сервер написал примитивный - хранение координат и рисование на Яндекс.картах. В дальнейшем возможно добавление разных фич, включая поддержку многих пользователей, статус «на охране/не на охране», состояние систем автомобиля (зажигание, фары и пр.), возможно даже управление системами автомобиля. Конечно, с соответствующей поддержкой трекера, плавно превращающегося в полновесную сигнализацию.

Полевые испытания

Вот так выглядит собранный девайс, без корпуса:

После установки преобразователя питания и укладывания в корпус от дохлого DSL модема система выглядит так:

Припаивал провода, вынул несколько контактов из колодок ардуины. Выглядят так:

Подключил 12V в машине, проехался по Москве, получил трек:


Точки трека достаточно далеко друг от друга. Причина в том, что отправка данных по GPRS занимает относительно много времени, и в это время координаты не считываются. Это явная ошибка программирования. Лечится во-первых, отправкой сразу пачки координат со временем, во-вторых, асинхронной работой с GPRS модулем.

Время поиска спутников на пассажирском сидении автомобиля - пара минут.

Выводы

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

Ну и ещё нужно поправить код для более плавного трека, хотя основную задачу трекер и так выполняет.

Использованные устройства

  • Arduino Mega 2560
  • Arduino Uno
  • GPS SkyLab SKM53
  • SIM900 based GSM/GPRS Shield
  • DC-DC 12v->5v 3A converter