Спидометр gps своими руками
В простых велокомпьютерах обычно считаются обороты колеса — зная количество оборотов в минуту не сложно подсчитать скорость и пройденное расстояние. Вот только датчики Холла на вилку ставить морока, они быстро покрываются грязью и начинают сбоить. Лишние провода отнюдь не украшают байк, а только привлекают внимание воришек. Да и что делать, если в хозяйстве не только велосипед, но ещё и самокат, ролики или сноуборд?
Мы пошли другим путём. Данные о скорости мы получаем от приёмника сигналов спутниковой навигации GLONASS/GPS. А дальше — дело техники. Милые сердцу моряков и авиаторов узлы мы переводим в привычные «км/ч», а информацию об изменении координат используем для определения пройденного расстояния. Полученные значения в реальном времени выводим на четырёхразрядный индикатор, переключаясь между выводом скорости и дистанции обычной тактовой кнопкой.
Получилось компактное устройство, которое быстро крепится на руль, раму или просто на руку. Без лишних проводов и проблем с калибровкой.
Что потребуется
Полный сет компонентов проекта. В сет входят:
Видеоинструкция
Как собрать
Установите Troyka Slot Shield на Iskra Neo
Поверните GLONASS/GPS на 90 градусов против часовой стрелки и вставьте в правый верхний слот.
Переверните Quad Dispaly вверх ногами и вставьте в центральный и правый слоты нижнего ряда.
Переверните тактовую кнопку на 90 градусов против часовой стрелки и вставьте в центральный верхний слот.
Скетч
Прошейте контроллер скетчем через Arduino IDE.
Хотите собрать другой девайс? Выберите своё будущее устройство из списка проектов на Slot Shield.
Спидометры используются для измерения скорости движения транспортного средства. Ранее на нашем сайте мы уже рассматривали создание аналогового спидометра на основе платы Arduino и цифрового спидометра на Arduino и смартфоне на Android. В аналоговом спидометре для измерения скорости мы использовали инфракрасный датчик, а в цифровом – датчик Холла. В этой же статье для измерения скорости мы будем использовать технологию GPS. В большинстве случаев GPS спидометры более точно измеряют скорость чем обычные спидометры. Также технология GPS в настоящее время широко используется в смартфонах и транспортных средствах для навигации и предупреждения о различных дорожных ситуациях.
В данной статье мы рассмотрим создание GPS спидометра на основе платы Arduino, GPS модуля NEO6M и OLED дисплея.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- GPS-модуль GY-NEO6M (купить на AliExpress).
- OLED дисплей с интерфейсом I2C и диагональю экрана 1.3 дюйма (1.3 inch I2C OLED display) (купить на AliExpress - для данного проекта выбирайте вариант дисплея с 4 контактами).
- Макетная плата.
- Соединительные провода.
GPS модуль NEO6M
NEO-6M является популярным GPS приемником со встроенной керамической антенной, которая обеспечивает хороший прием сигнала с GPS спутников. Данный приемник способен отслеживать до 22 спутников и обеспечивает определение местоположения в любой точке земного шара. Модуль имеет аккумулятор для автономной подпитки (backup battery), что позволяет ему сохранять данные когда основное питание схемы отключено.
Ядром модуля является GPS чип NEO-6M от компании u-blox. Он может отслеживать до 22 спутников по 50 каналам и обладает чрезвычайно хорошей чувствительностью (-161 dBm). Модуль поддерживает скорости передачи данных 4800-230400 бод. По умолчанию он настроен на скорость 9600 бод.
Технические характеристики модуля:
- рабочее напряжение: 2.7-3.6V DC (постоянного тока);
- рабочий ток: 67 mA;
- бодовая скорость передачи: 4800-230400 (9600 по умолчанию);
- протокол связи: NEMA;
- интерфейс: UART;
- внешняя антенна и встроенная энергонезависимая память (EEPROM).
Назначение контактов (распиновка) GPS модуля NEO6M:
• VCC : входное питающее напряжение;
• GND : общий контакт (земля);
• RX, TX : контакты для UART (последовательной) связи с микроконтроллером.
На нашем сайте мы уже достаточно часто рассматривали проекты с использованием GPS модулей, список данных проектов можно посмотреть по следующей ссылке.
OLED дисплей
Термин OLED расшифровывается как “Organic Light emitting diode” (органический светоизлучающий диод) и в используемом нами OLED дисплее используется та же самая технология, что и в привычных нам современных телевизорах, только разрешение экрана нашего дисплея существенно меньше чем у телевизоров. С подобными дисплеями проекты на Arduino сразу начинают "сверкать новыми красками" поскольку они обеспечивают значительно более презентабельную картинку чем обычные монохромные ЖК дисплеи. В нашем проекте мы будем использовать монохромный OLED дисплей SH1106 1.28” с 4-мя контактами, подключаемый по интерфейсу I2C.
Технические характеристики дисплея:
- микросхема драйвера: SH1106;
- входное напряжение: 3.3V-5V DC;
- разрешение: 128x64;
- интерфейс: I2C;
- потребление тока: 8 mA;
- цвет пикселов: синий (Blue);
- угол обзора: >160 градусов.
Назначение контактов (распиновка) дисплея:
VCC : питающее напряжение 3.3-5V DC;
GND : общий провод (земля);
SCL : контакт синхронизации интерфейса I2C;
SDA : контакт передачи данных интерфейса I2C.
Сообществом Arduino разработано уже достаточно много библиотек для работы с OLED дисплеями, нам среди них понравилась библиотека Adafruit_SH1106.h – она проста в использовании и позволяет работать с графикой.
Подобный дисплей мы ранее уже использовали в следующих проектах:
Схема проекта
Схема GPS спидометра на Arduino и OLED дисплее представлена на следующем рисунке.
Внешний вид собранной на макетной плате конструкции проекта выглядит следующим образом:
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе необходимо подключить все используемые библиотеки. В нашем проекте мы будем использовать библиотеку TinyGPS++.h для считывания GPS координат с GPS модуля и библиотеку Adafruit_SH1106.h для работы с OLED дисплеем.
После нескольких экспериментов с ардуиной решил сделать простенький и не очень дорогой GPS-tracker с отправкой координат по GPRS на сервер.
Используется Arduino Mega 2560 (Arduino Uno), SIM900 — GSM/GPRS модуль (для отправки информации на сервер), GPS приёмник SKM53 GPS.
Всё закуплено на ebay в сумме около 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А. Такое явно не под силу преобразователю ардуины. Нужно отдельное питание.
Программирование
Для получения страницы по определенному URL нужно послать следующие команды:
В результате, при наличии соединения, получим ответ от сервера. То есть, фактически, мы уже умеем отправлять данные о координатах, если сервер принимает их по 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
Литература
-
(содержит подробную информацию и о платах, и об их программировании) (ссылка на скачивание в середине страницы)
Публикующийся код может быть использован в любых разрешенных законом целях любыми лицами. Качество кода ужасно, поскольку это, всё же, тестовый вариант. Когда допишу до чего-то более красивого, обновлю.
Как я уже писал, после установки в машину бортового компьютера Multitronics VC731, у меня возникла необходимость откалибровать его. Для этого нужно было проехать некоторое, точно известное расстояние, и ввести его в бортовик, после чего он произведет нужные расчеты и калибровку пробега и мгновенной скорости.
Для точного измерения пройденного пути я сразу подумал использовать GPS. Наивно полагая, что все получится, я установил в свой смартфон HTC Desire HD программу-логгер маршрута GPS и поехал.
После поездки, скинув информацию со смарта на комп, я был удивлен, насколько некачественно встроенный GPS приемник определяет свое местоположение. Маленькая частота обновлений координат и слабая антенна привели к тому, что даже в местах, где я двигался прямолинейно, со скоростью около 50 км/час, записанный трек выглядел как ломаная линия, а порой попадались восьмерки (вроде как я разворачивался и вдруг ехал назад, после чего снова разворот). В целом, конечно маршрут и измеренный пробег были примерно похожи на правду, но для калибровки бортовика такие измерения использовать я не мог.
Поразмышляв немного на эту тему, я пришел к выводу, что соберу-ка я сам GPS спидометр-одометр (далее девайс).
Это позволит убить массу зайцев одним выстрелом: откалибровать бортовик, познать азы работы с GPS приемниками, координатами и сопутствующими расчетами, ну и наконец, пощупать вживую известную платформу Arduino – именно на ней планировалось построить девайс.
По поводу Arduino – платформа известная, раскрученная, доступная, дешевая и удобная для использования. При этом обладает одним недостатком – среда разработки просто отвратительна. Она годится для детей и подростков, желающих познакомиться с программированием микропроцессоров, но никак для серьезной работы. К отсутствию массы, привычных в нормальных средах разработки, возможностей, можно добавить еще и омерзительный внешний вид нативной среды разработки для Arduino. Тем не менее, на момент постройки устройства я всего этого не знал, и потому программа писалась именно в этой среде.
Забегая вперед скажу, что я стал часто использовать борды Arduino в своих проектах, но программы стал писать в своем любимом компиляторе CodeVisionAVR, и заливаю ее в Arduino с помощью разработанной мной утилиты, встраиваемой в интерфейс компилятора. Я напишу отдельную статью касательно этого вопроса в ближайшем будущем.
Ну, вернемся к нашим баранам. Сердцем прибора стал борт Arduino Uno:
В качестве приемника GPS я использовал борд SparkFun основанный на чипе Venus638FLPx:
Приемник замечательный. Из основных достоинств могу отметить его 65 канальную архитектуру, широкий диапазон напряжений питания, возможность подключения резервного питания (что обеспечить быстрый старт при возобновлении основного питания), высокую частоту обновлений координат (до 20 Гц) и т.д.
Кроме того, приемник поддерживает подключение внешнего супер-конденсатора, который позволяет поддерживать напряжение в памяти приемника в течение многих часов. В результате, при повторном включении определение местоположения занимает считаные секунды.
Кроме того, раз уж пошла такая пьянка, в систему был добавлен Bluetooth передатчик HC-05 (pinout):
По нему, всю информацию, полученную от GPS приемника, планировалось переправлять как есть, что позволило бы использовать девайс в качестве внешнего GPS приемника для смартфона или ноутбука.
Сам модуль HC-05 доступен по цене 5-7 долларов за штуку и продается везде. К сожалению, работа с ним полна геморроя, потому как выпускает эти модули нынче каждый третий китаец, и делают они их все немного по разному, так, что найти 100%-но соответствующий даташит нереально. В итоге Bluetooth передатчик получается нормально запустить и настроить после нескольких циклов проб и ошибок.
Важно отметить, что для работы передатчика важно подтянуть к питанию ноги reset и wake-up, а также подсоединить к земле все GND.
Ну и наконец – антенна, первая, что попалась под руку:
Все вышеназванные детали были соединены вот таким образом (надеюсь, я не ошибся – девайс строился на лету, так что схему я рисовал по памяти):
В итоге из рассыпухи break-up бордов получилась вот такая лапша:
После того, как девайс был готов, была написана прошивка, последнюю версию которой можно сказать здесь.
Кратенько о прошивке.
При включении, после заставки, на экране высвечивается сообщение No fix detected. Оно будет продолжать высвечиваться, пока девайс не сможет определить собственные координаты.
Как только это произойдет, они тут же высветятся на экране, вместе с текущей скоростью и азимутом движения.
Левой кнопкой можно менять режим отображения данных на экране. Возможности:
Длительным нажатием на правую кнопку можно обнулить одометр.
Девайс постоянно мониторит напряжение батареи, и как только оно упадет ниже 3.2 вольт, девайс перейдет в режим отображения напряжения на экране. При этом перейти на другой экран станет невозможно.
В этот момент крайне рекомендуется выключить девайс или подключить его к зарядке. Никаких дополнительных средств защиты не предусмотрено, поэтому, если проигнорировать сообщение о низком напряжении, есть большой шанс безвозвратно угробить как минимум батарею.
Кроме того, если в процессе работы ухудшится прием GPS и девайс начнет терять сигнал, высветиться сообщение DATA LOSS.
Подсчет пройденного расстояния производится по методу Great Circle distance calculation – HAVERSINE. В силу специфики гражданского GPS, измерения пробега получаются наиболее точными при движении по трассе. Хотя с хорошей антенной и в городе точность получается довольно точными. При контрольной проверке по карте, погрешность соста
вила пару сотен метров на 50 километров пути.
Передача данных по Bluetooth осуществляется параллельно основной работе девайса, и может быть полезна, к примеру, пользователям смартфонов на Android. Точность и чувствительность девайса в разы лучше оных на встроенном в смартфон GPS модуле, и потому, при помощи бесплатной программы Bluetooth GPS можно заставить все остальные программы, пользующиеся GPS для работы использовать данные приходящие по Bluetooth, вместо данных со встроенной антенны.
Кроме того, вместо телефона к Bluetooth можно подключить компьютер и пользоваться им в качестве инструмента для записи и анализа маршрута, в том числе в реальном времени.
После окончательной сборки и проверка девайса, я смог, наконец, с большой точностью откалибровать свой Multitronics.
Теперь активно пользую девайс при путешествиях на джипах по бездорожью – удобно измерять пройденные расстояния, чтобы не сбиться с маршрута.
Сигналы с датчика необходимо преобразовать в напряжение, для этих целей используется LM2917. При увеличении напряжения будут последовательно включаться 30 светодиодов, которые подключаются через три микросхемы типа LM3914.
Конкретной в этой статье автор заменил датчик ABS на шаговый двигатель, ведь он тоже может генерировать импульсы. Помимо этого такой двигатель вырабатывает еще и напряжение, которое растет при увеличении скорости. В связи с этим необходимость использования регулятора напряжения LM2917 отпала.
Материалы и инструменты для изготовления:
- шаговый двигатель (можно найти в струйном принтере);
- провода;
- паяльник с припоем;
- микросхемы LM3914;
- подстроечный потенциометр на 47 кОм;
- 31 светодиод;
- плотная бумага для создания дисплея (картон);
- два резистора на 1 кОм;
- три резистора 2.2 кОм;
- электролитический конденсатор 470 мкФ/25В;
- два полипропиленовых конденсатора на 100 нФ;
- ножницы и другие мелочи.
Процесс изготовления спидометра:
Шаг первый. Устанавливаем датчик скорости
Для того чтобы сделать датчик можно использовать инфракрасные детекторы и светодиоды, различные сенсоры и так далее. Автор использовал для этих целей шаговый двигатель от струйного принтера. Из двух был выбран самый большой, который вырабатывает больше всего мощности и сигналов. Самое сложное - соединить двигатель с тросиком, то есть поставить шаговый двигатель вместо прежнего стрелочного спидометра.
Микросхемы LM3914 являются драйверами светодиодного дисплея. Каждый из этих драйверов нужен для управления десятью светодиодами, это может быть как сегментный режим, так и точечный. Режимы переключаются по приложенной инструкции. Что касается контроллера 7809 (9В), то он регулирует напряжение.
Шаг третий Сборка спидометра
Светодиодов всего должно быть 31 штука, свет выбирается индивидуально, главное, чтобы они были яркими. Автор использовал яркие светодиоды белого цвета. Можно сделать ленту разноцветной, к примеру, к концу поставить красные, что будет говорить о высокой скорости движения, а вначале зеленые или синие светодиоды.
Первый светодиод должен непрерывно гореть при подключении питания +12В. Остальные же 30 будут включаться последовательно при росте скорости автомобиля. Основа для светодиодов делается из картона, напротив них вырезаются прямоугольные отсеки, на которые затем приклеивается более тонкая бумага. При работе светодиодов свет будет проходить только через тонкую бумагу, образовывая эффект, который можно увидеть на фото. Бумагу можно покрасить в любой цвет. Естественно впоследствии вся эта конструкция ставится вместо внутренностей старого стрелочного спидометра.
Между диодами нужно сделать перегородки, чтобы свет не распространялся по всей ленте. Лучше всего использовать алюминий, он будет отлично отражать свет.
Читайте также: