如何使用STM32F103C8的GPS模块获取位置坐标

发布时间:2023-09-07  

GPS代表全球定位系统,用于检测地球上任何位置的纬度和经度,具有精确的UTC时间(协调世界时)。该设备每秒接收来自卫星的坐标,包括时间和日期。GPS 提供了很高的准确性,并且除了位置坐标之外还提供其他数据。


我们都知道 GPS 是一个非常有用的设备,在手机和其他便携式设备中非常常用来跟踪位置。它在各个领域都有非常广泛的应用,从在家中叫出租车到跟踪飞机的高度。


在本教程中,我们将GPS 模块与 STM32F103C8 微控制器连接,以查找位置坐标并将其显示在16x2 LCD 显示屏上。


所需组件

STM32F103C8微控制器

GPS模块

16x2 液晶显示器

面包板

连接电线

GPS模块

这是一个 GY-NEO6MV2 XM37-1612 GPS 模块。该 GPS 模块有四个引脚 +5V、GND、TXD 和 RXD。它使用串行引脚进行通信,并且可以轻松地与 STM32F103C8 的串行端口连接。

pYYBAGMYVcqAe-2zAAMhfr5X3hQ522.png

GPS 模块 以 NMEA 格式发送数据(参见下面的屏幕截图)。NMEA 格式由几个句子组成,其中我们只需要一个句子。这句话从 $GPGGA开始 ,包含坐标、时间和其他有用的信息。此 GPGGA 称为 全球定位系统修复数据。

下面是一个示例 $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,FQ,NOS,HDP,altitude,M,height,M,,校验和数据

但是在本教程中,我们使用了一个TinyGPSPlus GPS 库,它从 NMEA 语句中提取所有需要的信息,我们只需要编写一行简单的代码来获取纬度和经度,我们将在本教程后面看到。

STM32F103C8 的引脚输出

STM32F103C8 (BLUE PILL) USART 串行通信端口如下图所示。这些是蓝色的(PA9-TX1、PA10-RX1、PA2-TX2、PA3-RX2、PB10-TX3、PB11-RX3)。它有三个这样的沟通渠道。

poYBAGMYVcWAVgqzAAl4ObxQVCs507.png

电路图和连接

pYYBAGMYVcGAPAoZAAIGs_OIIlM872.png

GPS模块和STM32F103C8之间的电路连接

pYYBAGMYVb2AQy8gAAAN0rrc-L0227.png

16x2 LCD 和 STM32F103C8 之间的连接

poYBAGMYVbqAf1nkAAA4ZmRyAaU075.png

整个设置如下所示:

pYYBAGMYVbaAN9kcAAdRX34H6Qs600.png

为 GPS 模块接口编程 STM32F103C8

本项目末尾给出了使用 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);

然后创建一个名为TinyGPSPlus 类的gps对象。


TinyGPSPlus 全球定位系统;

接下来在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 接收经纬度,并检查接收到的数据是否有效,并在串行监视器和 LCD 中显示信息。


检查可用的位置数据是否有效


  loc_valid = gps.location.isValid();

接收纬度数据


lat_val = gps.location.lat();

接收经度数据


  lng_val = gps.location.lng();

如果接收到无效数据,则串行监视器显示“*****”,LCD 显示“等待”。


  if (!loc_valid) 

  { 

    lcd.print("Waiting"); 

    Serial.print("纬度:"); 

    Serial.println("*****"); 

    Serial.print("经度:"); 

    Serial.println("*****"); 

    延迟(4000);

    lcd.clear(); 

  }

如果接收到有效数据,则纬度和经度将显示在串行监视器以及 LCD 显示屏上。


   lcd.clear(); 

    Serial.println("GPS 读数:"); 

    Serial.print("纬度:"); 

    Serial.println(lat_val, 6); 

    lcd.setCursor(0,0); 

    lcd.print("纬度:"); 

    lcd.print(lat_val,6); 

    Serial.print("经度:"); 

     Serial.println(lng_val, 6); 

     lcd.setCursor(0,1); 

     lcd.print("长:"); 

     lcd.print(lng_val,6); 

     延迟(4000);

以下函数提供读取数据的延迟。它一直在寻找串行端口上的数据。


静态无效 GPSDelay(unsigned long ms) 

  unsigned long start = millis(); 

  do 

  { 

    while (Serial1.available()) 

    gps.encode(Serial1.read()); 

  } while (millis() - start < ms); 

}

使用 GPS 和 STM32 查找纬度和经度


建立设置并上传代码后,请确保将 GPS 模块放置在空旷区域以快速接收信号。有时需要几分钟才能收到信号,所以请等待一段时间。当 GPS 模块开始接收信号时,LED 将开始闪烁,并且 LCD 显示屏上会显示位置坐标。


