Gps навигация своими руками

Простой GPS навигатор своими руками

Во многих современных телефонах есть GPS, но для работы навигатора необходима подгрузка карт через интернет, что в дали от GSM вышек является проблемой. Также большая проблем — это быстрый разряд аккумулятора смартфонов, особенно в холодное время года. За раз путешественник остаётся не только без навигации, но и без связи. Иметь с собой независимое навигационное устройство будет очень кстати. Подобное устройство и будет предлагаться в статье, ниже.

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

Схема самодельного навигатора

Схема строится на микроконтроллере ATMega64 с тактированием от внешнего кварцевого резонатора на 11,0592 МГц. За работу с GPS отвечает NEO-6M от U-blox, это хоть и старенький, но очень распространенный и недорогой модуль с достаточно точным определением координат. Информация выводится на дисплей от Nokia 3310 (5110). Еще в схеме присутствуют магнитометр HMC5883L и акселерометр ADXL335.

  1. SCL — вход тактирования шины I2C
  2. VDD — вход для подключения питания (кормится эта козявка напряжением в диапазоне 2,16-3,6 вольт)
  3. не используется
  4. S1 — дополнительное питание для портов ввода/вывода. Подключается напрямую к выводу VDDIO
  5. не используется
  6. не используется
  7. не исползуется
  8. SETP — первый вход для подключения керамического конденсатора на 0,22uF
  9. GND — земля
  10. С1 — еще один вход для подключения конденсатора. Электролитичиского или танталового на 4,7uF (другой конец конденсатора подключается к земле)
  11. GND — земля
  12. SETC — второй вход для подключения керамического конденсатора на 0,22uF
  13. VDDIO — вход для подключения напряжения которое будет на портах ввода/вывода
  14. не используется
  15. Выход прерывания, когда данные готовы на этом выводе появляется логическая 1
  16. SDA — линия данных интерфейса I2C

Печатная плата навигатора

Схема и плата спроектированы в системе EasyEDA.

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

Включение и выключение устройства происходит длинным нажатием на кнопку S5. После включения и поиска спутников (при холодном старте может уйти до 10 минут или даже больше) мы можем посмотреть текущие координаты, нажав на кнопку S2.

Координаты конечной точки можно посмотреть нажав на кнопку S3.

Нажав кнопку S4 попадаем в меню сохранения точки. Сохранить точку можно двумя способами:

  1. сохранить текущие координаты

2. забить координаты вручную

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

Вернуться в режим следования к точке можно по короткому нажатию на кнопку S5

Теперь об использовании магнитометра и акселерометра. Для расчета азимута используются данные полученные с GPS приемника, поэтому в случае если рассчитать координаты не возможно (например если спутники не видны или их мало) пропадает возможность и рассчитать направление в котором нужно двигаться, чтобы придти к точке. И первоначально моя задумка была в том, чтобы использовать магнитометр как вспомогательное средство для указания курса. Но столкнулся с некоторыми трудностями.

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

Во-вторых, заметно сказывается различие магнитного склонения в разных частях Земли. Например в Поволжье магнитное склонение составляет 13°, а на другом конце страны склонение уже 11° и в другую сторону. А ведь есть еще и магнитное наклонение — когда линии магнитного поля входят или выходят под углом к горизонту, и много других факторов влияющих на показания.

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

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

Это устройство станет незаменимым помощником тем, кто любит побродить по лесу, грибникам, лыжникам, туристам и другим любителям природы!

Используемые в устройстве компоненты (их можно заказать в интернет-магазине из Китая):

  • GPS модуль NEO-6M
  • ЖК дисплей
  • Магнитометр HMC5883
  • Акселерометр ADXL335

Корпус для направлятора

ПОДЕЛИТЕСЬ С ДРУЗЬЯМИ

П О П У Л Я Р Н О Е:

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

Выход один: попытаться смонтировать самому.

Камерой для упрощенной модели инкубатора могут по­служить обыкновенные картонные коробки, оклеенные внут­ри и снаружи слоями плотной бумаги, деревянные каркасы, обшитые с обеих сторон фанерой или пластиком, заполнен­ные внутри и между стенками стекловатой, сухими опилка­ми, пенопластом. Подробнее…

Управление скоростью вращения двигателя на LM3578

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

