Подключение GPS модуля к микроконтроллеру PIC


Глобальная система навигации и определения положения (Global Positioning System, GPS) – это система, позволяющая определять такие параметры текущего местоположения как ее высота, долгота, широта, всеобщее скоординированное время (UTC) и многое другое по информации, получаемой от нескольких спутников.

Считать данные GPS можно с помощью практически любого современного микроконтроллера (платы). В данной статье мы рассмотрим подключение GPS модуля к микроконтроллеру PIC и считывание GPS данных с его помощью. В качестве GPS модуля мы выбрали G7020 от компании U-blox. С его помощью мы будем определять значения широты и долготы для нашего текущего местоположения и отображать их на экране ЖК дисплея 16х2.

Внешний вид подключения GPS модуля к микроконтроллеру PIC

Также на нашем сайте мы рассматривали подключение GPS модуля к другим микроконтроллерам (платам):

Необходимые компоненты

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. GPS модуль uBLOX-G7020 (купить на AliExpress).
  3. Держатель микросхем на 40 контактов (купить на AliExpress).
  4. Программатор PICkit 3 (купить на AliExpress).
  5. Кварцевый генератор 20 МГц (купить на AliExpress).
  6. Конденсаторы 33 пФ – 2 шт. (купить на AliExpress).
  7. Резистор 4,7 кОм (купить на AliExpress).
  8. Адаптер на 5 В.
  9. ЖК дисплей 16х2 (купить на AliExpress).
  10. Потенциометр 10 кОм (купить на AliExpress).
  11. Макетная плата.
  12. Соединительные провода.

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

Схема подключения GPS модуля к микроконтроллеру PIC представлена на следующем рисунке.

Схема подключения GPS модуля к микроконтроллеру PICВ представленной схеме контакты RS, R/W и E ЖК дисплея подключены к контактам RB0, RB1 и RB2 микроконтроллера PIC, а контакты D4, D5, D6, D7 ЖК дисплея подключены к контактам RB4, RB5, RB6 и RB7 микроконтроллера. ЖК дисплей подключен в 4-битном режиме. Более подробно о его подключении к микроконтроллеру PIC вы можете прочитать в этой статье.

Кварцевый генератор 20MHz с помощью двух керамических конденсаторов 33 пФ подключен к контактам OSC1 и OSC2 микроконтроллера PIC. Он будет обеспечивать стабильную тактовую частоту для микроконтроллера.

GPS модуль uBlox-G7020 будет принимать данные от спутников и передавать их в микроконтроллер PIC16F877A через последовательный порт связи (USART). Более подробно про использование последовательного порта в микроконтроллерах PIC вы можете прочитать в этой статье.

GPS модуль uBlox-G7020 имеет цветовое обозначение проводов, выходящих из него. Его положительный (для подачи питания 5V) провод красного цвета, общий провод (GND) – черного цвета, а выходной провод – синего цвета.

Получение данных GPS

GPS данные модуль uBlox-G7020 передает на свой выход в виде нескольких строк со скоростью 9600 бод. Если мы включим терминал последовательного порта (UART terminal) на скорости 9600 бод, то мы увидим эти данные.

Модуль uBlox-G7020 передает GPS данные в так называемом формате NMEA, который состоит из нескольких строк. Четырьмя самыми важными строками в нем являются:

  • $GPGGA: Global Positioning System Fix Data (фиксированные данные глобального местоположения);
  • $GPGSV: GPS satellites in view (спутники GPS в нашей зоне действия);
  • $GPGSA: GPS DOP and active satellites (активные спутники);
  • $GPRMC: Recommended minimum specific GPS/Transit data (специализированные данные GPS/транзитные данные).

Более подробные сведения об NMEA формате можно получить здесь (на английском языке).

Пример принимаемых GPS данных выглядит следующим образом:

В нашем проекте из всех GPS данных нам будут нужны только координаты широты и долготы, их мы будем извлекать из строки $GPGGA, остальные строки мы будем игнорировать. Пример строки $GPGGA выглядит следующим образом:

Что означают эти данные:
1. Строка $GPGGA всегда начинается со знака “$”.
2. GPGGA означает фиксированные данные системы глобального позиционирования.
3. Запятая “,” разделяет различные значения в строке.
4. 141848.00: GMT время 14(часов):18(минут):48(секунд):00(мс).
5. 2237.63306,N: широта 22 (градуса) 37 (минут) 63306 (секунд). N (North) – северная.
6. 08820.86316,E: долгота 088 (градусов) 20 (минут) 86316 (секунд). E (East) – восточная.
7. 1 : фиксированное качество 0= invalid data (неправильные данные), 1= (правильные данные), 2=DGPS fix
8. 03 : количество спутников, с которыми в данный момент поддерживается связь.
9. 1.0: HDOP.
10. 2.56,M : высота над уровнем моря в метрах.
11. 1.9,M : Geoids height (геоидная высота).
12. *74 : контрольная сумма.

Таким образом, в нашем проекте нам понадобятся только данные из 5-й и 6-й позиций данной строки.

Шаги для подключения GPS модуля к микроконтроллеру PIC

  1. Настроить биты конфигурации микроконтроллера.
  2. Настроить порт, к которому подключен ЖК дисплей.
  3. Соединить GPS модуль с микроконтроллером PIC через последовательный порт связи (USART).
  4. Сконфигурировать USART для работы в режиме непрерывного приема со скоростью 9600 бод. Сконфигурировать ЖК дисплей для работы в 4-битном режиме.
  5. Инициализировать два символьных массива. Один – для приема данных широты, второй – для приема данных долготы.
  6. Принимать по одному символу и проверять является ли этот символ $ или нет.
  7. Если обнаружили символ $, то потом следует проверить следуют ли за ним символы GPGGA и запятая.
  8. Если это строка GPGGA, то пропускаем в ней первые данные (всемирного времени) и находим в ней данные широты и долготы. Эти данные последовательно сохраняем в два наших символьных массива до тех пор пока не встретим в строке символы N (North) и E (East).
  9. Выводим значения массивов на ЖК дисплей.
  10. Очищаем массивы.

Тестирование работы проекта

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Первым делом в программе настраиваются биты конфигурации, более подробно про их настройку можно прочитать в этой статье. Также в программе необходимо подключить заголовочные файлы используемых библиотек: lcd.h – для работы с ЖК дисплеем, eusart.h – для работы с USART, xc.h – для компилятора XC8.

Далее, в функции main(), функция system_init() используется для инициализации ЖК дисплея и последовательного порта (USART).

Функции lcd_init() и EUSART_Intialize() вызываются из библиотек lcd.h and eusart.h.

Затем в цикле while мы последовательно, бит за битом, принимаем данные строки GPGGA и сравниваем принятые символы с теми, которые содержатся в строке GPGGA.

С помощью следующего фрагмента кода мы пропускаем данные с всемирным временем (UTC time).

Затем сохраняем значения широты и долготы в символьные массивы.

И, наконец, выводим значения широты и долготы на экран ЖК дисплея.

Исходный код программы

Файлы для скачивания: GPS-with-PIC-header-file.zip.

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
340 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *