Arduino开发之如何连接GPS模块?
文章目录
- 0、引言
- 1、GPS模块说明
- 2、接调试助手测试GPS模块接收数据
- 3、代码编写
- 4、功能演示
0、引言
NEO-6M/7M GPS模块,具有高灵敏度、低功耗、小型化、高追踪灵敏度,大大扩大了其定位的覆盖面,在普通GPS接收模块不能定位的地方,如狭窄都市天空下、密集的丛林环境,NEO-6M都能高精度定位。模块的高灵敏度、小静态漂移、低功耗及轻巧的体积,适用于车载、手持设备如PDA,车辆监控、手机、摄像机及其他移动定位系统的应用,是GPS产品应用的好选择。内嵌在使用GPS服务的智慧型手机、平板电脑、PND、DVR、可携式装置,测量设备,人员定位管理,测速设备,授时设备,交车跟踪定位、出租车跟踪定位、公司车辆跟踪定位、物流车辆跟踪定位、汽车故障检测、汽车油量检测、汽车物联网、挖掘机定位等等。本文在【Arduino如何进行开发?】基础上,借鉴现有网络资料,阐述Arduino如何连接GPS模块。
1、GPS模块说明
GPS模块情况:
NEO-7M GPS模块。PPS指示灯(即PPS引脚),在默认条件下(没经过程序设置),有2个状态:常亮,表示模块已开始工作,但还未实现定位;闪烁(100ms灭,900ms亮),表示模块已经定位成功。
引脚说明:
“VCC”:接Arduino的5V
“GND”:接Arduino的GND
“TXD”:本文接Arduino的D10
“RXD”:本文接Arduino的D11
“PPS”:不接
2、接调试助手测试GPS模块接收数据
3、代码编写
GPS_lib.ino
#include <SoftwareSerial.h>String data="";
int mark = 0;
boolean Mark_Start=false;
boolean valid=false;
String GGAUTCtime,GGAlatitude,GGAlongitude,GPStatus,SatelliteNum,HDOPfactor,Height,
PositionValid,RMCUTCtime,RMClatitude,RMClongitude,Speed,Direction,Date,Declination,Mode;
SoftwareSerial Serial1(10, 11); // RX, TX void setup(){ Serial.begin(38400); Serial1.begin(9600); delay(1000);
} void loop(){ while (Serial1.available()> 0){ if(Mark_Start){ data=reader(); Serial.println(data); if(data.equals("GPGGA")){ //Serial.println(1); GGAUTCtime=reader(); GGAlatitude=reader(); GGAlatitude+=reader(); GGAlongitude=reader(); GGAlongitude+=reader(); GPStatus=reader(); SatelliteNum=reader(); HDOPfactor=reader(); Height=reader(); Mark_Start=false; valid=true; data=""; } else if(data.equals("GPGSA")){ Serial.println(2); Mark_Start=false; data=""; } else if(data.equals("GPGSV")){ Serial.println(3); Mark_Start=false; data=""; } else if(data.equals("GPRMC")){ //Serial.println(4); RMCUTCtime=reader(); PositionValid=reader(); RMClatitude=reader(); RMClatitude+=reader(); RMClongitude=reader(); RMClongitude+=reader(); Speed=reader(); Direction=reader(); Date=reader(); Declination=reader(); Declination+=reader(); Mode=reader(); valid=true; Mark_Start=false; data=""; } else if(data.equals("GPVTG")){ Serial.println(5); Mark_Start=false; data=""; } else{ Serial.println(6); Mark_Start=false; data=""; } } if(valid){ if(PositionValid=="A"){ Serial.println("Position Valid"); } else{ Serial.println("Your position is not valid."); } Serial.print("Date:");//日期 Serial.println(Date); Serial.print("UTCtime:");//世界协调时间 Serial.print(RMCUTCtime); Serial.print(" "); Serial.println(GGAUTCtime); Serial.print("Latitude:");//纬度 Serial.print(RMClatitude); Serial.print(" "); Serial.println(GGAlatitude); Serial.print("Longitude:");//经度 Serial.print(RMClongitude); Serial.print(" "); Serial.println(GGAlongitude); Serial.print("GPStatus:");//GP地位 Serial.println(GPStatus); Serial.print("SatelliteNum:");//卫星数 Serial.println(SatelliteNum); Serial.print("HDOPfactor:"); Serial.println(HDOPfactor); Serial.print("Height:");//高度 Serial.println(Height); Serial.print("Speed:");//速度 Serial.println(Speed); Serial.print("Direction:");//方向 Serial.println(Direction); Serial.print("Declination:");//赤纬 Serial.println(Declination); Serial.print("Mode:");//模式 Serial.println(Mode); valid=false; } if(Serial1.find("$")){ Serial.println("capture"); Mark_Start=true; } }
} String reader(){ String value=""; int temp;
startover: while (Serial1.available() > 0){ delay(2); temp=Serial1.read(); if((temp==',')||(temp=='*')){ if(value.length()){ //Serial.println("meaningful message"); return value; } else { //Serial.println("empty"); return ""; } } else if(temp=='$'){ //Serial.println("failure"); Mark_Start=false; } else{ //Serial.println("add"); value+=char(temp); } } while (!(Serial1.available()>0)){ } goto startover;
}
4、功能演示
参考资料:
[1] cacrle. Arduino如何进行开发?; 2023-03-28 [accessed 2023-04-15].
[2] liwenkangs. 【Arduino】GPS 定位模块的应用; 2021-11-30 [accessed 2023-04-15].
[3] shasuping. STM32F1 GPS模块NEO-7M; 2019-01-26 [accessed 2023-04-15].
[4] weixin_38691194. NEO-7M GPS模块应用说明-附STM32程序-电路方案 ; 2021-04-21 [accessed 2023-04-15].
[5] songhyong. NEO-7M中文版.pdf; 2020-06-12 [accessed 2023-04-15].
[6] SKCQTGZX. NEO-7M(GPS)模块软硬件开发资料包括PD原理图+AD集成封装+NEO-7M软件工具及设计
参考资料.zip ; 2021-09-06 [accessed 2023-04-15].
[7] Maximilian Gerhardt. ‘Serial1’ was not declared in this scope; 2018-03-06 [accessed 2023-04-15].