Парогенератор для душевой кабины своими руками

У кого нет возможности построить свою баню, а попариться очень хочется, то можно установить в душевую кабину или ванную комнату парогенератор. Купить парогенератор довольно дорогое удовольствие (стоит дороже кабинки :), а вот как сделать парогенератор своими руками я вам расскажу в этой статье. Подробнее…

Источник

Gps навигация своими руками

Сообщение vks » 19 мар 2020, 23:50

Небольшой мануал по сборке навигатора на базе RaspberryPi

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

Навигатор испытан на железе:

Raspberry Pi 3 A (Быстрая и компактная версия Распберри с одним USB. Недостаток — греется при работе). Стоит на фото выше.
Raspberry Pi 4 B (Очень быстрая, греется так же как и третья версия, но имеет бОльшие размеры)
Raspberry Pi Zero W (Медленная версия Распберри, но не греется и не жрет. Подходит для софта Navit)

Читайте также:  Идеи для моторики рук своими руками

HDMI TFT 7″ display с емкостным сенсором (можно взять с Алиэкспресса дисплей 10 или 12 дюймов, что удобнее)

GPS приемник. Cтавлю GNSS GG1802, питание 5 вольт.

Запитана от импульсного стаба 12/5 В типа DD4012SA. Стоит sd card на 8Гб.

GPS приемник запитан от отдельного стабилизатора L7805 для минимизации помех. Подключен по UART к serial0 RPi.

TX вывод приемника подключаем через резисторный делитель 5.1/10кОм (ВАЖНО!) подключен к выводу 10 RPi (RX, GPIO15).

Я не нашел коротких HDMI кабелей для подключения RPi к дисплею. Видимо дефицит. Поэтому взял магазинный, укоротил, удалил пластик с разъема и распаял. Там около 5 витых пар в индивидуальных экранах.

Стоит иметь ввиду, что у каждой версии распберри свой разъем HDMI:

RPi 3 обычный HDMI, подойдет простой кабель
RPi 4 micro HDMI, нужен переходник
RPi Zero W, mini HDMI нужен другой переходник

Емкостный тачскрин подключается проводами к RPi по USB.

Питание планируется от бортовой сети 12В. Распберри и экран запитаны с импульсного 5В стабилизатора. GPS приемник с отдельного L7805.

Из доступного софта имеется: отечественный софт 7 Дорог от Навиком (7ways) и буржуйский Navit (последний работает напрямую с картами Garmin и мне понравился больше).

Качаем навигационный софт для ARM — 7 дорог от Навикома (сборка 1308).
https://navikey.ru/files/7w/7ways-1308/ . pi-arm.zip

Ставим на флешку дистрибутив Linux NOOBS v2.9.0.
ВАЖНО! Более новые версии Raspbian Booster не идут с 7ways. Проблема с библиотекой libcurl4. (CURL_OPENSSL_3 not found). Кто знает, как профиксить проблему, дайте знать.

Подключаем клаву. Заходим в терминал (Alt+F2, выполняем команду lxterminal)

Заходим в Interfacing Options

Включаем SSH (Для Raspberry 3 c Wi-Fi)
Включаем Serial (Login Shell — NO, Enable Serial — YES)

Проверяем работу GPS приемника:

Данные с приемника должны приходить раз в 1 секунду и быть в подобном формате:

После того, как приемник нашел спутники, пустые поля должны заполниться актуальными данными

Подключаем WiFi к Raspberry.

Подключаемся удаленно по SSH к Raspberry (для RPi3 и RPi Zero W это очень удобно — по WiFi) с помощью программы PuTTY.

На удаленном компе расшариваем средствами Windows папку, к примеру, RaspberryPi.
В нее кидаем 7ways и карты в папке 7ways/maps.

Создаем пустую папку share

Монтируем на распберри нашу расшаренную папку с софтом

>sudo mount.cifs //192.168.178.xxx/RaspberryPi /home/pi/share/ -o user=

Проверяем что данные видно:

Далее копируем содержимое на флешку:

Далее заходим в папку с 7ways

Если работаем удаленно по SSH, то перед запуском делаем экспорт дисплея
> export DISPLAY=:0.0

После запуска программы с помощью сенсорного экрана (или мыши) заходим в Satellites

