Измеритель дистанции на основе 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 не начнет мигать. Скоро вы увидите значения широты и долготы на ЖК-дисплее. Дождитесь, пока показания на ЖК-дисплее не стабилизируются. P>
Нажмите кнопку S2, и вы получите мгновенное расстояние (d) и общее расстояние (D) на третьей строке ЖК-панели. Например, если расстояние от точки А до В составляет 10 метров, а от точки В до С - 20 метров, то общее расстояние D будет 30 метров. Расстояние от А до В или от В до С - мгновенное расстояние. P>
Чтобы измерить расстояние от точки A до C, нажмите S2 и удерживайте ее нажатой до тех пор, пока не достигнете точки B. Отпустите S2, чтобы остановить измерение; Значения d / D (мгновенное / полное расстояние) на ЖК-дисплее будут отображаться как 10/10. Эти же значения будут сохранены на карте microSD. Теперь нажмите кнопку S2 еще раз, пока не дойдете до точки C. Отпустите кнопку S2 и обратите внимание на значения d/D. На ЖК-дисплее отобразится 20/30. P>
Наконец, когда все измерения сделаны, нажмите кнопку S3, чтобы закрыть файл и остановить систему. Перезагрузите Arduino, чтобы перезапустить систему. Авторский прототип устройства показан на рис.4. P>
Рис.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 Кб). p>
2. Проект был протестирован в лаборатории журнала EFY на Arduino Uno с внешним кристаллом 16 МГц и, как было установлено, работает хорошо. p>
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, думаю, что его ресурсов хватит.
Удачи!