科技观察员 • 来源:circuitdigest • 作者:Pramoth Thangavel • 2022-09-08 15:03 • 5879次阅读

GPS代表全球定位系统,用于检测地球上任何位置的纬度和经度,具有精确的UTC时间(协调世界时)。该设备每秒接收来自卫星的坐标,包括时间和日期。GPS 提供了很高的准确性,并且除了位置坐标之外还提供其他数据。

我们都知道 GPS 是一个非常有用的设备,在手机和其他便携式设备中非常常用来跟踪位置。它在各个领域都有非常广泛的应用,从在家中叫出租车到跟踪飞机的高度。

在本教程中,我们将GPS 模块与 STM32F103C8 微控制器连接,以查找位置坐标并将其显示在16x2 LCD 显示屏上。

所需组件

STM32F103C8微控制器

GPS模块

16x2 液晶显示器

面包板

连接电线

GPS模块

这是一个 GY-NEO6MV2 XM37-1612 GPS 模块。该 GPS 模块有四个引脚 +5V、GND、TXD 和 RXD。它使用串行引脚进行通信,并且可以轻松地与 STM32F103C8 的串行端口连接。

pYYBAGMYVcqAe-2zAAMhfr5X3hQ522.png

GPS 模块 以 NMEA 格式发送数据(参见下面的屏幕截图)。NMEA 格式由几个句子组成,其中我们只需要一个句子。这句话从 $GPGGA开始 ,包含坐标、时间和其他有用的信息。此 GPGGA 称为 全球定位系统修复数据。

下面是一个示例 $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,FQ,NOS,HDP,altitude,M,height,M,,校验和数据

但是在本教程中,我们使用了一个TinyGPSPlus GPS 库,它从 NMEA 语句中提取所有需要的信息,我们只需要编写一行简单的代码来获取纬度和经度,我们将在本教程后面看到。

STM32F103C8 的引脚输出

STM32F103C8 (BLUE PILL) USART 串行通信端口如下图所示。这些是蓝色的(PA9-TX1、PA10-RX1、PA2-TX2、PA3-RX2、PB10-TX3、PB11-RX3)。它有三个这样的沟通渠道。

poYBAGMYVcWAVgqzAAl4ObxQVCs507.png

电路图和连接

pYYBAGMYVcGAPAoZAAIGs_OIIlM872.png

GPS模块和STM32F103C8之间的电路连接

pYYBAGMYVb2AQy8gAAAN0rrc-L0227.png

16x2 LCD 和 STM32F103C8 之间的连接

poYBAGMYVbqAf1nkAAA4ZmRyAaU075.png

整个设置如下所示:

pYYBAGMYVbaAN9kcAAdRX34H6Qs600.png

为 GPS 模块接口编程 STM32F103C8


本项目末尾给出了使用 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);

然后创建一个名为TinyGPSPlus 类的gps对象。


TinyGPSPlus 全球定位系统;

接下来在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 接收经纬度,并检查接收到的数据是否有效,并在串行监视器和 LCD 中显示信息。


检查可用的位置数据是否有效


  loc_valid = gps.location.isValid();

接收纬度数据


lat_val = gps.location.lat();

接收经度数据


  lng_val = gps.location.lng();

如果接收到无效数据,则串行监视器显示“*****”,LCD 显示“等待”。


  if (!loc_valid) 

  { 

    lcd.print("Waiting"); 

    Serial.print("纬度:"); 

    Serial.println("*****"); 

    Serial.print("经度:"); 

    Serial.println("*****"); 

    延迟(4000);

    lcd.clear(); 

  }

如果接收到有效数据,则纬度和经度将显示在串行监视器以及 LCD 显示屏上。


   lcd.clear(); 

    Serial.println("GPS 读数:"); 

    Serial.print("纬度:"); 

    Serial.println(lat_val, 6); 

    lcd.setCursor(0,0); 

    lcd.print("纬度:"); 

    lcd.print(lat_val,6); 

    Serial.print("经度:"); 

     Serial.println(lng_val, 6); 

     lcd.setCursor(0,1); 

     lcd.print("长:"); 

     lcd.print(lng_val,6); 

     延迟(4000);

以下函数提供读取数据的延迟。它一直在寻找串行端口上的数据。


静态无效 GPSDelay(unsigned long ms) 

  unsigned long start = millis(); 

  do 

  { 

    while (Serial1.available()) 

    gps.encode(Serial1.read()); 

  } while (millis() - start < ms); 

}

使用 GPS 和 STM32 查找纬度和经度


建立设置并上传代码后,请确保将 GPS 模块放置在空旷区域以快速接收信号。有时需要几分钟才能收到信号,所以请等待一段时间。当 GPS 模块开始接收信号时,LED 将开始闪烁,并且 LCD 显示屏上会显示位置坐标。