Ставим галку Use Port
Подключаем клаву к Raspberry. В поле PORT пишем /dev/ttyS0 (в ряде случаев может подойти /dev/ttyAMA0)
В поле SPEED 9600

Берем Гарминовские карты. Открываем в GPSMapEdit 2.1.

Заходим в Свойства Карты -> Уровни. Записываем себе таблицу уровней Level0-Level5.

Конвертируем карту в Польский формат .mp — Файл->Сохранить как

Ставим себе утилиту для конвертации карт в формат 7w — 7WaysConv

В папке с утилитой редактируем текстовый файл layers.dat согласно таблице уровней см. выше.

Выбираем карту в Польском формате .mp . Выбираем файл с конфигой config_with_layers.cfg
Конвертируем.

Копируем карту 7W в папку 7ways/maps

>cp share/gmapsup2.7w 7ways/maps/gmapsup2.7w

Перезапускаем 7ways. Проверяем отображение карты. Готово.

1. Отрисовка ландшафта 7ways не самая точная. Город и дороги рисует хорошо.
2. На RPi Zero W программа жутко тормозит. Поэтому только RPi 3, 4
3. Внутри корпуса качество приема GPS сигнала оставляет желать лучшего, попробую данную панель с внешней GPS антенной. К тому же стоять он будет под металлическим потолком.

Позже сдлаю схему подключения и мануал по программе Navit.

Источник

GPS приемник своими руками на модуле EB-500 и AVR

Приемник выдает следующие данные:

  1. Координаты – широту, долготу и высоту точки, в которой находится
  2. Время по гринвичу – часы, минуты, секунды
  3. Общее число спутников, обнаруженных приемником
  4. Число спутников, с которых принимается сигнал.

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

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

Модуль ЕВ-500 прекрасно подходит для мобильных приложений, так как имеет небольшие габариты и малое потребление тока.

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

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

Напряжение питания от 3 до 4.2 вольт.

Связь с модулем – по двум равноценным UART.

Выводы UART — TX0,RX0 и TX1,RX1.

На вывод GPS status подключен через резистор светодиод. Пока связь со спутниками не установлена на выходе логическая 1-светодиод горит постоянно, при обнаружении спутников мигает с частотой 1 Гц. После отладки схемы его можно снять.

Вывод V_RTC_3V3 – на этот вывод необходимо подать питание, без этого модуль не запустится. Можно соединить с питанием модуля, но лучше подключить стандартную литиевую батарейку типа CR на 3 вольта, тогда все настройки сохранятся в памяти модуля и после отключения приемника. Потребление RTC всего 1 мкА, так что батарейки хватит надолго.

Питание подается на вывод VIN_3V3.

Антенна подключается на вывод RF_INPUT. Дорожка, соединяющая вывод модуля с фидером антенны должна быть как можно короче с земляным полигоном по бокам. У меня антенна пассивная

35*35 с полигоном под ней 70*70. Запустилась без проблем даже в тумане на лесной поляне. И точность весьма приличная.

Хорошая активная антенна дорого стоит, хороший МШУ вещь не из дешевых. Дешевая китайская антенна, в условиях сильных помех показала себя хуже пассивной, как видно там усилитель не совсем малошумящий. Кроме того питается она от 3,3 вольт минимум, а с модуля подается в линию

2,8 В. Поэтому надо отсекать конденсатором постоянное напряжение на выводе RF_INPUT, вскрывать антенну, заводить внешнее питание — много мороки.

Антенну не стоит размещать рядом с модулем, чтобы шумы от модуля не мешали.

Это на карту GOOGLE нанесены координаты измеренной точки. Расстояние от стенки дома до воды метров 10. Мы с приемником стояли метрах в трех от воды.

После того, как модуль будет распаян на плате, подключено питание VIN_3V3 и V_RTC_3V3, антенна и по свечению светодиода вы убедились, что все у вас работает — надо проверить скорость обмена UART. Это необходимо для программирования USAR(синхронно асинхронный приемопередатчик) микроконтроллера.

Соедините RX1,TX1 или RX0,TX0 через MAX3232(работает от 3 вольт) с COM портом компьютера. Для USB можно спаять переход на FT232RL -недорогая надежная микросхема с драйверами для всех ОС. У меня заработала сразу без проблем.

