Измеритель дистанции на основе GPS навигации


Somnath Bera - активный пользователь программного обеспечения с открытым исходным кодом.
Эксперт по тепловой энергии, заместитель главного менеджера NTPC Ltd.

Перевод с английского - Николая Большакова /RA3TOX/, сайт "Радиофанат".


Представленный проект основан на глобальной системе позиционирования (GPS) и микроконтроллере ATmega328P-PU для измерения расстояния между двумя точками с использованием формулы Хаверсина (Haversine). Прибор является удобным инструментом для измерение больших расстояний. Автором использовался для патрулирования и инспекции тепловых электростанций.

Для изготовления Вам нужен модуль Arduino в котором исполуется внутренняя синхронизация (8МГц), GPS приемник с последовательным портом данных, карта памяти micro-SD, ЖК-экран 16х4, кнопочные переключатели и несколько других компонентов.

Принципиальная схема измерителя расстояния GPS показана на рис. 1. Чтобы сделать схему простой и менее энергоемкой, резонатор на 16 МГц и связанные с ним конденсаторы на плате Arduino не используются. Плата Arduino программируется как ATmega328P-PU с внутренним тактовым генераторм 8 МГц. Питание осуществляется от литиево-ионной батареи 3,7 В.

Используемый здесь модуль GPS-приемника D2523T требует напряжения питания 3 В и 3,6 В постоянного тока и потребляет ток около 40 мА. Возможно применение другого модуля.

После включения устройства на открытой местности определение координат GPS-приемника занимает менее 20 секунд. Вы можете увидеть это по непрерывному миганию зеленого светодиода PPS на GPS-приемнике. Сразу же на ЖК-дисплее отобразится индикация широты и долготы, а также дата и время.

Нажмите кнопку S2, чтобы начать измерение и отметьте начальные показание.

Теперь переместитесь с прибором в нужное место. Значение измеренного расстояния будет отображено на третьей строке ЖК-дисплея, и в то же время все показания, включая серийный номер, дату, время, широту и долготу будут сбрасываться в текстовый файл, который автоматически сохраняется на карте памяти micro-SD (8 ГБ, 16 ГБ и т. д.).

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

Вероятность ошибки измерения может составлять от 2,5 до 10 метров. Под открытым небом, где GPS-спутники легко обнаруживаются, погрешность минимальна. В облачный день наблюдение за спутниками GPS может занять больше времени. Поэтому перед нажатием кнопки S2 подождите некоторое время, пока показания значения широты и долготы не стабилизируются.

Программное обеспечение

Код написан на языке программирования Arduino. Программа ATmega328P загшружается с использованием программного обеспечения Arduino IDE. Выберите нужную плату из меню «Инструменты» в меню «Arduino IDE» и запишите программу (скетч) через стандартный USB-порт вашего компьютера.

На плате Arduino Uno есть внешний 16-мегагерцовый резонатор с двумя конденсаторами. Вы можете использовать плату Arduino Uno напрямую, но перепрограммировать ее на внутреннюю синхронизацию 8 MHz довольно сложно. Для этого вам понадобится незапрограммированный чип ATmega328P, который никогда не программировался с внешним резонатором 16 МГц. Поскольку, как только он запрограммирован с внешними синхронизирующими импульсами, он никогда не вернется к режиму работы от внутреннего генератора 8 МГц.

Прочтите статью о том, как использовать Arduino в качестве AVR-программатора, чтобы запрограммировать ее с 8-мегагерцовым внутренним генератором. Данный материал смотрите по адресу http://electronicsforu.com/electronics-projects/hardware-diy/arduino-avr-programmer.

Преимущество внутренних генераторов на 8 МГц состоит в том, что монтаж микроконтроллера можно легко выполнить на макетной плате без внешних элементов. Кроме того, его потребляемая мощность составляет менее 10 мА при питании от источника 3,3 В.

В программный код включены несколько библиотек:

LiquidCrystal.h - для ЖК-панели. Эта библиотека позволяет плате Arduino управлять ЖК-дисплеями на базе чипсета Hitachi HD44780 (или совместимого), который можно найти на большинстве текстовых дисплеев. Библиотека работает как в 4-битном, так и в 8-битном режимах.

