- Необходимые компоненты:
- Принципиальная схема и пояснения: -
- Получение данных о местоположении от GPS:
- Шаги по взаимодействию GPS с микроконтроллером PIC: -
- Пояснение к коду:
GPS - это сокращение от Global Positioning System. Это система, которая обеспечивает точную высоту, широту, долготу, время UTC и многие другие данные, полученные с 2, 3, 4 или более спутников. Для чтения данных с GPS нам нужен микроконтроллер, и мы уже связали GPS с Arduino и Raspberry Pi.
Мы выбрали GPS-модуль G7020 производства U-blox. Мы будем получать долготу и широту определенной позиции со спутника и отображать их на ЖК-дисплее размером 16x2 символов. Итак, здесь мы будем сопрягать GPS с микроконтроллером PIC16F877A с помощью микрочипа.
Необходимые компоненты:
- Pic16F877A - корпус PDIP40
- Хлебная доска
- Пикит-3
- Адаптер 5V
- ЖК-дисплей JHD162A
- GPS-модуль uBLOX-G7020
- Провода для подключения периферии.
- Резисторы 4,7 кОм
- 10к банк
- Кристалл 20 МГц
- 2 керамических конденсатора 33 пФ
Принципиальная схема и пояснения: -
ЖК-дисплей 16x2 символов подключен к микроконтроллеру PIC16F877A, в котором RB0, RB1, RB2 подключены соответственно к контакту ЖК-дисплея, который является RS, R / W и E. RB4, RB5, RB6 и RB7 подключены к 4 контактам ЖК-дисплея D4, D5, Д6, Д7. ЖК-дисплей подключен в 4-битном режиме или режиме полубайта. Узнайте больше о взаимодействии ЖК-дисплея с микроконтроллером PIC.
Кристаллический генератор на 20 МГц с двумя керамическими конденсаторами по 33 пФ, подключенными между выводами OSC1 и OSC2. Он будет обеспечивать микроконтроллер постоянной тактовой частотой 20 МГц.
uBlox-G7020 GPS-модуль, прием и передача данных с помощью UART. PIC16F877A состоит из одного драйвера USART внутри микросхемы, мы будем получать данные от модуля GPS с помощью USART, поэтому будет выполнено перекрестное соединение между выводом Rx микроконтроллера и выводом Tx GPS и выводом приема USART, подключенным к выводу передачи GPS.
UBlox-G7020 имеет цветовую маркировку контактов. Положительный вывод или вывод 5V имеет красный цвет, отрицательный вывод или вывод GND - черный цвет, а вывод передачи - синий цвет.
Все это я соединил в макете.
Получение данных о местоположении от GPS:
Давайте посмотрим, как взаимодействовать с GPS с помощью USART, и посмотрим результат на ЖК-дисплее 16x2 символов.
Модуль будет передавать данные в виде нескольких строк со скоростью 9600 бод. Если мы используем терминал UART со скоростью 9600 бод, мы увидим данные, полученные от GPS.
Модуль GPS отправляет данные о местоположении в реальном времени в формате NMEA (см. Снимок экрана выше). Формат NMEA состоит из нескольких предложений, в которых ниже приведены четыре важных предложения. Более подробную информацию о предложении NMEA и его формате данных можно найти здесь.
- $ GPGGA: данные о фиксации глобальной системы позиционирования
- $ GPGSV: видны спутники GPS
- $ GPGSA: GPS DOP и активные спутники
- $ GPRMC: рекомендуемый минимум конкретных данных GPS / транзита
Узнайте больше о данных GPS и строках NMEA здесь.
Это данные, полученные GPS при подключении на скорости 9600 бод.
$ GPRMC, 141848.00, A, 2237.63306, N, 08820.86316, E, 0.553,, 100418,,, A * 73 $ GPVTG,, T,, M, 0.553, N, 1.024, K, A * 27 $ GPGGA, 141848.00, 2237.63306, N, 08820.86316, E, 1,03,2,56,1,9, M, -54,2, M,, * 74 $ GPGSA, A, 2,06,02,05,,,,,,,,,, 2,75, 2,56,1,00 * 02 $ GPGSV, 1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324, * 76 $ GPGLL, 2237.63306, N, 08820.86316, E, 141848.00, А, А * 65
Когда мы используем модуль GPS для отслеживания любого местоположения, нам нужны только координаты, и мы можем найти их в строке $ GPGGA. Только строка $ GPGGA (Global Positioning System Fix Data) в основном используется в программах, а другие строки игнорируются.
$ GPGGA, 141848.00, 2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54.2, M,, * 74
Что означает эта строка?
Значение этой строки: -
1. Строка всегда начинается со знака «$».
2. GPGGA - это сокращение от Global Positioning System Fix Data.
3. «,» запятая обозначает разделение между двумя значениями.
4. 141848.00: GMT время как 14 (час): 18 (мин): 48 (сек): 00 (мс)
5. 2237.63306, N: 22 (градус) 37 (минуты) 63306 (сек) северной широты.
6. 08820.86316, E: 088 (градус) 20 (минуты) 86316 (сек) восточной долготы.
7. 1: количество исправлений 0 = недопустимые данные, 1 = действительные данные, 2 = исправление DGPS
8. 03: Количество просматриваемых в данный момент спутников.
9. 1.0: HDOP
10. 2,56, M: высота (высота над уровнем моря в метрах).
11. 1.9, M: высота геоидов.
12. * 74: контрольная сумма
Итак, нам нужны № 5 и № 6 для сбора информации о местонахождении модуля или о том, где он находится.
Шаги по взаимодействию GPS с микроконтроллером PIC: -
- Установите конфигурации микроконтроллера, которые включают конфигурацию осциллятора.
- Установите желаемый порт для ЖК-дисплея, включая регистр TRIS.
- Подключите модуль GPS к микроконтроллеру с помощью USART.
- Инициализируйте системный USART в режиме непрерывного приема со скоростью 9600 бод и ЖК-дисплеем с 4-битным режимом.
- Возьмите два массива символов в зависимости от длины широты и долготы.
- Получите по одному биту символа за раз и проверьте, запускается ли он с $ или нет.
- Если $ Receive, то это строка, нам нужно проверить GPGGA, эти 5 букв и запятую.
- Если это GPGGA, то мы пропустим время и будем искать широту и долготу. Мы будем хранить широту и долготу в двухсимвольном массиве до тех пор, пока не будут получены значения N (север) и E (восток).
- Будем распечатывать массив на LCD.
- Очистить массив.
Пояснение к коду:
Давайте посмотрим на код построчно. Первые несколько строк предназначены для настройки битов конфигурации, которые были объяснены в предыдущем руководстве, поэтому я пока их пропускаю. Полный код приведен в конце этого руководства.
Эти пять строк используются для включения файлов заголовков библиотеки, lcd.h и eusart.h предназначены для LCD и USART соответственно. А xc.h предназначен для заголовочного файла микроконтроллера.
#включают
В пустом главном () функции, то system_init () ; Функция используется для инициализации ЖК-дисплея и USART.
Void main (void) { TRISB = 0x00; // Устанавливаем как вывод system_init ();
Lcd_init (); и EUSART_Intialize (); вызывается из двух библиотек lcd.h и eusart.h
void system_init (недействительно) { lcd_init (); // Это инициализирует ЖК- дисплей EUSART1_Initialize (); // Это инициализирует Eusart }
В то время как цикл мы нарушаем строку GPGGA, чтобы получить долготу и широту координат. Мы получаем по одному биту за раз и сравниваем его с отдельными символами, присутствующими в строке GPGGA.
Взломав коды, мы получим: -
доход_данные = EUSART1_Read (); // Проверяем строку '$ GPGGA,' / * ------------------------------ Пошаговый поиск строки GPGGA- --------------------------- * / if (yieldr_data == '$') {// Первый оператор данных GPS начинается с знак $ yieldr_data = EUSART1_Read (); // Если первое if стало истинным, то следующая фаза if (yieldr_data == 'G') { yieldr_data = EUSART1_Read (); если (доходные_данные == 'P'); { доходные_данные = EUSART1_Read (); если (доходные_данные == 'G'); { доходные_данные = EUSART1_Read (); если (comer_data == 'G') { yieldr_data = EUSART1_Read (); если (comer_data == 'A') { yieldr_data = EUSART1_Read (); if (yieldr_data == ',') {// сначала получено доход_данные = EUSART1_Read (); // На этом этапе окончательная проверка завершена, GPGGA найден.
Используя этот код, мы пропускаем время UTC.
while (yieldr_data! = ',') {// пропуск времени по Гринвичуcomer_data = EUSART1_Read (); }
Этот код предназначен для хранения данных широты и долготы в массиве символов.
доход_данные = EUSART1_Read (); широта = поступления_данные; while (доход_данные! = ',') { для (количество_массивов = 1; данные_данных! = 'N'; количество_массивов ++) { доход_данные = EUSART1_Read (); широта = поступления_данные; // Сохраняем данные Latitude } yieldr_data = EUSART1_Read (); if (доход_данные == ',') { для (количество_массивов = 0; данные_данных! = 'E'; количество_массивов ++) { доход_данные = EUSART1_Read (); долгота = поступления_данные; // Сохраняем данные о долготе } }
И, наконец, мы напечатали долготу и широту на ЖК-дисплее.
array_count = 0; lcd_com (0x80); // Выбор первой строки ЖК-дисплея while (array_count <12) {// Массив данных широты состоит из 11 цифр lcd_data (latitude); // Распечатать данные широты array_count ++; } array_count = 0; lcd_com (0xC0); // Выбор второй строки ЖК- дисплея while (array_count <13) {// Массив данных долготы состоит из 12 цифр lcd_data (longitude); // Распечатать данные долготы array_count ++; }
Вот как мы можем связать модуль GPS с микроконтроллером PIC, чтобы получить широту и долготу текущего местоположения.
Полный код и заголовочные файлы приведены ниже.