Проверьте скорость, на которой отзовется модуль, по даташиту это 9600 у меня заработал на 115200. Если не отзовется – перебирайте скорости. Сигнал для этого не обязателен – светодиод может и не мигать. Я пользуюсь терминалом в CVAVR или программой Terminal v1.9b бесплатная и очень удобная.

Обмен происходит по протоколу NMEA 0183.

Обвязка ATMEGA 16 стандартная. Вывод REZET подтянут к питанию резистором 10 кОм. Тактовая частота задается кварцевым резонатором 7.3728 мГц. Питание на АЦП микроконтроллера подается через LC фильтр — дроссель 10 мкГн, конденсатор 1 мкФ. Вывод источника опорного напряжения АЦП AREF соединен с выводом питания АЦП. Разъем для программатора на схеме не показан. К порту B подключен LCD дисплей WH1604B — 4 строки по 16 символов. Подстроечным резистором R2 20 кОм регулируется контрастность. Кнопка на подсветке тактовая с целью экономии заряда аккумулятора.

Читайте также:  Как правильно начать строить баню своими руками

Между UART модуля и USART микроконтроллера в качестве гальванической развязки установлена микросхема ADUM1201. Максимальная амплитуда импульсов от модуля, если смотреть осциллографом не больше 2,8 В. Микроконтроллер воспринимает импульс, как единицу от 2.5 В. Микросхема поднимет амплитуду импульса до 5 вольт — величины напряжения питания микроконтроллера. Во избежание сбоев ADUM лучше поставить.

AT24C128 микросхема электрически стираемого и программируемого постоянного запоминающего устройства (ЭСППЗУ) с интерфейсом шины I2C – память приемника, где и будут храниться данные всех 200 точек, но об этом позже. Выводы CDL –синхронизации последовательной связи и CDA -последовательной передачи данных и адреса должны быть подтянуты к питанию резистором 4.7-5.1кОм. Вывод WP- защита от записи соединен с GND. Выводы A0,A1- выводы адресации используются, если на шину подключены несколько микросхем, возможны 4 комбинации. У нас одна микросхема, поэтому выводы A0,A1 соединены с GND – адрес равен нулю.

На операционном усилителе собран делитель. Напряжение от аккумулятора делится пополам и подается на вход АЦП микроконтроллера — бит 0 порта A, для контроля величины напряжения литиевого аккумулятора.

Клавиатура для общения с приемником собрана на тактовых кнопках. Кнопки ЧТЕНИЕ и ЗАПИСЬ – тактовые. Кнопка НАВЕДЕНИЕ – с фиксацией. Резисторы 300 Ом нужны для ограничения тока, чтобы случайно не спалить порт микроконтроллера.

Теперь о питании приемника. У меня стоит литиевый аккумулятор на 3.7 вольта, при полной зарядке примерно 4.15 В. Для питания микроконтроллера с кварцем 7.3728 мГц и дисплея WH1604 надо 5 вольт. Хотя в даташите на дисплей и стоит Vdd от 3 до 5 вольт, но при стандартной схеме регулирования контрастности и напряжении питания 3.3 вольта не видно ничего.

На модуль EB-500 желательно подавать 3.3 вольта. На микросхеме LM2623 собран повышающий импульсный стабилизатор на 5 вольт. Микросхема LM2623 разработана специально для цифровой аппаратуры, у нее низкий уровень шумов и минимум обвязки. Конденсаторы C4 и C5 установлены дополнительно для уменьшения шумов.

Питание для модуля EB-500 получаем с выхода линейного стабилизатора LP2980-3.3. Микросхема с очень низким собственным потреблением, потери на ней максимально 50 мВт, очень мало греется, а получаем стабилизированные 3.3 вольта практически без шумов.

Теперь о программе. Использован компилятор CodeVisionAVR.

Протокол NMEA 0183 содержит много всякой полезной информации, но нас интересуют только координаты, время, высота над уровнем моря, число видимых и используемых спутников. Поэтому выбираем только 3 сообщения (нужная информация выделена красным):

1.$GPRMC,181057.000, A ,5542.2389,N,03741.6063,E,0.47,74.50,190311. A*51

Здесь нас интересует символ под номером 18 (отсчет начинаем с 0) это если это A то данные достоверны (есть сигнал), если V — недостоверны.