pYYBAGMYVa-AfrS8AAbn5WtRgbw915.png

您可以使用谷歌地图验证位置的纬度和经度。只需打开 GPS 转到 Google 地图,然后单击蓝点。它将显示带有纬度和经度的地址,如下图所示

poYBAGMYVauARECIAAV0zuLNT1Q953.png
#include //LCD显示函数库

#include //GPS函数库


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 全球定位系统;//类TinyGPSPlus的对象gps


无效设置()

{

Serial1.begin(9600);//在串行端口 1 以 9600 波特率开始串行通信

lcd.begin(16,2); //设置显示为 16x2 模式

lcd.print("Circuit Digest");

lcd.setCursor(0,1);

lcd.print("STM32 带 GPS");

延迟(4000);

lcd.clear();

}


无效循环()

{

GPSDelay(1000);

无符号长开始;

双纬度,lng_val;

布尔 loc_valid;

lat_val = gps.location.lat(); //获取纬度

loc_valid = gps.location.isValid();

lng_val = gps.location.lng(); //获取经度



if (!loc_valid) //从 GPS 接收到无效数据时执行

{

lcd.print("Waiting");

Serial.print("纬度:");

Serial.println("*****");

Serial.print("经度:");

Serial.println("*****");

延迟(4000);

lcd.clear();

}

else //从 GPS 接收到有效数据时执行

{

lcd.clear();



Serial.println("GPS 读数:");



Serial.print("纬度:");

Serial.println(lat_val, 6); //在串行监视器打印纬度



lcd.setCursor(0,0);

lcd.print("纬度:");

lcd.print(lat_val,6); //在LCD显示屏上打印纬度


Serial.print("经度:");

Serial.println(lng_val, 6); //在串口监视器上打印经度


lcd.setCursor(0,1);

lcd.print("长:");

lcd.print(lng_val,6); //在液晶显示屏上打印经度


延迟(4000);

}

}


static void GPSDelay(unsigned long ms) //从 GPS 接收数据的延迟

{

unsigned long start = millis();

do

{

while (Serial1.available())

gps.encode(Serial1.read());

} while (millis() - start < ms);

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    如何使用STM32F103C8的GPS模块获取位置坐标;GPS代表全球定位系统,用于检测地球上任何位置的纬度和经度,具有精确的UTC时间(协调世界时)。该设备每秒接收来自卫星的坐标,包括......
    GPS与8051单片机相连接;模块是一个使用全球定位系统来确定车辆或人的位置的设备。接收机用于在地球上的任何时候和任何地方为用户提供可靠的导航、定位和计时服务。 这个全球定位系统使用24至32颗卫......
    (见图1)。   图2   在日常生活中,我们一直使用手机 GPS 来确定自己的位置,但 GPS 1到3米之间的精确度对自动驾驶汽车来说不够精确。而当......
    们一起探索这款引领未来的智能连接模块,感受CAN FD带来的革新力量。 近期,虹科PEAK发布了 PCAN-GPS FD,这是一款具有CAN-FD连接的现代传感器模块。新模块的传感器旨在记录位置、方位......
    公司Tern AI提出创建独立衍生定位系统(IDPS),可以在不依赖卫星信号的情况下识别车辆或人员的位置。这意味着没有干扰、施工或盲区障碍能够影响精确定位,有望提供GPS替代品。 (图片来源:Tern......
    带来的革新力量。 近期,虹科PEAK发布了 PCAN-GPS FD,这是一款具有CAN-FD连接的现代传感器模块。新模块的传感器旨在记录位置......
    将构建一个可供女性佩戴的手环,她们可以使用 SOS 紧急短信和当前位置通知警察或任何人。使用这些信息,警方将能够从现场救出受害者。为此,我们使用了一个 Arduino,它可以与 GSM 和 GPS 模块......
    车载GPS定位器一般安装在车辆的什么位置;车载GPS定位器一般分两种,有线与无线,而在有线定位器中,汽车GPS定位器和两轮车GPS定位器的安装位置不同,但首先,我们要分清楚,有线定位器的线,都是......
    CANgps高精准度的定位系统;1.前言 在世界日益全球化,信息资源分享更便捷的环境下,出现了越来越多类似于GPS等一些可全球性使用的精密设备。GPS的出现对出行方面的助益是极为庞大的,可以对指定人或物提供准确的地理位置......
    若遭遇走失或劫持事件,监控中心通过分析手持终端发送的GPS数据确定孩子所在位置,以采取相关安全措施。 1 引言 此外,地面目标跟踪及报警系统在城市出租车调度、物流运输监控等领域都有着广泛的应用前景。 地面......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>