GPS Tracker на ардуино своими руками / Хабр

После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой 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 [compatible]
  • Arduino Uno [compatible]
  • GPS SkyLab SKM53
  • SIM900 based GSM/GPRS Shield
  • DC-DC 12v->5v 3A converter
Литература

  1. Оф. сайт Arduino (содержит подробную информацию и о платах, и об их программировании)
  2. TinyGPS (ссылка на скачивание в середине страницы)
  3. GPS SKM53 Datasheet
  4. Описание GSM/GPRS Shield на SIM900
  5. SIM900 AT Commands
  6. Документация по Яндекс.Картам
Код

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

Для компиляции кода для ардуино нужно импортировать библиотеку tinygps.

UPD Код: GDrive
Скетч

habr.com

GPS трекер Arduino: как работает маяк Ардуино

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

Ардуино обладает большим выбором плат, предназначенных для выполнения разного объема и вида работ. Самые популярные из них – Arduino Uno, Ardino Mega, Arduino Nano и Arduino Leonardo. Также есть еще большой выбор вариантов для конкретных случаев.

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

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

Цель создания GPS трекера

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

Геотрекеров сейчас великое множество, однако, как говорит пословица – «Хочешь сделать что-то хорошо – сделай это сам». При наличии понимания как должно это работать, или при желании разобраться во всем самому, шанс создать трекер своими руками выглядит предпочтительным.

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

Работа

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

  • модуль Sim808 – для использования сим-карты;
  • GPS и GSM антенны;
  • непосредственно плата Arduino nano и переходники к ней, для скрепления всего со всем.

Схема, найденная в интернете, оказалась невероятно проста. В качестве учебного занятия в будущем после ознакомления с Arduino самостоятельно имеет смысл создать еще один GPS/GSM трекер со своим ребенком.

Подключив схему Ардуино к модулю сим, подключаем антенны, и обеспечиваем всё это зарядом батареи на 12В. И это всё. Гениально и просто. Далее при помощи Ардуино и имеющегося скретча прошиваем получившийся аппарат и вуаля – готово.

Результаты

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

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

В интернете существуют статьи про более сложные системы и платы, но целесообразности их использования или замены на них того что есть нет. Как говорится «зачем исправлять то, что и так работает».

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

Судя по отзывам у китайских аналогов и проблем с частотой записи нет, и даже обрывы связи незаметны у некоторых моделей. Хотя по цене они выходят также как то, что сделано из Ардуино. Из этого вытекает рекомендация – если вы не инженер в душе, и тяги к изобретениям у вас нет, проще всё-таки купить готовый китайский продукт, чем делать крупногабаритное свое.

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

LESSON 22: Build an Arduino GPS Tracker

Рейтинг автора

4

Написано статей

21

Загрузка…

alertok.ru

GPS часы на Arduino | Каталог самоделок

Многие автомобилисты хотели бы иметь в машине часы, которые всегда исправно идут без перебоев. Ведь многих работа обязывает постоянно находиться в машине, а время очень ценно. Обычно такие часы – дорогостоящее удовольствие. Но немногие задумываются, что их можно сделать самому. Как собрать такие часы и откуда же брать настройки? Есть несколько вариантов:

  1. GPS;
  2. Интернет;
  3. RDS.

Вариант использовать Интернет не подходит, так как могут появиться сложности с синхронизацией времени, то есть нужно будет приобрести модем в машину, а это лишние ненужные расходы. Остается сделать выбор между GPS и RDS, последний вариант отпадает, так как нужно привязываться к какой-то станции, и не всегда возможна синхронизация. Самый лучший вариант – это GPS.

Один из простых вариантов, создание GPS часов с помощью платформы Arduino. Эта платформа одна из самых простых и имеет бесплатную программную оболочку IDE, с помощью которой и происходит программирование. С помощью Arduino создаются самостоятельные автоматические объекты и подключаются к программным обеспечениям на компьютерах, как с помощью стандартных проводных интерфейсов, так и беспроводными.

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