2.$GPGGA, 181058 .000, 5542.2389 ,N,0 3741.6063 ,E,1, 8 ,1.34, 115.0 ,M,14.6,M,,*54

Отсюда берем почти всю информацию.

181058 .000 — время

5542.2389 ,N — широта

03741.6063 ,E — долгота

1 — GPS fix ( 0 = Данные не верны, 1 = Позиция зафиксирована, 2 = DGPS (повышенная точность))

8 — количество использованных спутников

1.34 — HDOP, горизонтальная точность

115.0 ,M — высота над уровнем моря

14.6,M — Геоидальное различие — различие между земным эллипсоидом WGS-84 и уровнем моря(геоидом)

— время с момента последнего обновления DGPS, отсутствует.

3.$GPGSV,4,1, 13 ,28,65,075,17,26,53,202,37,15,50,278,17,27,39,290,24*7D

Здесь нас интересует символы номер 11 и 12.

13 — Полное число видимых спутников.

Сразу после включения приемника запускается АЦП (установкой единицы в 6 бит регистра ADCSRA АЦП микроконтроллера) для проверки уровня заряда литиевого аккумулятора. В подпрограмме прерывания по завершению преобразования АЦП забираются и суммируются 100 значений из регистра данных, а затем вычисляется среднее значение напряжения аккумулятора. Если напряжение на аккумуляторе ниже или равно 3.2 вольта на экран дисплея выводится сообщение “Аккумулятор разряжен”. Предельное напряжение, до которого может разрядиться аккумулятор 2.7 вольта. Лучше покупать аккумулятор с контроллером заряда.

Регистр USART микроконтроллера UCSRB=0x90 это означает, что разрешено прерывание по завершению приема и включен приемник. Функция обработки прерывания по завершению приема состоит в следующем:

Данные забираются из буферного регистра UDR при условии, что (UCSRA&=0x18)==0 ,то есть в регистре UCSRA не стоит флаг ошибки кадрирования и флаг переполнения. Если приемник находится в режиме записи или чтения (переменная flag=1), то данные просто забираются из буфера приемника USART , чтобы не было переполнения буфера. Попытки отключать на это время приемник USART приводили к потере связи с модулем. Если flag=0, принятые из буфера данные анализируются. Если найдено начало строки — символ $ по коду ASCII это 36, вся строка до конца — код 13(возврат каретки) помещается в массив gps. Затем проверяем символы из gps[3], gps[4] и gps[5], ищем сочетание RMC, GGA или GSV все остальные сообщения игнорируются. Если сообщение RMC, переменную a приравниваем к элементу массива gps[18], если GSV – вычисляем из символов, находящихся в gps[11]и gps[12] число видимых спутников. Если это GGA переходим из функции обработки прерывания в основную программу. В программе сначала проверяем переменную а, если она равна 86 это символ V по коду ASCII — отсутствие сигнала, на дисплей выводится сообщение “Нет сигнала

Если переменная a = 65 — символ A это значит, что появился сигнал. Извлекаем из массива gps, куда помещено все сообщение GGA все интересующие нас данные. Вычисляем время, координаты, число спутников с которыми установлена связь, высоту над уровнем моря. Все эти данные плюс число видимых спутников, вычисленных в подпрограмме прерывания, помещаем в буферы для вывода на LCD, и выводим на экран дисплея. Получается вот такая картинка:

В первую строку выводится широта точки и число спутников, с которыми установлена связь, их семь. Вторая строка – долгота и число видимых спутников — 11. Третья строка – время по гринвичу и высота над уровнем моря или океана.

