GPS是全球定位系統(tǒng)的簡(jiǎn)稱(chēng)。它是一個(gè)提供準(zhǔn)確的高度,緯度,經(jīng)度,UTC時(shí)間和更多信息的系統(tǒng),這些信息來(lái)自2,3,4或更多衛(wèi)星。要從GPS讀取數(shù)據(jù),我們需要一些微控制器,我們已經(jīng)將GPS與Arduino和Raspberry Pi連接在一起。
我們選擇了由U-blox制造的G7020 GPS模塊。我們將從衛(wèi)星接收特定位置的經(jīng)度和緯度,并將在 16x2 字符 LCD 上顯示相同的經(jīng)度和緯度。因此,在這里我們將通過(guò)微芯片將GPS與PIC16F877A微控制器連接。
所需組件:
Pic16F877A – PDIP40 封裝
面包板
皮基特-3
5V 適配器
液晶顯示器 JHD162A
uBLOX-G7020 全球定位系統(tǒng)模塊
用于連接外圍設(shè)備的電線。
4.7k 電阻器
10k鍋
20mHz 晶體
2 個(gè) 33pF 陶瓷電容器
電路圖和說(shuō)明:-
16x2字符LCD通過(guò)PIC16F877A微控制器連接,其中RB0,RB1,RB2分別連接到LCD引腳RS,R / W和E.RB4,RB5,RB6和RB7通過(guò)LCD的4針D4,D5,D6,D7連接。液晶屏以4位模式或半字節(jié)模式連接。
一個(gè) 20MHz 的晶體振蕩器,帶有兩個(gè) 33pF 的陶瓷電容器,連接在 OSC1 和 OSC2 引腳上。它將為微控制器提供恒定的20 MHz時(shí)鐘頻率。
uBlox-G7020 GPS模塊,使用UART接收和傳輸數(shù)據(jù)。PIC16F877A由芯片內(nèi)部的一個(gè)USART驅(qū)動(dòng)器組成,我們將通過(guò)USART從GPS模塊接收數(shù)據(jù),因此將從微控制器Rx引腳到GPS的Tx引腳和USART接收引腳通過(guò)GPS的傳輸引腳連接進(jìn)行交叉連接。
uBlox-G7020 具有引腳的顏色代碼。正極或5V引腳為紅色,負(fù)極或GND引腳為黑色,傳輸引腳為藍(lán)色。
我已經(jīng)在面包板上連接了所有這些。
從 GPS 獲取位置數(shù)據(jù):
讓我們看看如何使用 USART 連接 GPS,并在 16x2 字符 LCD 中查看結(jié)果。
該模塊將以 9600 波特率在多個(gè)字符串中傳輸數(shù)據(jù)。如果我們使用波特率為9600的UART終端,我們將看到GPS接收的數(shù)據(jù)。
GPS模塊以NMEA格式發(fā)送實(shí)時(shí)跟蹤位置數(shù)據(jù)(請(qǐng)參見(jiàn)上面的屏幕截圖)。NMEA格式由幾個(gè)句子組成,其中四個(gè)重要句子如下。
這是GPS在9600波特率連接時(shí)接收的數(shù)據(jù)。
$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
當(dāng)我們使用GPS模塊跟蹤任何位置時(shí),我們只需要坐標(biāo),我們可以在字符串中找到$GPGGA。只有$GPGGA(全球定位系統(tǒng)修復(fù)數(shù)據(jù))字符串主要用于程序,其他字符串被忽略。
$GPGGA,141848.00,2237.63306,N,08820.86316,E,1,03,2.56,1.9,M,-54.2,M,,*74
這句話是什么意思?
該行的含義是:-
1. 字符串始終以“$”符號(hào)開(kāi)頭
2. GPGGA 代表 全球定位系統(tǒng)定位數(shù)據(jù)
3. “,”逗號(hào)表示兩個(gè)值之間的分隔
4. 141848.00:格林威治標(biāo)準(zhǔn)時(shí)間為 14(小時(shí)):18(分鐘):48(秒):00(毫秒)
5. 2237.63306,N:北緯22度(度)37(分)63306(秒)北緯
6. 08820.86316,E:東經(jīng)088(度)20(分)86316(秒)
7. 1:修復(fù)數(shù)量0=無(wú)效數(shù)據(jù),1=有效數(shù)據(jù),2=DGPS修復(fù)
8. 03 : 當(dāng)前查看的衛(wèi)星數(shù)量。
9. 1.0: HDOP
10. 2.56,米:海拔高度(海拔高度,單位:米)
11. 1.9,M : 大地水準(zhǔn)面高度
12. *74 : 校驗(yàn)和
因此,我們需要 5 號(hào)和 6 號(hào)來(lái)收集有關(guān)模塊位置或模塊位置的信息。
將GPS與PIC微控制器連接的步驟:-
設(shè)置微控制器的配置,包括振蕩器配置。
使用 USART 將 GPS 模塊連接到微控制器。
在連續(xù)接收模式下初始化系統(tǒng) USART,波特率為 9600,LCD 具有 4 位模式。
根據(jù)緯度和經(jīng)度的長(zhǎng)度采用兩個(gè)字符數(shù)組。
一次接收一個(gè)字符位,并檢查它是否從 $ 開(kāi)始。
如果 $ 接收,那么它是一個(gè)字符串,我們需要檢查 GPGGA、這 5 個(gè)字母和逗號(hào)。
如果是 GPGGA,那么我們將跳過(guò)時(shí)間,并尋找緯度和經(jīng)度,我們將緯度和經(jīng)度存儲(chǔ)在兩個(gè)字符數(shù)組中,直到 N(北)和 E(東)未收到。
我們將在LCD中打印陣列。
清除陣列。
代碼說(shuō)明:
讓我們逐行查看代碼。前幾行用于設(shè)置配置位,這些配置位在上一個(gè)教程中已經(jīng)解釋過(guò),所以我現(xiàn)在跳過(guò)它們。本教程末尾給出了完整的代碼。
這五行用于包括庫(kù)頭文件,lcd.h 和 eusart.h 分別用于 LCD 和 USART。xc.h 用于微控制器頭文件。
#include
#include
#include
#include "supporing_cfilelcd.h"
#include "supporing_cfileeusart1.h"
在 void main() 函數(shù)中,system_init();函數(shù)用于初始化LCD和USART。
Void main(void) {
TRISB = 0x00; // Setting as output
system_init();
lcd_init(); 和 EUSART_Intialize(); 從兩個(gè)庫(kù) lcd.h 和 eusart.h 調(diào)用
void system_init(void){
lcd_init(); // This will initialise the lcd
EUSART1_Initialize(); // This will initialise the Eusart
}
在 while 循環(huán)中,我們中斷 GPGGA 字符串以獲取經(jīng)度和緯度坐標(biāo)。我們一次接收一位,并將其與 GPGGA 字符串中存在的單個(gè)字符進(jìn)行比較。
我們打破了我們將得到的代碼:-
incomer_data=EUSART1_Read(); // Check the string '$GPGGA,'
/*------------------------------ Step by step finding the GPGGA line----------------------------*/
if(incomer_data=='$'){ // First statement of the GPS data start with a $ sign
incomer_data=EUSART1_Read(); // If the first if become true then the next phase
if(incomer_data=='G'){
incomer_data=EUSART1_Read();
if(incomer_data=='P');{
incomer_data=EUSART1_Read();
if(incomer_data=='G');{
incomer_data=EUSART1_Read();
if(incomer_data=='G'){
incomer_data=EUSART1_Read();
if(incomer_data=='A'){
incomer_data=EUSART1_Read();
if(incomer_data==','){ // first , received
incomer_data=EUSART1_Read(); // At this stage Final check in done, GPGGA is found.
通過(guò)使用此代碼,我們跳過(guò)了 UTC 時(shí)間。
while (incomer_data != ','){ // skipping GMT Time
incomer_data=EUSART1_Read();
}
此代碼用于將緯度和經(jīng)度數(shù)據(jù)存儲(chǔ)在字符數(shù)組中。
incomer_data=EUSART1_Read();
latitude[0] = incomer_data;
while(incomer_data != ','){
for(array_count=1;incomer_data!='N';array_count++){
incomer_data=EUSART1_Read();
latitude[array_count]=incomer_data; // Store the Latitude data
}
incomer_data=EUSART1_Read();
if(incomer_data==','){
for(array_count=0;incomer_data!='E';array_count++){
incomer_data=EUSART1_Read();
longitude[array_count]=incomer_data; // Store the Longitude data
}
}
最后,我們?cè)贚CD上打印了經(jīng)度和緯度。
array_count=0;
lcd_com(0x80); // LCD line one selection
while(array_count<12){ // Array of Latitude data is 11 digit
lcd_data(latitude[array_count]); // Print the Latitude data
array_count++;
}
array_count=0;
lcd_com(0xC0); // Lcd line two selection
while(array_count<13){ // Array of Longitude data is 12 digit
lcd_data(longitude[array_count]); // Print the Longitude data
array_count++;
}
這就是我們?nèi)绾螌PS模塊與PIC微控制器連接以獲取當(dāng)前位置的緯度和經(jīng)度。
/*
* File: main.c
* Author: Sourav Gupta
* By:- circuitdigest.com
* Created on April 1, 2018, 2:26 PM
*/
// PIC16F877A Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#include
#include
#include
#include "supporing_cfilelcd.h"
#include "supporing_cfileeusart1.h"
/*
Hardware related definition
*/
#define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay
/*
Other Specific definition
*/
void system_init(void);
unsigned char incomer_data = 0;
unsigned char longitude[13];
unsigned char latitude[13];
unsigned int array_count=0;
/* Sample line received from the GPS :-
[$GPGGA,100156.000,2690.9416,N,07547.8441,E,1,08,1.0,442.8,M,-42.5,M,,0000*71]
1. string always starts with a ?$? sign
2. GPGGA : Global Positioning System Fix Data
3. ?,? Comma indicates the separation between two values
4. 100156.000 : GMT time as 10(hr):01(min):56(sec):000(ms)
5. 2650.9416,N: Latitude 26(degree) 50(minutes) 9416(sec) North
6. 07547.8441,E: Longitude 075(degree) 47(minutes) 8441(sec) East
7. 1 : Fix Quantity 0= invalid data, 1= valid data, 2=DGPS fix
8. 08 : Number of satellites currently viewed.
9. 1.0: HDOP
10. 442.8,M : Altitude (Height above sea level in meter)
11. -42.5,M : Geoids height
12. __ , DGPS data
13. 0000 : DGPS data
14. *71 : checksum
*/
void main(void) {
TRISB = 0x00; // Setting as output
system_init(); // System getting ready and initialising the LCD and USART driver.
//LCD_ScrollMessage("Circuitdigest.com");
while(1){
incomer_data=EUSART1_Read(); // Check the string '$GPGGA,'
/*------------------------------ Step by step finding the GPGGA line----------------------------*/
if(incomer_data=='$'){ // First statement of the GPS data start with a $ sign
incomer_data=EUSART1_Read(); // If the first if become true then the next phase
if(incomer_data=='G'){
incomer_data=EUSART1_Read();
if(incomer_data=='P');{
incomer_data=EUSART1_Read();
if(incomer_data=='G');{
incomer_data=EUSART1_Read();
if(incomer_data=='G'){
incomer_data=EUSART1_Read();
if(incomer_data=='A'){
incomer_data=EUSART1_Read();
if(incomer_data==','){ // first , received
incomer_data=EUSART1_Read(); // At this stage Final check in done, GPGGA is found.
while (incomer_data != ','){ // skipping GMT Time
incomer_data=EUSART1_Read();
}
incomer_data=EUSART1_Read();
latitude[0] = incomer_data;
while(incomer_data != ','){
for(array_count=1;incomer_data!='N';array_count++){
incomer_data=EUSART1_Read();
latitude[array_count]=incomer_data; // Store the Latitude data
}
incomer_data=EUSART1_Read();
if(incomer_data==','){
for(array_count=0;incomer_data!='E';array_count++){
incomer_data=EUSART1_Read();
longitude[array_count]=incomer_data; // Store the Longitude data
}
}
array_count=0;
//lcd_com(0x80); // LCD line one selection
while(array_count<12){ // Array of Latitude data is 11 digit?
lcd_data(latitude[array_count]); // Print the Latitude data
array_count++;
}
array_count=0;
lcd_com(0xC0); // Lcd line two selection
while(array_count<13){ // Array of Longitude data is 12 digit?
lcd_data(longitude[array_count]); // Print the Longitude data
array_count++;
}
//lcd_com(0x01); //clear LCD
}
}
}
}
}
}
}
}
for(array_count=0;array_count<=13;array_count++){?
incomer_data=0;
latitude[array_count]=0;
longitude[array_count]=0;
}
array_count = 0;
}
}
/*
This Function is for system initialisations.
*/
void system_init(void){
lcd_init(); // This will initialise the lcd
EUSART1_Initialize(); // This will initialise the Eusart
}
-
微控制器
+關(guān)注
關(guān)注
48文章
7552瀏覽量
151423 -
gps
+關(guān)注
關(guān)注
22文章
2895瀏覽量
166235 -
PIC16F877A
+關(guān)注
關(guān)注
2文章
43瀏覽量
21814
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論