Обозначение функций контактов GPS модулем EM-406A

Если имеется маркировка, то обозначения делать не обязательно – вставляются всего два разъема. Но, если маркировки нет, необходимо подключать вывод GND к GND, Rx – к digital pin 2, Tx – к digital pin 3. Нужно внимательно подключать провода, серого цвета идет шестой, а не первый.

Модуль GPS имеет светодиодную индикацию состояний:

  • светится беспрерывно – спутник ищет и определяет координаты;
  • мигает – все координаты уже установлены и данные передаются;
  • не светится, питание подается с плохим контактом.
Модуль GPS

Можно регулировать его работу от 3.5 до 7 Мгц.

Модуль GPSМодуль с одной платой и Ublox-6M с компасом.

QVGA SPI 240×320 с дисплеем, является аналогом Adafruit ILI9341, благодаря этому увеличивается скорость работы и оттуда же идет демо стрелочных часов. Далее объединяем демо стрелочных часов с данными GPS. Картинку часов можно менять, загрузив другие модули.

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

GPS часы на Arduino

P.S. у библиотеки TFT_ILI9341 в файле User_Setup.h лучше сделать так:

 //#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
//#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
//#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.


Прикрепленные файлы:  СКЕТЧ  – БИБЛИОТЕКА 
Автор: Максим Беляев, Лобня, Россия


volt-index.ru

GPS Tracker на Arduino своими руками — Меандр — занимательная электроника

Читать все новости

После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой 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 
AT+SAPBR=3,1,"CONTYPE","GPRS" 
AT+SAPBR=3,1,"APN","internet" 
AT+HTTPINIT 
AT+HTTPPARA="CID",1 
AT+HTTPPARA="URL","http://www.example.com/GpsTracking/record.php?Lat=%ld&Lng=%ld" 
AT+HTTPACTION=0 

AT+HTTPTERM 

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

Питание

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

Сервер

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

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

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

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

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

Выводы

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

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

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

 

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

 

Литература

 

  1. Оф. сайт Arduino (содержит подробную информацию и о платах, и об их программировании)
  2. TinyGPS (ссылка на скачивание в середине страницы)
  3. GPS SKM53 Datasheet
  4. Описание GSM/GPRS Shield на SIM900
  5. SIM900 AT Commands
  6. Документация по Яндекс.Картам
Код

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

Для компиляции кода для ардуино нужно импортировать библиотеку tinygps.

Архив с кодом

Источник: habrahabr.ru

Возможно, Вам это будет интересно:

meandr.org

GPS ТРЕКЕР, СПИДОМЕТР, ОДОМЕТР И СПУТНИКОВЫЕ ЧАСЫ. ПРОЕКТ НА АРДУИНО. — voltNik

Страница проекта: https://github.com/voltnik/GPS-speed-tracker

Обзор на 3Д принтер: https://www.youtube.com/watch?v=l0Fw1vF3B60

Схема проекта:

Привет друзья, у нас с вами над головой летает большое количество разных космических аппаратов. Среди них есть примерно 90 крайне полезных навигационных спутников американской системы GPS, российской ГЛОНАСС, европейской Галилео и китайской БэйДоу. И сегодня мы будем ловить с них сигнал.

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

Радиосигнал распространяясь со скоростью света доходит до Земли с задержкой   от 60 до 90 миллисекунд, это зависит от удаления спутника. Зная точное расположение источника радиосигнала по задержке времени его распространения можно узнать точное расстояние до спутника. И далее по триангуляции расстояний до нескольких известных объектов можно узнать где вы находитесь в пространстве.

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

Замер расстояний до каждого последующего спутника повышает точность позиционирования и сегодня она составляет от 1 до 3 метров при стандартной видимости около 10 навигационных спутников.