Для записи данных нажимаем кнопку “Запись”. Все данные сохраняются во внешней памяти микросхеме ЭСППЗУ EEPROM AT24C128 с интерфейсом шины I2C. Память микросхемы организована как 16384 слов по 8 бит в каждом. Внутренне 16384 байта памяти разделены на 256 страниц по 64 байта в каждой. Запись может производиться как побайтно, так и страницами. Для упрощения жизни выбрана постраничная запись. Адрес микросхемы один байт: три старших бита адрес AT24C он всегда 101, последний бит обозначает запись или чтение. Если ноль – запись, единица – чтение. Адресация памяти — два байта, старшие биты номер страницы младшие – номер слова в этой странице. Получается: номера страниц от 0 до 255 это 8 бит плюс номера слов в странице от 0 до 63 еще 6 бит, так что для адресации памяти надо 14 бит. Чтобы получить старший байт берем номер страницы и сдвигаем его вправо на две позиции — два старших бита обнулятся, а в шесть младших переместятся 6 старших бита адреса страницы. Затем тот же номер страницы сдвигаем влево на шесть позиций и получаем младший байт адреса, где два старших бита это два младших бита адреса страницы остальные шесть – нули. Теперь надо запомнить номер адреса внешней памяти для записываемой точки. Для этого используем энергонезависимую память микроконтроллера — EEPROM. Для ATMEGA16 EEPROM составляет 512 байт. Размещаем в EEPROM два массива eeprom unsigned char ad[201] и eeprom unsigned char opred[201]. Массив ad указывает на свободную страницу памяти АТ24С128, единица означает, что страница занята, ноль — свободна. Например: ad[20]=0 означает, что страница 20 памяти АТ24С128 свободна, а если ad[20]=1 , тогда занята. Перед тем, как записать данные во внешнюю память перебираем все элементы массива ad, инкременируя номер элемента g от 0, пока не будет найдено условие ad[g]=0. Адрес страницы внешней памяти будет равен g. Теперь запоминаем соответствие адреса страницы памяти АТ24С128 номеру запоминаемой точки. opred[номер точки]=g (адресу страницы памяти АТ24С128). Если надо стереть данные точки, то в ad[номер стираемой точки] записываем ноль, а в массиве opred перемещаем номера элементов, так чтобы, начиная от номера точки на единицу больше стираемой: opred[номер точки]= opred[номер точки-1], а номер общего числа записанных точек уменьшаем на единицу. Если же надо стереть все данные из памяти, то число записанных точек и массив ad обнуляем. При записи новых данных в память АТ24С128 старые данные стираются. Переменная nomer указывающая на общее число записанных точек так же размещается в EEPROM микроконтроллера.

Читайте также:  Как сделать рентгеновский снимок своими руками

Запись происходит так:

— Нажимаем и удерживаем 50 мс (задержка в 50 мс – защита от дребезга контактов установлена на всех кнопках) кнопку “ЗАПИСЬ”. На экран дисплея в первую строку выводится: “ Tочка:(№точки)” номер точки, записанной в EEPROM микроконтроллера при этом инкременируется . Если номер точки больше 200, появляется сообщение “ Память занята ” и приемник выходит из режима запись. Во вторую строку надо ввести с клавиатуры название точки до 16 символов из цифр и строчных букв русского алфавита. Принцип ввода такой же, как в мобильном телефоне: нажимать на кнопку клавиатуры, пока не появится нужный символ. При ошибке набора стирается символ решеткой. Выводы клавиатуры подключены к битам 3,4 , 5 порта D и к битам 2,3,4,5 порта C. Биты порта D сконфигурированы как выходы, биты порта C как входы с подтяжкой. На биты порта D с частотой 5мс подается низкий уровень и при этом считывается значение битов порта С. Например если на PIND.3 подан ноль и логический ноль появился на PINС.2 значит, активна кнопка К4 – 3дежз. Кнопка активна 2.2 секунды — 16 битный таймер T1 запускается с частотой 28800 Гц при появлении нуля на соответствующем бите порта C. При переходе таймера через значение 65535 генерируется прерывание и программа переходит в функцию обработки прерывания по переполнения таймера. Если до истечения 2.2 секунды стала активна другая кнопка, то, как и в случае переполнения таймера — таймер останавливается, а все значения, набранные на ранее активной кнопке, обнуляются. После набора названия точки — нажимаем *. В третью строку выводиться сообщение “Текущая точка?” Если надо запомнить точку, определяемую приемником в данный момент времени нажимаем *, на дисплей выводится сообщение “Точка записана ” и приемник выходит из режима запись. Если вводятся координаты с карты, тогда нажимаем #, на экране выводится запрос “Широта?” Вводим координаты широты восемь цифр без точек — 49˚52’16.54″ вводятся, как 49521654 затем нажимаем *, выводится запрос “Долгота?” так же вводится и долгота, вместо 36˚18’51.57″ — 36185157 и затем *.

