0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用STM32F103C8的GPS模塊獲取位置坐標(biāo)

科技觀察員 ? 來(lái)源:circuitdigest ? 作者:Pramoth Thangavel ? 2022-09-08 15:03 ? 次閱讀

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)用,從在家中叫出租車(chē)到跟蹤飛機(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 的串行端口連接。

pYYBAGMYVcqAe-2zAAMhfr5X3hQ522.png

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ǔ)句中提取所有需要的信息,我們只需要編寫(xiě)一行簡(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è)這樣的溝通渠道。

poYBAGMYVcWAVgqzAAl4ObxQVCs507.png

電路圖和連接

pYYBAGMYVcGAPAoZAAIGs_OIIlM872.png

GPS模塊和STM32F103C8之間的電路連接

pYYBAGMYVb2AQy8gAAAN0rrc-L0227.png

16x2 LCD 和 STM32F103C8 之間的連接

poYBAGMYVbqAf1nkAAA4ZmRyAaU075.png

整個(gè)設(shè)置如下所示:

pYYBAGMYVbaAN9kcAAdRX34H6Qs600.png

為 GPS 模塊接口編程 STM32F103C8

本項(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è)名為T(mén)inyGPSPlus 類(lèi)的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)。

pYYBAGMYVa-AfrS8AAbn5WtRgbw915.png

您可以使用谷歌地圖驗(yàn)證位置的緯度和經(jīng)度。只需打開(kāi) GPS 轉(zhuǎn)到 Google 地圖,然后單擊藍(lán)點(diǎn)。它將顯示帶有緯度和經(jīng)度的地址,如下圖所示

poYBAGMYVauARECIAAV0zuLNT1Q953.png
#include //LCD顯示函數(shù)庫(kù)