С теорией разобрались, перейдем к практике. Сейчас отдельно продаются разные навигационные модули. Самые простые и древние поддерживают только сигналы от американской GPS системы наблюдая, в среднем 5-7 спутников. Более продвинутые модули могут принимать сигнал еще и от российской группировки ГЛОНАСС, повышая общее количество наблюдаемых спутников в среднем в два раза. Также в продаже есть модули, совмещенные с компасом, они используются для точной навигации и поддержания курса.

На экране моего телефона видны спутники разных навигационных систем. Кружки это GPS, треугольники — ГЛОНАСС, а звездочки это китайская БэйДоу. Таким образом мой телефон поддерживает три разные навигационные системы и совмещая сигналы от них, повышает точность определения местоположения. Сейчас над моей головой находится 28 спутников, а доступен сигнал только от 7. Т.е. мой телефон уже заранее знает где находится каждый спутник. А отсутствующий сигнал от 21 спутника значит, что они находятся вне зоны прямой видимости. Навигационный сигнал очень слабый, от слова ВАЩЕ, он почти не отражается, его блокирует рельеф местности, здания, крыша автомобиля – любой металл у вас над головой или сбоку. Даже идущий за окном снег мешает хорошему приему.

Для реализации проекта понадобится ряд электронных модулей: программируемая платформа Arduino Nano, OLED экран 128 на 32 точки (он подключается по шине I2C), GPS модуль для подключения по UART, любой литиевый аккумулятор емкостью выше 200 миллиампер, защитно-зарядный модуль для лития и повышающий преобразователь для того чтобы получить 5 вольт. У меня тут три разных типа, подойдет любой. Еще планировал использовать цветной RGB светодиод для индикации состояния, но по ходу проекта отказался от этого.

Подключаем экран к Ардуино и сталкиваемся с первой трудностью. Стандартная библиотека OLED экрана занимает 20 кБ, это 70% памяти микроконтроллера и практически не оставляет места для программы. Ранее я собирал высотомер и столкнулся с тем что любая новая строчка кода приводит к переполнению памяти и зависанию микроконтроллера при работе. Поэтому буду использовать значительно более легкую библиотеку. В ней нет работы с графикой и доступен только вывод текста на OLED экран, а занимает она всего 1 кБ памяти.

Отдельно подключаю GPS модуль к макетной плате и вижу первые навигационные данные – сигнал из космоса пойман и обработан. Теперь делаю вывод информации на экран. Класс! Видит 4 спутника, теперь 3, и снова 4, уже 5! Для лучшего приема GPS модуль висит за окном на проводе.

Во время разработки проекта я использовал GPS модули разных типов. Простые GPS и совмещенные GPS c Глонасс. Пришлось провести ряд многочасовых экспериментов для проверки на стабильность работы. Модули оказались рабочими, а вот с программными библиотеками пришлось повозится. Пробовал несколько разных библиотек, и TinyGPS+ оказалась единственной, которая работала сразу со всеми модулями GPS.

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

В итоге моя прошивка позволяет подключать практически любой GPS модуль по UART с протоколом передачи данных NMEA. По сути это большинство модулей, у которых есть пины RX и TX. Рекомендую брать именно модуль GPS с Глонасс, он видит больше спутников, поэтому точность у него выше. Ссылки на все комплектующие и модули есть в описании к этому видео.

Макетка показала полную работоспособность системы, теперь можно собирать все в железе. В качестве питания я буду использовать литиевый аккумулятор, он подключатся к защитной плате с зарядкой. На этой плате нижний резистор R3 задает ток зарядки аккумулятора, по умолчанию установлен 1 ампер, это много для маленьких аккумуляторов, поэтому резистор нужно заменить. На экране вы видите табличку с номиналом резисторов под разные токи зарядки. Если ваш аккумулятор имеет емкость 500 миллиампер часов, то нужно выставлять ток заряда не выше этого значения. Т.е. можно поставить 200 или 300 миллиампер, и не превышать 500.

