GPS代表全球定位系统,用于以精确的UTC时间(协调世界时)检测地球上任何位置的纬度和经度。该设备每隔一秒钟从卫星接收带有时间和日期的坐标。GPS具有很高的精度,并且除了位置坐标外还提供其他数据。
众所周知,GPS是一种非常有用的设备,非常常用于移动电话和其他便携式设备中以跟踪位置。从在家打车到跟踪飞机的高度,它在各个领域都有非常广泛的应用。这是我们之前构建的一些有用的GPS相关项目:
- 车辆追踪系统
- GPS时钟
- 事故检测预警系统
- Raspberry Pi GPS模块接口教程
- GPS模块与PIC单片机的接口
在本教程的此处,我们将使GPS模块与STM32F103C8微控制器接口,以找到位置坐标并将其显示在16x2 LCD显示屏上。
所需组件
- STM32F103C8微控制器
- GPS模块
- 16x2 LCD显示屏
- 面包板
- 连接线
GPS模块
这是GY-NEO6MV2 XM37-1612 GPS模块。该GPS模块具有四个引脚+ 5V,GND,TXD和RXD。它使用串行引脚进行通信,并且可以轻松地与STM32F103C8的串行端口接口。
GPS模块 以NMEA格式发送数据(请参见下面的屏幕截图)。NMEA格式包含几个句子,其中我们只需要一个句子。这句话从$ GPGGA开始 ,包含坐标,时间和其他有用的信息。该 GPGGA 被称为“ 全球定位系统修订数据”。在此处了解有关读取GPS数据及其字符串的更多信息。
以下是一个示例$ GPGGA字符串及其说明:
$ GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,, * 47
$ GPGGA,HHMMSS.SSS,纬度,N,经度,E,FQ,NOS,HDP,高度,M,高度,M,校验和数据
但是在本教程的此处,我们使用的是 TinyGPSPlus GPS库,该库从NMEA语句中提取了所有必需的信息,我们只需要编写简单的代码行即可获得纬度和经度,我们将在本教程的后面部分看到。
引出STM32F103C8
STM32F103C8(BLUE PILL)USART串行通信端口如下图所示。它们是蓝色的(PA9-TX1,PA10-RX1,PA2-TX2,PA3-RX2,PB10-TX3,PB11-RX3)。它具有三个这样的通信渠道。
电路图和连接
GPS模块与STM32F103C8之间的电路连接
GPS模块 |
STM32F103C8 |
接收器 |
PA9(TX1) |
TXD |
PA10(RX1) |
+5伏 |
+5伏 |
地线 |
地线 |
16x2 LCD和STM32F103C8之间的连接
LCD引脚号 |
LCD引脚名称 |
STM32引脚名称 |
1个 |
地面(地) |
地线(G) |
2 |
VCC |
5伏 |
3 |
VEE |
电位器中心引脚 |
4 |
寄存器选择(RS) |
PB11 |
5 |
读/写(RW) |
地线(G) |
6 |
启用(EN) |
PB10 |
7 |
数据位0(DB0) |
无连接(NC) |
8 |
数据位1(DB1) |
无连接(NC) |
9 |
数据位2(DB2) |
无连接(NC) |
10 |
数据位3(DB3) |
无连接(NC) |
11 |
数据位4(DB4) |
PB0 |
12 |
数据位5(DB5) |
PB1 |
13 |
数据位6(DB6) |
PC13 |
14 |
数据位7(DB7) |
PC14 |
15 |
LED正极 |
5伏 |
16 |
LED负极 |
地线(G) |
整个设置如下所示:
编程STM32F103C8进行GPS模块接口
该项目的结尾给出了使用STM32使用GPS模块查找位置的完整程序。STM32F103C8可以使用Arduino IDE进行编程,只需通过USB端口将其连接到PC。请确保在上传代码时移除TX和RX引脚,并在上传后将其连接。
要将GPS与STM32接口,首先我们必须从GitHub链接TinyGPSPlus下载一个库。下载该库后,可以将其包含在Arduino IDE中,如草图->包含库->添加.zip库。相同的库可用于将GPS与Arduino接口。
因此,首先包括必要的库文件并为16x2 LCD定义引脚:
#包括
然后创建一个名为TinyGPSPlus类的 gps 对象。
TinyGPSPlus GPS;
接下来在 void设置中 ,使用 Serial1.begin(9600) 开始与GPS模块进行串行通信 。 Serial1用作STM32F103C8的Serial 1端口(Pins-PA9,PA10)。
Serial1.begin(9600);
然后显示欢迎消息一段时间。
lcd.begin(16,2); lcd.print(“ Circuit Digest”); lcd.setCursor(0,1); lcd.print(“ STM32 with GPS”); 延迟(4000); lcd.clear();
接下来在 void循环()中, 我们从GPS接收纬度和经度,并检查接收到的数据是否有效,并在串行监视器和LCD上显示信息。
检查可用的位置数据是否有效
loc_valid = gps.location.isValid();
接收纬度数据
lat_val = gps.location.lat();
接收经度数据
lng_val = gps.location.lng();
如果接收到无效数据,它将在串行监视器中显示“ *****”,并在LCD中显示“ waiting”。
如果(!loc_valid) { lcd.print(“ Waiting”); Serial.print(“ Latitude:”); Serial.println(“ *****”); Serial.print(“ Longitude:”); Serial.println(“ *****”); 延迟(4000); lcd.clear(); }
如果收到有效数据,则纬度和经度将显示在串行监视器以及LCD显示屏上。
lcd.clear(); Serial.println(“ GPS READING:”); Serial.print(“ Latitude:”); Serial.println(lat_val,6); lcd.setCursor(0,0); lcd.print(“ LAT:”); lcd.print(lat_val,6); Serial.print(“ Longitude:”); Serial.println(lng_val,6); lcd.setCursor(0,1); lcd.print(“ LONG:”); lcd.print(lng_val,6); 延迟(4000);
跟随功能提供了读取数据的延迟。它一直在寻找串行端口上的数据。
静态无效GPSDelay(unsigned long ms) { unsigned long start = millis(); 做 { while(Serial1.available()) gps.encode(Serial1.read()); } while(millis()-start <ms); }
使用GPS和STM32查找经纬度
建立设置并上传代码后,请确保将GPS模块放在开放区域中以快速接收信号。有时接收信号需要几分钟,因此请等待一段时间。当开始接收信号时,LED将在GPS模块中开始闪烁,并且位置坐标将显示在LCD显示屏上。
您可以使用Google地图验证位置的纬度和经度。只需在GPS开启的情况下转到Google地图,然后点击蓝点即可。它将显示纬度和经度的地址,如下图所示
将完整的代码和演示视频下面给出。