- Необходими компоненти:
- Електрическа схема и обяснение: -
- Получаване на данни за местоположението от GPS:
- Стъпки за интерфейс на GPS с PIC микроконтролер: -
- Обяснение на кода:
GPS е кратката форма на Глобална система за позициониране. Това е система, която предоставя точна надморска височина, ширина, дължина, UTC време и много повече информация, която се взема от 2, 3, 4 или повече сателита. За да четем данни от GPS, имаме нужда от микроконтролер и вече сме свързали GPS с Arduino и с Raspberry Pi.
Избрахме GPS модул G7020, който е направен от U-blox. Ще получим дължина и ширина на определена позиция от сателит и ще ги покажем на LCD с 16x2 знака. Така че тук ще свържем GPS с микроконтролера PIC16F877A от микрочип.
Необходими компоненти:
- Pic16F877A - пакет PDIP40
- Дъска за хляб
- Pickit-3
- 5V адаптер
- LCD JHD162A
- uBLOX-G7020 GPS модул
- Кабели за свързване на периферни устройства.
- 4.7k резистори
- 10к пот
- 20mHz кристал
- 2 бр. 33pF керамични кондензатори
Електрическа схема и обяснение: -
LCD с 16x2 знака е свързан през микроконтролера PIC16F877A, в който RB0, RB1, RB2 е свързан съответно към LCD извода, който е RS, R / W и E. RB4, RB5, RB6 и RB7 са свързани през 4-пиновите D4, D5 на LCD, D6, D7. LCD дисплеят е свързан в 4-битов режим или режим на хапване. Научете повече за свързването на LCD с микроконтролера PIC.
Кристален осцилатор от 20MHz с два керамични кондензатора от 33pF, свързани през OSC1 и OSC2 щифт. Той ще осигури постоянна тактова честота от 20 MHz на микроконтролера.
uBlox-G7020 GPS модул, приема и предава данни с помощта на UART. PIC16F877A се състои от един USART драйвер вътре в чипа, ние ще получаваме данни от GPS модул от USART, така че ще бъде направена кръстосана връзка от микроконтролера Rx щифт към GPS Tx щифт и USART Receive щифт, свързан през GPS Transmit pin.
UBlox-G7020 има цветен код за щифтовете. Положителният или 5V щифт е в червен цвят, отрицателният или GND щифт е в черен цвят, а щифтът за предаване е в син цвят.
Всичко това съм го свързал в макет.
Получаване на данни за местоположението от GPS:
Нека да видим как да свързваме GPS с помощта на USART и да видим резултата в LCD с 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, A, A * 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 (hr): 18 (min): 48 (sec): 00 (ms)
5. 2237.63306, N: Географска ширина 22 (градус) 37 (минути) 63306 (сек) север
6. 08820.86316, E: Географска дължина 088 (градус) 20 (минути) 86316 (сек) изток
7. 1: Fix Quantity 0 = невалидни данни, 1 = валидни данни, 2 = DGPS корекция
8. 03: Брой гледани сателити в момента.
9. 1.0: HDOP
10. 2,56, М: Надморска височина (Височина над морското равнище в метри)
11. 1.9, М: Височина на геоидите
12. * 74: контролна сума
Така че ние се нуждаем от № 5 и № 6, за да съберем информация за местоположението на модула или къде се намира.
Стъпки за интерфейс на GPS с PIC микроконтролер: -
- Задайте конфигурациите на микроконтролера, които включват конфигурация на осцилатора.
- Задайте желания порт за LCD, включително TRIS регистър.
- Свържете GPS модула към микроконтролера с помощта на USART.
- Инициализирайте системата USART в режим на непрекъснато приемане, с 9600 скорости на предаване и LCD с 4-битов режим.
- Вземете два символни масива в зависимост от дължината на географската ширина и дължина.
- Получавайте по един символен бит наведнъж и проверявайте дали е стартиран от $ или не.
- Ако $ Receive значи е низ, трябва да проверим GPGGA, това 5 букви и запетая.
- Ако е GPGGA, тогава ще прескочим времето и ще търсим Географска ширина и Географска дължина, Ще съхраняваме Географската ширина и Географска дължина в двусимволен масив, докато N (Север) и E (Изток) не бъдат получени.
- Ще отпечатаме масива в LCD.
- Изчистете масива.
Обяснение на кода:
Нека разгледаме кода ред по ред. Първите няколко реда са за настройка на битове за конфигурация, които бяха обяснени в предишния урок, така че засега ги пропускам. Пълният код е даден в края на този урок.
Тези пет реда се използват за включване на заглавни файлове на библиотеката, lcd.h и eusart.h е съответно за LCD и USART. И xc.h е за заглавния файл на микроконтролера.
#include
Във функцията void main () , system_init () ; функцията се използва за инициализиране на LCD и USART.
Главно празно (празно) { TRISB = 0x00; // Задаване като изход system_init ();
В lcd_init (); и EUSART_Intialize (); се извиква от двете библиотеки lcd.h и eusart.h
void system_init (void) { lcd_init (); // Това ще инициализира lcd EUSART1_Initialize (); // Това ще инициализира Eusart }
В цикъл while прекъсваме низа GPGGA, за да получим координатите за дължина и ширина. Получаваме по един бит наведнъж и го сравняваме с отделни символи, присъстващи в GPGGA низ.
Разбиваме кодовете, които ще получим: -
incomer_data = EUSART1_Read (); // Проверете низа '$ GPGGA,' / * ------------------------------ Стъпка по стъпка намиране на линията GPGGA- --------------------------- * / if (incomer_data == '$') {// Първото изявление на GPS данните започва с $ sign incomer_data = EUSART1_Read (); // Ако първата, ако стане истина, следващата фаза if (incomer_data == 'G') { incomer_data = EUSART1_Read (); if (incomer_data == 'P'); { incomer_data = EUSART1_Read (); ако (incomer_data == 'G'); { incomer_data = EUSART1_Read (); ако (incomer_data == 'G') { incomer_data = EUSART1_Read (); ако (incomer_data == 'A') { incomer_data = EUSART1_Read (); if (incomer_data == ',') {// първо, получено incomer_data = EUSART1_Read (); // На този етап Окончателното чекиране е направено, GPGGA е намерен.
Чрез използването на този код прескачаме времето по UTC.
while (incomer_data! = ',') {// прескачане на GMT Time incomer_data = EUSART1_Read (); }
Този код е за съхраняване на данни за Latitude и Longitude в масива от знаци.
incomer_data = EUSART1_Read (); географска ширина = incomer_data; while (incomer_data! = ',') { for (array_count = 1; incomer_data! = 'N'; array_count ++) { incomer_data = EUSART1_Read (); географска ширина = incomer_data; // Съхраняваме данните на Latitude } incomer_data = EUSART1_Read (); if (incomer_data == ',') { for (array_count = 0; incomer_data! = 'E'; array_count ++) { incomer_data = EUSART1_Read (); дължина = incomer_data; // Съхраняваме данните за дължина } }
И накрая отпечатахме географска дължина и ширина на LCD.
array_count = 0; lcd_com (0x80); // LCD ред един избор, докато (array_count <12) {// Масивът от данни за Latitude е 11 цифрен lcd_data (latitude); // Отпечатваме array_count на Latitude данни ++; } array_count = 0; lcd_com (0xC0); // Избор на Lcd ред две докато (array_count <13) {// Масивът от данни за дължина е 12 цифрен lcd_data (дължина); // отпечатваме array_count на данни за дължина ++; }
Ето как можем да свържем GPS модула с PIC Microcontroller, за да получим географската ширина и дължина на текущото местоположение.
Пълните файлове с кодове и заглавки са дадени по-долу.