Далее напряжение нужно повысить, экран и GPS модуль питаются от 5 вольт. Это будем делать с помощью повышающего преобразователя напряжения. Такие обычно устанавливаются в повербанки для того чтобы поднять напряжения с 3.7 до 5 вольт. Я буду использовать маленький зеленый модуль, он может выдавать ток до 300 мА и его более чем достаточно для этого проекта.

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

Измеряю размеры всех модулей и пытаюсь расположить их максимально компактно. Но как я не старался, тонкий экран никак не увязывался с широким GPS приемником. Поэтому решил заменил экран на другой OLED 128х64 точки. Так получается эргономичнее и кнопочку можно большую поставить. OLED экраны полностью совместимы и требуют минимальной коррекции кода, поэтому прошивки будут доступны на обе версии устройства с маленьким экраном и с большим.

Схема сборки простая. Нужно подключить экран к шине I2C это пины А4 и А5, gps модуль подключается к программному serial порту на пинах D3 и D4. Кнопка на пин D7. Питание от аккумулятора через защитный модуль тащим на выключатель, далее на повышающий преобразователь, и подключаем на 5 вольт Ардуино.

Для удобного размещения компонент буду использовать зеленую макетную плату 7 на 3 сантиметра. Чтобы экран не висел на разъеме устанавливаю его на пластиковые стойки спейсеры на 5 миллиметров. Между экраном и кнопкой будет находится GPS приемник. С обратной стороны платы будет установлен контроллер Ардуино, аккумулятор и защитная плата. Аккумулятор буду использовать тонкий литий на 350 миллиампер, если не ошибаюсь такие используются в электронных сигаретах, но как я уже сказал можно использовать любой литиевый аккумулятор.

Заново все замеряю, промеряю и готовлю проект корпуса для печати на 3Д принтере. Буквально 15 минут на сайте TinkerCAD и проект готов к печати. Переношу файл на флешке, запускаю и погнали. Время печати составляет около 40 минут, это первый пристрелочный корпус для примерки размещения модулей.

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

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

Отламываю и зачищаю фиксирующий край пластика. Так как я использовал ABS пластик, он подвержен постобработке ацетоном. Наношу его кисточкой, слои дополнительно склеиваются, а корпус становится прочнее и приобретает глянец.

Плата идеально устанавливается внутрь корпуса, крепления сошлись, кнопка не заедает. С одного торца есть отверстие под разъем Ардуино Нано, а с другой стороны для зарядки аккумулятора. Оно оказалось, немного уже, поэтому расширяю его скальпелем.

У зарядной платы по краям есть выступы, они мешают углубить разъем, стачиваю их надфилем. Теперь плата хорошо занимает свое место.

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

Далее снизу расположится контроллер Ардуино, зарядка лития и сам аккумулятор.

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

Пора паять. Запаиваю первый контакт экрана на плату, примерка – все правильно и можно запаять остальные три контакта. Теперь кнопка. И обязательно счищаем флюс щеткой. Запаиваю провода на модуль защиты аккумулятора.

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

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

Кстати, рекомендую классную аккумуляторную дрель. Она работает от одного аккумулятора 18650 и позволяет быстро рассверливать подобные отверстия на платах и в корпусах, раньше для такой работы мне приходилось доставать дремель из кейса и подключать его в розетку, а сейчас под рукой всегда есть эта дрель.

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

Устанавливаю плату в корпус и закрепляю на четыре маленьких самореза. Ответные отверстия уже предусмотрены на подставках корпуса. Когда снимал защитную пленку с экрана, обратил внимание на большой зазор между дисплеем и корпусом. Поэтому взял кусок прозрачной упаковки от какой-то электроники, вырезал из нее стекло под размер окошка. И приклеил его на ацетон к пластику корпуса.

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

После пайки всех проводов на модули, закрываем нижнюю плату синей изолентой. Сверху будет лежать контроллер Ардуино с зарядкой, и без изоляции появляется вероятность что-нибудь замкнуть.

