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

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

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

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

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

Заказал сначала здесь Arduino Pro Mini на ATMEGA168 — «летит» до сих пор, уже более месяца! Потом выяснил, что для записи на SD-карты размером более 2ГБ по SPI-интервейсу нужен контроллер Atmega328 — и заказал обозреваемый; доставили за 25 дней.

Отследить весь цикл мучений в процессе ожидания микроконтроллера и доработки программы можно в этой теме на форуме

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

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

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

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

Для питания GPS-модуля и контроллера нам нужно 5В. Плата Ардуино имеет на себе понижающий линейный стабилизатор, его можно использовать если источник у нас не ниже 5В. Чтобы это сделать, нужно подать напряжение на пин RAW. Но, т.к. у меня будет один Li-Ion аккумулятор (3-4.2V), было решено использовать повышающий модуль:
такой (придётся отпаивать разъем USB) или
такой (придется настраивать/подбирать резистор).
С выхода модуля 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,, которая (при моих настройках модуля) свидетельствует о том, что с него пошли достоверные данные о положении. (14.04.2016)
Двукратное моргание — ошибка начала работы с картой памяти. Иногда можно забыть её вставить или она может случайно не так подключиться. Проверяется только в начале работы, если карта отпадет в другое время, это никак не отлавливается.
Троекратное и четырёхкратное моргание означает остановку после нажатия на кнопку (пин 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. Полученные файлы обрабатываются таким скриптом:
это позволяет применить фильтр (не учитывать) к точкам, у которых некий параметр точности hdop ниже 1.2 и получить файл out.gpx в удобном для большинства программ формате. GPSBabel поддерживает огромное количество форматов, более подробно о фильтрах можно почитать здесь, по-русски.
Удобная онлайн-смотрелка-треков — utrack.crempa.net/

Скетч

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

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

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

$1.5
(Micro)SD Card Reader For Arduino

$0.60
GPS-модуль с UART от

$10
USB-to-UART (пограмматор)

$12,8
Повышающий модуль

$16
Вот, пожалуй, и всё, и так много текста, если что-то нужно уточнить, спрашивайте. Если утомил, прошу прощения, впредь буду стараться писать больше по сути.


Источник: mysku.me