#include //GPS函數(shù)庫(kù)


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);//類(lèi)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);

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7552

    瀏覽量

    151426
  • GPS模塊
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    16438
  • LCD顯示屏
    +關(guān)注

    關(guān)注

    1

    文章

    91

    瀏覽量

    13319
  • STM32F103C8
    +關(guān)注

    關(guān)注

    1

    文章

    23

    瀏覽量

    8088
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32F103C8控制伺服馬達(dá)的電路連接及代碼說(shuō)明

    伺服馬達(dá)(Servo motor)憑準(zhǔn)確、小型、高效,易用在機(jī)器人領(lǐng)域應(yīng)用廣泛,其高扭矩特性非常適合升降重物。本項(xiàng)目用電位器改變馬達(dá)轉(zhuǎn)子位置,用STM32F103C8(藍(lán)丸)控制伺服馬達(dá),用LCD顯示角度值。
    的頭像 發(fā)表于 07-04 10:28 ?6878次閱讀
    用<b class='flag-5'>STM32F103C8</b>控制伺服馬達(dá)的電路連接及代碼說(shuō)明

    使用ESP8266將STM32F103C8連接到互聯(lián)網(wǎng)的方法

    在本教程中,我們使用 ESP8266 將 STM32F103C8 連接到互聯(lián)網(wǎng)。在這里,我們將 ESP8266 Wi-Fi 模塊與我們的藍(lán)丸 STM32F103C8 板接口,并將數(shù)據(jù)發(fā)送到 ESP8266 網(wǎng)絡(luò)服務(wù)器上托管的網(wǎng)頁(yè)
    的頭像 發(fā)表于 10-28 17:25 ?1.1w次閱讀
    使用ESP8266將<b class='flag-5'>STM32F103C8</b>連接到互聯(lián)網(wǎng)的方法

    如何在STM32F103C8中使用中斷

    在本項(xiàng)目中,為了理解STM32F103C8中的中斷,我們將使用按鈕作為外部中斷。在這里,我們將從 0 開(kāi)始遞增一個(gè)數(shù)字并將其顯示在 16x2 LCD 上,每當(dāng)按下按鈕時(shí),LED 就會(huì)亮起,LCD 顯示屏就會(huì)顯示中斷。松開(kāi)按鈕后,LED 立即熄滅。
    的頭像 發(fā)表于 11-03 17:11 ?2533次閱讀
    如何在<b class='flag-5'>STM32F103C8</b>中使用中斷

    將伺服電機(jī)與STM32F103C8板連接起來(lái)的教程

    在本教程中,我們將了解伺服電機(jī)以及如何將伺服與STM32F103C8板連接。 還連接了一個(gè)電位計(jì)來(lái)改變伺服電機(jī)軸的位置,和一個(gè)LCD來(lái)顯示角度值。
    發(fā)表于 11-04 14:49 ?3013次閱讀
    將伺服電機(jī)與<b class='flag-5'>STM32F103C8</b>板連接起來(lái)的教程

    STM32F103C8

    有人用過(guò)STM32F103C8嗎?CAN總線與它連接時(shí)應(yīng)該接那兩個(gè)引腳,說(shuō)明書(shū)里沒(méi)有具體的說(shuō)法,謝謝啦
    發(fā)表于 08-04 20:32

    stm32f103c8

    近期買(mǎi)了一塊stm32f103c8的系統(tǒng)板,苦于沒(méi)有對(duì)應(yīng)資料學(xué)習(xí),哪位神給介紹下。網(wǎng)上找過(guò)很多資料,可差不多都是和指定開(kāi)發(fā)板相關(guān)的,不好入門(mén)啊。{:23:}
    發(fā)表于 07-14 10:57

    移植Alios Things 到STM32F103C8

    python配置Image開(kāi)發(fā)環(huán)境pip阿里云大使aliosthingsstm32f103c8移植Alios Things 到STM32F103C8一:開(kāi)發(fā)環(huán)境搭建1.1、配置編譯環(huán)境:您可以嘗試
    發(fā)表于 10-17 11:38

    stm32f103C8如何移植FreeRTOS

    命名為FreeRTOS。選擇芯片STM32F103C8。3、搭建工程框架,打開(kāi)官方固件庫(kù)包:1)將STM32F10x_StdPeriph_Lib_V3.5.0\Libraries...
    發(fā)表于 08-24 07:57

    IAP在STM32F103C8上的實(shí)現(xiàn)

    IAP 在STM32F103C8上的實(shí)現(xiàn)已經(jīng)在[STM32F103C8在應(yīng)用編程(IAP)介紹及實(shí)現(xiàn)]具體講解了。但由于STM32F030C8STM32F103C8在中斷向量表上的設(shè)
    發(fā)表于 03-02 07:34

    STM32F103C8的電路原理圖免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32F103C8的電路原理圖免費(fèi)下載。
    發(fā)表于 04-23 17:14 ?63次下載
    <b class='flag-5'>STM32F103C8</b>的電路原理圖免費(fèi)下載

    基于STM32F103C8 輸入捕獲實(shí)驗(yàn)

    基于STM32F103C8 輸入捕獲實(shí)驗(yàn)-目的該項(xiàng)目是在實(shí)習(xí)時(shí)做的一個(gè)基于STM32+CUBEMX工具讀取溫度計(jì)輸出的PWM波的實(shí)驗(yàn),使用到了TIMER讀取輸入捕獲和UART輸出到串口,最終實(shí)現(xiàn)讀取
    發(fā)表于 11-30 10:36 ?12次下載
    基于<b class='flag-5'>STM32F103C8</b> 輸入捕獲實(shí)驗(yàn)

    STM32F103C8微控制器中使用RS-485串行通信

    在本教程中,Master STM32F103C8 具有三個(gè)按鈕,用于通過(guò)使用 RS-485 串行通信來(lái)控制 Slave Arduino Uno 上的三個(gè) LED 的狀態(tài)。
    發(fā)表于 09-06 15:31 ?7815次閱讀
    在<b class='flag-5'>STM32F103C8</b>微控制器中使用RS-485串行通信

    使用STM32F103C8和SIM800C GSM模塊發(fā)送/接收短信

    在本教程中,此類(lèi)GSM 模塊將與 STM32F103C8 ARM 微控制器連接,以從程序中配置的蜂窩移動(dòng)號(hào)碼發(fā)送和接收文本消息 (SMS)。為了顯示接收和發(fā)送的消息,一個(gè)16x2 LCD將與兩個(gè)按鈕一起使用,這兩個(gè)按鈕將在按下相關(guān)按鈕后啟動(dòng)文本消息的發(fā)送和接收。
    的頭像 發(fā)表于 09-07 15:34 ?1.9w次閱讀
    使用<b class='flag-5'>STM32F103C8</b>和SIM800<b class='flag-5'>C</b> GSM<b class='flag-5'>模塊</b>發(fā)送/接收短信

    基于MCP4725設(shè)計(jì)使用STM32F103C8的數(shù)模轉(zhuǎn)換器

    今天我們將使用相同的 MCP4725 DAC IC 來(lái)設(shè)計(jì)一個(gè)使用 STM32F103C8 微控制器的數(shù)模轉(zhuǎn)換器。
    發(fā)表于 09-08 15:24 ?4692次閱讀
    基于MCP4725設(shè)計(jì)使用<b class='flag-5'>STM32F103C8</b>的數(shù)模轉(zhuǎn)換器

    將步進(jìn)電機(jī)與STM32F103C8板連接的教程

    在本教程中,我們將步進(jìn)電機(jī)與STM32F103C8(藍(lán)色藥丸)板連接。
    的頭像 發(fā)表于 11-07 15:52 ?7503次閱讀
    將步進(jìn)電機(jī)與<b class='flag-5'>STM32F103C8</b>板連接的教程