Запаиваю защитный модуль и закрепляю его на своем месте термоклеем.

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

Далее запаиваю все торчащие провода согласно схеме, на контроллер Arduino Nano.

Готово, теперь нужно залить прошивку. Подключаем Ардуино к компьютеру, заходим на страницу проекта, ссылка на него есть в описании видео. Качаем архив, распаковываем файлы, устанавливаем библиотеки, открываем нужную версию прошивки для экрана на 32 или на 64 точки и загружаем ее в контроллер. Все, заработало с первого раза! Данные с GPS прут. Круто!

Устанавливаю контроллер на свое место, включаю автономное питание… иииииииииии.. нифига. Светодиод питания на Ардуино горит, а экран не включился. И вот так случился трындец, причину которого я не знаю до сих пор. У меня ушло несколько часов работы чтобы заставить трекер работать автономно от встроенного аккумулятора.

Сначала я думал, что виноват маленький повышающий преобразователь питания. Но проверка мультиметром показала наличие стабильных 5 вольт. Далее я подключил автономный модуль питания, который у меня остался от другого проекта, он построен на большом повышающем преобразователе – и о чудо, трекер завелся, но завис спустя несколько секунд.

Зарядил на нем аккумулятор и поставил трекер на окно ловить спутники. Через три минуты он словил сигнал от 4 спутников и определил местоположение. Ну что, значит работает и наверно можно собрать? Меняем повышающий преобразователь, видимо мелкий сильно шумит по питанию.

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

Все, провода скрутил в косички чтобы избежать наводок. Иии… эта гадина опять не включилась. Точнее включилась и сразу зависла с артефактами на экране. Столько часов работы и все в пустую. Замена преобразователя не помогла.

Пробовал устанавливать конденсаторы на питание – ничего не помогало. Трекер отказывался работать автономно, и от повышающих преобразователей, и от лабораторного блока питания – зависал или вообще не включался. Но при этом он отлично пахал от USB разъема Arduino.

Методом последовательного отключения удалось выяснить, что виноват в этом OLED экран – но почему, я так и не понял. Решение нашлось внезапно. Во время очередной проверки автономного питания я случайно подал на пин VIN 5 вольт. Замечу что этот пин !не! предназначен для подачи питания 5 вольт и требует напряжение от 7 до 12 вольт.

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

Заодно решил проверить ток потребления. От 5 вольт трекер кушал около 70 миллиампер. А от 4 вольт через повышающий преобразователь получилось около 110 миллиампер. Таким образом моего маленького аккумулятора на 350 миллиампер хватит на три часа автономной работы. И это я еще питание не оптимизировал, можно срезать вечно горящие светодиоды и еще сэкономить батарею.

Трекер стал полностью стабильно работать, оставил его на окне и спустя несколько минут он словил 4 спутника. Отлично

Если вам интересно помочь мне разобраться в причине странного поведения Ардуино, то вот вам вводная:

1 – Трекер работает если его запитать через USB разъем Ардуино.

2 – Трекер зависает и не включается если запитать его через пин Ардуино 5V подав на него напряжение 5 вольт от любого источника питания.

3 – Трекер зависает и не включается если подать на него 7 вольт и более через пин Ардуино VIN.

4 – Трекер работает если его запитать не стандартными 5 вольтами через тот же самый пин VIN.

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

На главном экране после загрузки сверху отображается текущее время и дата по Гринвичу, вторая строка — это текущая скорость 0.3 километра в час и максимальное значение скорости которое было зафиксировано со времени включения — 26 километров в час. На третьей строке текущее расстояние до нулевой точки 530 метров и максимальное удаление которое было достигнуто с момента включения — 580 метров. На четвертой строке одометр, показывает 923 метра и используемое количество спутников.

Нижняя строка chars – это количество данных принятых с GPS модуля.

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

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