TinyGPS.h - новая библиотека Arduino для анализа потоков данных NMEA, предоставляемых модулями GPS.

SPI.h - эта библиотека позволяет вам общаться с устройствами SPI, используя Arduino в качестве ведущего устройства.

SDFat.h - библиотека обеспечивает процедуру чтения/записи для файловых системам FAT16/FAT32 на флэш-картах microSD/SDHC.

Конструкция и тестирование

Актуальные размеры платы GPS-измерителя показаны на рис.2, его компоновка - на рис.3.


Рис.2:


Рис.3.

Включите GPS-приемник и подождите, пока светодиод PPS на GPS не начнет мигать. Скоро вы увидите значения широты и долготы на ЖК-дисплее. Дождитесь, пока показания на ЖК-дисплее не стабилизируются.

Нажмите кнопку S2, и вы получите мгновенное расстояние (d) и общее расстояние (D) на третьей строке ЖК-панели. Например, если расстояние от точки А до В составляет 10 метров, а от точки В до С - 20 метров, то общее расстояние D будет 30 метров. Расстояние от А до В или от В до С - мгновенное расстояние.

Чтобы измерить расстояние от точки A до C, нажмите S2 и удерживайте ее нажатой до тех пор, пока не достигнете точки B. Отпустите S2, чтобы остановить измерение; Значения d / D (мгновенное / полное расстояние) на ЖК-дисплее будут отображаться как 10/10. Эти же значения будут сохранены на карте microSD. Теперь нажмите кнопку S2 еще раз, пока не дойдете до точки C. Отпустите кнопку S2 и обратите внимание на значения d/D. На ЖК-дисплее отобразится 20/30.

Наконец, когда все измерения сделаны, нажмите кнопку S3, чтобы закрыть файл и остановить систему. Перезагрузите Arduino, чтобы перезапустить систему. Авторский прототип устройства показан на рис.4.


Рис.4.

Файл журнала хранится на карте microSD. Каждый раз, когда вы запускаете устройство, он создает новый файл журнала по именам data0.csv, data01.csv, data02.csv и т.д., как показано ниже:

SI__Dat__Time___Lattitude__Longitude__Dist.__DistO

0  20/3/16 23:1:18 24.088750 82.648200 0.0000 0.0000

1  20/3/16 23:1:21 24.088750 82.648200 0.0000 0.0000

2  20/3/16 23:1:24 24.088750 82.648200 0.0000 0.0000

3  20/3/16 23:1:29 24.088750 82.648200 0.0000 0.0000


Рис.5: Показания перед нажатием кнопки S2


Рис.6: Показания после кнопки S2 (пока она удерживается нажатой)


Рис.7: Показания, показывающие значения d и D

Примечание редакции EFY.

1. Исходный код этого проекта включен в DVD-диск журнала EFY 11/2016, а также доступен для бесплатной загрузки на сайте журнала efymag.com, или здесь - GPS_distance_meter.rar (227 Кб).

2. Проект был протестирован в лаборатории журнала EFY на Arduino Uno с внешним кристаллом 16 МГц и, как было установлено, работает хорошо.

ELECTRONICS FOR YOU | NOVEMBER 2016 - WWW.EFYMAG.COM


Примечание от RA3TOX.

Как было сказано выше - с 8-мегагерцовым генератором устройство более экономичное. Поэтому предлагаю применить плату Arduino Pro Mini на 3.3V, 8 MHz (они на AliExpress стоят около 100 руб.).

Если все же хотитете использовать отдельный процессор, то примените такой вариант: сначала надо откомпилировать скетч для конфиругации "Arduino Pro or Pro Mini" (3.3V, 8 MHz), как показано на рисунке ниже:

Далее получить HEX-файл, как описанов статье "Как получить HEX из Arduino" и уже этот HEX-файл загрузите в микропроцессор вашим любимым программатором. При этом все-же не забудьте установить внешний кварц на 8 МГц и два конденсатора на 22 пф.

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

Удачи!