На дисплей выводится сообщение “ Точка записана ” и приемник выходит из режима запись. При записи координат с карты значение высоты не записывается и при чтении координат этой точки высота равна нулю. Запись в EEPROM AT24C128 постранично происходит так:

  1. Формируется условие старта – переход из высокого в низкое состояние на выводе SDA при высоком уровне на выводе SCL.
  2. Передается байт с адресом микросхемы 10100000 последний бит 0 – запись.
  3. Предается первый байт адреса памяти, затем второй байт адреса памяти.
  4. Передаются байты данных, адреса слов в странице при этом инкременируются. Изменения на выводе SDA происходят, когда на выводе SCL низкий уровень.
  5. Формируется условие останова – переход из низкого в высокое состояние на выводе SDA при высоком уровне на выводе SCL.

Для чтения данных из памяти приемника надо нажать кнопку “Чтение” ( при этом с 7 бита порта C считывается логический ноль ) и на дисплей выводится: “ Точка:”. Набираем номер точки координаты, которой хотим прочитать, и жмем *. На экран выводятся координаты нашей точки. При вводе номера точки в режиме чтения, на клавиатуре доступны только цифры. Если вводится число номер, которого превышает число записанных точек — выводится сообщение “Нет данных”, затем возвращается сообщение: “ Точка:”. Если в памяти прибора нет сохраненных данных, то при нажатии на кнопку “Чтение” выводится сообщение “Нет данных” и прибор выходит из режима чтения. Читаем из EEPROM AT24C128 так: стартовые, стоповые условия и адресация такие же, как при записи. Адрес, по которому записаны координаты считываемой точки (в программе номер этой точки обозначен переменной nomer_1) находим в массиве opred EEPROM микроконтроллера. Старший байт адреса будет opred[nomer_1]>>2, младший opred[nomer_1] Листать данные можно по возрастанию номеров точек цифрой 2 на клавиатуре, по убыванию нулем. Выход из режима чтения #. В режиме чтения данные можно стереть по одной точке или все разом. Выводим на экран точку, данные которой надо стереть и нажимаем *. В конце первой строки появляется “ Стр? ” Для подтверждения *, если нет — #. Если надо стереть все данные, тогда последовательно нажимаем *, появляется “ Стр? ” , жмем на 1, вместо “ Стр? ” появляется “ Все? ” если подтверждение — *, нет — жмем на #. При стирании в массив EEPROM микроконтроллера — ad, указывающим на свободный адрес страницы в памяти AT24C128 записывается ноль в элемент, с номером равным адресу страницы в AT24C128 стираемой точки. Данные из этой страницы стираются при записи в нее других данных, поэтому не стоит отключать приемник в режиме запись, пока не появится сообщение “ Точка записана ”.

В приемнике предусмотрен режим наведения. В этом режиме определяется расстояние и истинный азимут от точки, в которой находится приемник до любой точки, выбранной из памяти приемника. Для перевода приемника в режим наведения нажмем кнопку “Наведение” при этом со второго бита порта D считывается логический ноль. На экран дисплея выводится запрос “Точка: ” необходимо ввести номер точки расстояние и азимут, до которой будет вычисляться, и нажать *. Координаты этой точки помещаются в массив kr размещенный в EEPROM микроконтроллера. На экран дисплея выводится номер и название точки, затем выводится сообщение “Наведение” и экран дисплея приобретает следующий вид:

В начало четвертной строки выводится азимут (287˚1’48»), за ним расстояние до интересующей нас точки(3284 метра). Так что можно ходить по азимуту, если конечно, компас есть. Магнитное склонение – разница между магнитным и истинным азимутом указано на многих картах. Формулы, по которым вычисляются азимут и расстояние взяты из учебника по геодезии и переработанны для работы с переменной типа float. Координаты точки наведения хранятся в энергонезависимой памяти микроконтроллера, поэтому, если оставить кнопку “Наведение” нажатой и выключить прибор, то после включения прибора продолжится наведение на ту же точку. Для того, чтобы изменить точку наведения надо отжать кнопку, дождаться появления сигнала и набрать номер новой точки.

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

Что касается фьюзов, у меня запрограммированы только BODEN – включена схема сброса при снижении напряжения питания и SUT1 – управляет режим запуска тактового генератора при включенной схеме сброса. Остальные не запрограммированы, то есть равны единице.

Источник

Оцените статью