GPS代表全球定位系統(tǒng),用于檢測(cè)地球上任何位置的緯度和經(jīng)度,具有精確的UTC時(shí)間(協(xié)調(diào)世界時(shí))。該設(shè)備每秒接收來(lái)自衛(wèi)星的坐標(biāo),包括時(shí)間和日期。GPS 提供了很高的準(zhǔn)確性,并且除了位置坐標(biāo)之外還提供其他數(shù)據(jù)。
我們都知道 GPS 是一個(gè)非常有用的設(shè)備,在手機(jī)和其他便攜式設(shè)備中非常常用來(lái)跟蹤位置。它在各個(gè)領(lǐng)域都有非常廣泛的應(yīng)用,從在家中叫出租車到跟蹤飛機(jī)的高度。
在本教程中,我們將GPS 模塊與 STM32F103C8 微控制器連接,以查找位置坐標(biāo)并將其顯示在16x2 LCD 顯示屏上。
所需組件
STM32F103C8微控制器
GPS模塊
16x2 液晶顯示器
面包板
連接電線
GPS模塊
這是一個(gè) GY-NEO6MV2 XM37-1612 GPS 模塊。該 GPS 模塊有四個(gè)引腳 +5V、GND、TXD 和 RXD。它使用串行引腳進(jìn)行通信,并且可以輕松地與 STM32F103C8 的串行端口連接。
GPS 模塊 以 NMEA 格式發(fā)送數(shù)據(jù)(參見(jiàn)下面的屏幕截圖)。NMEA 格式由幾個(gè)句子組成,其中我們只需要一個(gè)句子。這句話從 $GPGGA開(kāi)始 ,包含坐標(biāo)、時(shí)間和其他有用的信息。此 GPGGA 稱為 全球定位系統(tǒng)修復(fù)數(shù)據(jù)。
下面是一個(gè)示例 $GPGGA 字符串及其描述:
$GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
$GPGGA,HHMMSS.SSS,latitude,N,longitude,E,F(xiàn)Q,NOS,HDP,altitude,M,height,M,,校驗(yàn)和數(shù)據(jù)
但是在本教程中,我們使用了一個(gè)TinyGPSPlus GPS 庫(kù),它從 NMEA 語(yǔ)句中提取所有需要的信息,我們只需要編寫一行簡(jiǎn)單的代碼來(lái)獲取緯度和經(jīng)度,我們將在本教程后面看到。
STM32F103C8 的引腳輸出
STM32F103C8 (BLUE PILL) USART 串??行通信端口如下圖所示。這些是藍(lán)色的(PA9-TX1、PA10-RX1、PA2-TX2、PA3-RX2、PB10-TX3、PB11-RX3)。它有三個(gè)這樣的溝通渠道。
電路圖和連接
GPS模塊和STM32F103C8之間的電路連接
16x2 LCD 和 STM32F103C8 之間的連接
整個(gè)設(shè)置如下所示:
本項(xiàng)目末尾給出了使用 STM32 使用 GPS 模塊查找位置的完整程序。STM32F103C8 可以使用 Arduino IDE 進(jìn)行編程,只需通過(guò) USB 端口將其連接到 PC。確保在上傳代碼時(shí)移除引腳 TX 和 RX,并在上傳后連接。
要將 GPS 與 STM32 連接,首先我們必須從 GitHub 鏈接TinyGPSPlus下載一個(gè)庫(kù)。下載庫(kù)后,可以通過(guò)Sketch -》 Include Library -》 Add .zip Library 將其包含在 Arduino IDE 中。相同的庫(kù)可用于將GPS 與 Arduino 接口。
所以首先包含必要的庫(kù)文件并為 16x2 LCD 定義引腳:
#include#include const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
然后創(chuàng)建一個(gè)名為TinyGPSPlus 類的gps對(duì)象。
TinyGPSPlus 全球定位系統(tǒng);
接下來(lái)在void setup中,使用Serial1.begin(9600)開(kāi)始與 GPS 模塊的串行通信。Serial1 用作 STM32F103C8 的 Serial 1 端口(Pins-PA9、PA10)。
Serial1.開(kāi)始(9600);
然后顯示一段時(shí)間的歡迎信息。
lcd.開(kāi)始(16,2); lcd.print("電路文摘"); lcd.setCursor(0,1); lcd.print("STM32 帶 GPS"); 延遲(4000); lcd.clear();
接下來(lái)在void loop() 中,我們從 GPS 接收經(jīng)緯度,并檢查接收到的數(shù)據(jù)是否有效,并在串行監(jiān)視器和 LCD 中顯示信息。
檢查可用的位置數(shù)據(jù)是否有效
loc_valid = gps.location.isValid();
接收緯度數(shù)據(jù)
lat_val = gps.location.lat();
接收經(jīng)度數(shù)據(jù)
lng_val = gps.location.lng();
如果接收到無(wú)效數(shù)據(jù),則串行監(jiān)視器顯示“*****”,LCD 顯示“等待”。
if (!loc_valid) { lcd.print("Waiting"); Serial.print("緯度:"); Serial.println("*****"); Serial.print("經(jīng)度:"); Serial.println("*****"); 延遲(4000); lcd.clear(); }
如果接收到有效數(shù)據(jù),則緯度和經(jīng)度將顯示在串行監(jiān)視器以及 LCD 顯示屏上。
lcd.clear(); Serial.println("GPS 讀數(shù):"); Serial.print("緯度:"); Serial.println(lat_val, 6); lcd.setCursor(0,0); lcd.print("緯度:"); lcd.print(lat_val,6); Serial.print("經(jīng)度:"); Serial.println(lng_val, 6); lcd.setCursor(0,1); lcd.print("長(zhǎng):"); lcd.print(lng_val,6); 延遲(4000);
以下函數(shù)提供讀取數(shù)據(jù)的延遲。它一直在尋找串行端口上的數(shù)據(jù)。
靜態(tài)無(wú)效 GPSDelay(unsigned long ms) { unsigned long start = millis(); do { while (Serial1.available()) gps.encode(Serial1.read()); } while (millis() - start < ms); }
使用 GPS 和 STM32 查找緯度和經(jīng)度
建立設(shè)置并上傳代碼后,請(qǐng)確保將 GPS 模塊放置在空曠區(qū)域以快速接收信號(hào)。有時(shí)需要幾分鐘才能收到信號(hào),所以請(qǐng)等待一段時(shí)間。當(dāng) GPS 模塊開(kāi)始接收信號(hào)時(shí),LED 將開(kāi)始閃爍,并且 LCD 顯示屏上會(huì)顯示位置坐標(biāo)。
您可以使用谷歌地圖驗(yàn)證位置的緯度和經(jīng)度。只需打開(kāi) GPS 轉(zhuǎn)到 Google 地圖,然后單擊藍(lán)點(diǎn)。它將顯示帶有緯度和經(jīng)度的地址,如下圖所示
#include
#include
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //LCD引腳與STM32
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
TinyGPSPlus 全球定位系統(tǒng);//類TinyGPSPlus的對(duì)象gps
無(wú)效設(shè)置()
{
Serial1.begin(9600);//在串行端口 1 以 9600 波特率開(kāi)始串行通信
lcd.begin(16,2); //設(shè)置顯示為 16x2 模式
lcd.print("Circuit Digest");
lcd.setCursor(0,1);
lcd.print("STM32 帶 GPS");
延遲(4000);
lcd.clear();
}
無(wú)效循環(huán)()
{
GPSDelay(1000);
無(wú)符號(hào)長(zhǎng)開(kāi)始;
雙緯度,lng_val;
布爾 loc_valid;
lat_val = gps.location.lat(); //獲取緯度
loc_valid = gps.location.isValid();
lng_val = gps.location.lng(); //獲取經(jīng)度
if (!loc_valid) //從 GPS 接收到無(wú)效數(shù)據(jù)時(shí)執(zhí)行
{
lcd.print("Waiting");
Serial.print("緯度:");
Serial.println("*****");
Serial.print("經(jīng)度:");
Serial.println("*****");
延遲(4000);
lcd.clear();
}
else //從 GPS 接收到有效數(shù)據(jù)時(shí)執(zhí)行
{
lcd.clear();
Serial.println("GPS 讀數(shù):");
Serial.print("緯度:");
Serial.println(lat_val, 6); //在串行監(jiān)視器打印緯度
lcd.setCursor(0,0);
lcd.print("緯度:");
lcd.print(lat_val,6); //在LCD顯示屏上打印緯度
Serial.print("經(jīng)度:");
Serial.println(lng_val, 6); //在串口監(jiān)視器上打印經(jīng)度
lcd.setCursor(0,1);
lcd.print("長(zhǎng):");
lcd.print(lng_val,6); //在液晶顯示屏上打印經(jīng)度
延遲(4000);
}
}
static void GPSDelay(unsigned long ms) //從 GPS 接收數(shù)據(jù)的延遲
{
unsigned long start = millis();
do
{
while (Serial1.available())
gps.encode(Serial1.read());
} while (millis() - start < ms);
}
-
微控制器
+關(guān)注
關(guān)注
48文章
7458瀏覽量
150859 -
GPS模塊
+關(guān)注
關(guān)注
0文章
87瀏覽量
16410 -
LCD顯示屏
+關(guān)注
關(guān)注
1文章
91瀏覽量
13246 -
STM32F103C8
+關(guān)注
關(guān)注
1文章
23瀏覽量
8068
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論