Перейдем к тестированию. Сейчас трекер видит 12 спутников. Выставляю текущую нулевую точку и сбрасываю одометр в ноль. Тоже самое делаю на автомобильном одометре. Проехав 1.2 километра по спидометру автомобиля, я увидел на GPS трекере те же самые 1205 метров. Текущее расстояние до нулевой точки по прямой составляет 0.93 километра. И вот по карте те самые 930 метров, пока все точно.

Решил замерить более длинную дистанцию. Опять сбрасываю показания в нули на трекере и автомобиле. Проехав 8.4 километра, я обнаружил на трекере дистанцию пути меньше – всего 7974 метра. При этом текущее расстояние до нулевой точки составляет 4.930 метров. Проверим по карте, получается очень точно, те же самые 4.930 метров. Непонятно, только почему тогда одометр врет на 400 метров и какой именно одометр врет, на машине или GPS.

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

Приехал на каток и решил замерить скорость хоккеиста. Блин, чехлы ему еще для скорости нужно снять. Получилась лютая скорость, прямо «русская ракета» — 5 километров в час. Пешком ходил, а все потому что потолок на катке фольгой отражающей утеплен для удержания холода. Сигнал от спутников есть, но он не точный.

Давайте проведем последний тест с помощью мобильного телефона. Телефон видит 7 спутников, а трекер 9. Запускаю логгирование и сбрасываю одометр на трекере. Ну.. погнали. Проехав три километра телефон и трекер показывали идентичные значения на одометре. 3017 против 3021 метра – это супер результат, я не ожидал такой точности.

И далее показания скорости во время всей поездки тоже были идентичны. Максимальная скорость тоже совпала и там, и там 84 километра в час.

А вот одометр глюканул, аж на целых 12 тысяч километров. Некисло так. Ранее у меня при отладке программы уже проскакивал такой глюк и трекер разом перемещало на 7 тысяч километров. Придя домой я создал в Google точку с нулевой широтой и долготой. Оказалось, она находится в Атлантическом океане, недалеко от побережья Ганы. Замерив расстояние от нее до своего местоположения я и получил те самые 7 тысяч километров. Получается от GPS модуля иногда проскакивают нули по координатам. Это легко можно исправить, добавив всего одно условие в код программы. И более этого глюка при тестах не наблюдалось.

Считаю, что трекер получился афигенный, это мой первый опыт прямой работы с GPS модулями. Зачем он нужен? Такой трекер может выполнять роль автономного спидометра или независимого одометра. Его можно разместить на велосипед, автомобиль, игрушку или квадрокоптер. Также он позволяет измерять расстояние по прямой до заданной точки, значения нулевой хранятся в энергонезависимой памяти. Запоминает максимально достигнутые значения скорости и удаления. Делает это все автономно и не зависит ни от кого кроме спутников. Ну и конечно же это часы точного времени. Мне же он нужен для измерения максимальной скорости и максимального удаления от объектов. Точно, надо еще высоту на экран добавить, чтобы замерять как высоко поднялся!

Поговорим о том, как можно уменьшить вес, проще всего это сделать, собирая трекер на платформе Arduino Pro Mini на 3.3 вольта. Тогда вам не понадобится повышающий преобразователь, вместо него будет маленький линейный стаб на 3.3 вольта, GPS модуль без проблем работает от этого напряжения, а на экране нужно будет обойти стабилизатор питания.

Ну и сразу отвечу на вопрос можно ли добавить GSM модуль и управлять трекером по SMS? Да, можно. Для этого помимо самого модуля еще потребуется добавить в код программы обработку SMS команд и это должен быть отдельный проект.

На этом сегодня, если вам понравилось это видео, то я уверен вы оцените его лайком и поделитесь ссылкой на видос со своими друзьями.

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

Спасибо за просмотр, всем удачи и до встречи в новых видео! Пока-пока!

voltnik.ru

alexxlab

leave a Comment