GPS代表全球定位系統(tǒng),用于檢測地球上任何位置的緯度和經(jīng)度,具有精確的UTC時間(協(xié)調(diào)世界時)。該設(shè)備每秒接收來自衛(wèi)星的坐標,包括時間和日期。GPS 提供了很高的準確性,并且除了位置坐標之外還提供其他數(shù)據(jù)。
我們都知道 GPS 是一個非常有用的設(shè)備,在手機和其他便攜式設(shè)備中非常常用來跟蹤位置。它在各個領(lǐng)域都有非常廣泛的應用,從在家中叫出租車到跟蹤飛機的高度。
在本教程中,我們將GPS 模塊與 STM32F103C8 微控制器連接,以查找位置坐標并將其顯示在16x2 LCD 顯示屏上。
所需組件
STM32F103C8微控制器
GPS模塊
16x2 液晶顯示器
面包板
連接電線
GPS模塊
這是一個 GY-NEO6MV2 XM37-1612 GPS 模塊。該 GPS 模塊有四個引腳 +5V、GND、TXD 和 RXD。它使用串行引腳進行通信,并且可以輕松地與 STM32F103C8 的串行端口連接。
GPS 模塊 以 NMEA 格式發(fā)送數(shù)據(jù)(參見下面的屏幕截圖)。NMEA 格式由幾個句子組成,其中我們只需要一個句子。這句話從 $GPGGA開始 ,包含坐標、時間和其他有用的信息。此 GPGGA 稱為 全球定位系統(tǒng)修復數(shù)據(jù)。
下面是一個示例 $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,,校驗和數(shù)據(jù)
但是在本教程中,我們使用了一個TinyGPSPlus GPS 庫,它從 NMEA 語句中提取所有需要的信息,我們只需要編寫一行簡單的代碼來獲取緯度和經(jīng)度,我們將在本教程后面看到。
STM32F103C8 的引腳輸出
STM32F103C8 (BLUE PILL) USART 串??行通信端口如下圖所示。這些是藍色的(PA9-TX1、PA10-RX1、PA2-TX2、PA3-RX2、PB10-TX3、PB11-RX3)。它有三個這樣的溝通渠道。
電路圖和連接
GPS模塊和STM32F103C8之間的電路連接
16x2 LCD 和 STM32F103C8 之間的連接
整個設(shè)置如下所示:
本項目末尾給出了使用 STM32 使用 GPS 模塊查找位置的完整程序。STM32F103C8 可以使用 Arduino IDE 進行編程,只需通過 USB 端口將其連接到 PC。確保在上傳代碼時移除引腳 TX 和 RX,并在上傳后連接。
要將 GPS 與 STM32 連接,首先我們必須從 GitHub 鏈接TinyGPSPlus下載一個庫。下載庫后,可以通過Sketch -》 Include Library -》 Add .zip Library 將其包含在 Arduino IDE 中。相同的庫可用于將GPS 與 Arduino 接口。
所以首先包含必要的庫文件并為 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)建一個名為TinyGPSPlus 類的gps對象。
TinyGPSPlus 全球定位系統(tǒng);
接下來在void setup中,使用Serial1.begin(9600)開始與 GPS 模塊的串行通信。Serial1 用作 STM32F103C8 的 Serial 1 端口(Pins-PA9、PA10)。
Serial1.開始(9600);
然后顯示一段時間的歡迎信息。
lcd.開始(16,2); lcd.print("電路文摘"); lcd.setCursor(0,1); lcd.print("STM32 帶 GPS"); 延遲(4000); lcd.clear();
接下來在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();
如果接收到無效數(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("長:"); lcd.print(lng_val,6); 延遲(4000);
以下函數(shù)提供讀取數(shù)據(jù)的延遲。它一直在尋找串行端口上的數(shù)據(jù)。
靜態(tài)無效 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è)置并上傳代碼后,請確保將 GPS 模塊放置在空曠區(qū)域以快速接收信號。有時需要幾分鐘才能收到信號,所以請等待一段時間。當 GPS 模塊開始接收信號時,LED 將開始閃爍,并且 LCD 顯示屏上會顯示位置坐標。
您可以使用谷歌地圖驗證位置的緯度和經(jīng)度。只需打開 GPS 轉(zhuǎn)到 Google 地圖,然后單擊藍點。它將顯示帶有緯度和經(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的對象gps
無效設(shè)置()
{
Serial1.begin(9600);//在串行端口 1 以 9600 波特率開始串行通信
lcd.begin(16,2); //設(shè)置顯示為 16x2 模式
lcd.print("Circuit Digest");
lcd.setCursor(0,1);
lcd.print("STM32 帶 GPS");
延遲(4000);
lcd.clear();
}
無效循環(huán)()
{
GPSDelay(1000);
無符號長開始;
雙緯度,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 接收到無效數(shù)據(jù)時執(zhí)行
{
lcd.print("Waiting");
Serial.print("緯度:");
Serial.println("*****");
Serial.print("經(jīng)度:");
Serial.println("*****");
延遲(4000);
lcd.clear();
}
else //從 GPS 接收到有效數(shù)據(jù)時執(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("長:");
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文章
7489瀏覽量
151051 -
GPS模塊
+關(guān)注
關(guān)注
0文章
87瀏覽量
16426 -
LCD顯示屏
+關(guān)注
關(guān)注
1文章
91瀏覽量
13273 -
STM32F103C8
+關(guān)注
關(guān)注
1文章
23瀏覽量
8074
發(fā)布評論請先 登錄
相關(guān)推薦
評論