概述
如何使用GPS模块?从头到尾,详细讲解和程序说明
一、使用Arduino控制NEO-6M GPS模块应用 本应用说明如何将NEO-6M GPS模块与Arduino一起使用以获取GPS数据。GPS代表全球定位系统,可以在旅行时用于确定位置,时间和速度。 您将学习到如何: 1、将NEO-6M GPS模块连接到Arduino UNO; 2、获取原始GPS数据; 3、解析原始数据以获得选定的可读GPS信息; 4、取得位置。 二、推出NEO-6M GPS模块 NEO-6M GPS模块如下图所示。 它带有一个外部天线,并且不带有插头。 因此,您需要获取并焊接一些引脚。该模块具有外部天线和内置EEPROM。
接口:RS232 TTL;
电源:3V至5V;
默认波特率:9600 bps;
与标准NMEA语法一起使用;
NEO-6M GPS模块还与其他微控制器板兼容。
引脚接线
NEO-6M GPS模块具有四个引脚:VCC,RX,TX和GND。该模块使用TX和RX引脚通过串行通信与Arduino进行通信,因此接线是多么简单:
NEO-6M GPS模块 | 接线到Arduino UNO |
VCC | 5V |
RX | 软件序列中定义的TX引脚 |
TX | 软件序列中定义的RX引脚 |
GND | 地线 |
三、取GPS原始数据
要获取原始GPS数据,您只需使用"软件串行口"开始与GPS模块的串行口通信。继续阅读以了解具体的操作方法。
所需零件
为了测试此示例,您将需要以下部分:
Arduino;
NEO-6M GPS模块;
跳线。
四、原理图
请按照以下示意图将NEO-6M GPS模块连接到Arduino。
模块GND引脚连接到Arduino GND引脚;
模块RX引脚连接到Arduino 引脚3;
模块TX引脚连接到Arduino 引脚4;
模块VCC引脚连接到Arduino 5V引脚。
五、代码
将以下代码复制到Arduino IDE,并将其上传到Arduino开发板。
#include SoftwareSerial ss(4, 3);void setup(){
Serial.begin(9600);
ss.begin(9600);}void loop(){
while (ss.available() > 0)
{
byte gpsData = ss.read();
Serial.write(gpsData);
}}
电路图假定您将引脚4和引脚3用作RX和TX串行引脚,以与GPS模块建立串行通信。如果您使用其他引脚,则应在以下行中对其进行编辑:
SoftwareSerial ss(4, 3);
另外,如果您的模块使用的默认波特率不同于9600 bps,则应在以下行中修改代码:
ss.begin(9600);
该电路图侦听GPS串行端口,并在从模块接收数据时将其发送到串行监视器。
while (ss.available() > 0)
{
byte gpsData = ss.read();
Serial.write(gpsData);
}
以9600的波特率打开串行监视器。
您应该以GPS标准语言NMEA获得大量信息。您在串行监视器中看到的每一行都是NMEA语句。NMEA代表国家海洋电子协会,在GPS领域中,它是GPS制造商支持的标准数据格式。
六、了解NMEA句子
NMEA句子以$字符开头,并且每个数据字段都用逗号分隔。
$ GPGGA,110617.00,41XX.XXXXX,N,00831.54761,W,1,05,2.68,129.0,M,50.1,M ,, * 42
$ GPGSA,A,3,06,09,30,07,23 ,, ,,,,, 4.43,2.68,3.53 * 02
$ GPGSV,3,1,11,02,48,298,24,03,05,101,24,05,17,292,20,06,71,227,30 * 7C
$ GPGSV,3,2,11,07,47,138,33,09,64,044,28,17,01,199,19,13,214,* 7C
$ GPGSV,3,3,11,23,29,054,29,29,01,335,,30,29,167,33 * 4E
$ GPGLL,41XX.XXXXX,N,00831.54761,W,110617.00,A,A * 70
$ GPRMC,110618.00,A,41XX.XXXXX,N,00831.54753,W,0.078,030118 ,,, A * 6A
$ GPVTG ,, T ,, M,0.043,N,0.080,K,A * 2C
NMEA句子有不同类型。
消息的类型由第一个逗号之前的字符指示。
$之后的GP表示它是GPS位置。$GPGGA是基本的GPS NMEA消息,提供3D位置和准确性数据。在下面的句子中:
$ GPGGA,110617.00,41XX.XXXXX,N,00831.54761,W,1,05,2.68,129.0,M,50.1,M ,, * 42
110617 –表示采取修复位置的时间,UTC时间11:06:17
41XX.XXXXX,N –纬度41度XX.XXXXX'N
00831.54761,W –经度008度31.54761′W
1 –修复质量(0 =无效;1 = GPS修复;2 = DGPS修复;3 = PPS修复;4 =实时运动学;5 =浮点RTK;6 =估计(航位推算);7 =手动输入模式;8 =模拟模式)
05 –被跟踪的卫星数
2.68 –水平稀释
129.0,M –海拔,海拔高度
50.1,M – WGS84椭球上方的大地水准面的高度(平均海平面)
空字段-自上次DGPS更新以来的时间(以秒为单位)
空字段– DGPS站ID号
* 42 –校验和数据,始终以*开头
NMEA的其他句子提供了其他信息:
$ GPGSA – GPS DOP和活动卫星
$ GPGSV –详细的GPS卫星信息
$ GPGLL –地理纬度和经度
$ GPRMC –基本的GPS pvt(位置,速度,时间)数据
$ GPVTG –速度不错
七、使用TinyGPS ++库解析NMEA句子
您可以处理来自GPS的原始数据,也可以通过将字符序列保存到变量中来将这些NMEA消息转换为可读且有用的格式。为此,我们将使用TinyGPS ++库 。
通过该库,可以轻松获取有用且易于理解的格式的位置信息。
安装TinyGPS ++库
请按照以下步骤在您的Arduino IDE中安装TinyGPS ++库:
1. 下载TinyGPSPlus库。您的下载文件夹中应该有一个.zip文件夹
2. 解压缩.zip文件夹,您应该得到TinyGPSPlus-master文件夹
3. 重命名文件夹 到TinyGPSPlus
4. 将TinyGPSPlus文件夹移至Arduino IDE安装库文件夹
5. 最后,重新打开您的Arduino IDE
该库提供了一些有关如何使用它的示例。在您的Arduino IDE中,您只需要转到 File >Examples > TinyGPS ++,然后从提供的示例中进行选择。
注意:库中提供的示例假定GPS模块的波特率为4800。如果您使用的是NEO-6M GPS模块,则需要将其更改为9600。
八、使用NEO-6M GPS模块和TinyGPS ++库获取位置
您可以使用TinyGPS ++库以方便实用的格式获取位置。下面,我们提供了一个代码来从GPS获取位置。这是其中一个库示例的简化版本。
#include #include static const int RXPin = 4, TXPin = 3;static const uint32_t GPSBaud = 9600;TinyGPSPlus gps;SoftwareSerial ss(RXPin, TXPin);void setup(){
Serial.begin(9600);
ss.begin(GPSBaud);}void loop(){
while (ss.available() > 0)
{
gps.encode(ss.read());
if (gps.location.isUpdated())
{
Serial.print("Latitude= ");
Serial.print(gps.location.lat(), 6);
Serial.print(" Longitude= ");
Serial.println(gps.location.lng(), 6);
}
}}
首先导入所需的库:TinyGPSPlus和SoftwareSerial:
#include
#include
然后,您定义软件串行RX和TX引脚,以及GPS波特率。如果将其他引脚用于软件串行,则需要在此处进行更改。另外,如果您的GPS模块使用其他默认波特率,则还应该对其进行修改。
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
然后,创建一个TinyGPS ++对象:
TinyGPSPlus gps;
然后在您先前定义的引脚上开始串行连接
SoftwareSerial ss(RXPin, TXPin);
在setup()中,您可以初始化串行通信,以查看串行监视器上的读数并与GPS模块通信。
void setup()
{
Serial.begin(9600);
ss.begin(GPSBaud);
}
在循环中,您需要提供信息。为了使TinyGPS ++能够正常工作,您必须使用encode()方法从GPS模块中反复向其添加字符。
while (ss.available() > 0){
gps.encode(ss.read());
然后,您可以查询gps对象以查看是否已更新任何数据字段:
if (gps.location.isUpdated())
{
Serial.print("Latitude="); Serial.print(gps.location.lat(), 6);
Serial.print("Longitude="); Serial.println(gps.location.lng(), 6);
}
分别使用gps.location.lat()和gps.location.lng()即可轻松获得纬度和经度。
将代码上传到Arduino,您应该会在串行监视器上看到显示的位置。上载代码后,请等待几分钟,同时模块将调整位置以获取更准确的数据。
九、使用TinyGPS ++库获取更多GPS信息
TinyGPS ++库使您不仅可以简单地获取位置信息,还可以获取更多信息。除了位置,您还可以获得:日期、时间、速度、课程、高度、卫星、高清。
下面的代码示例了如何以一种简单的方式获取所有这些信息。
#include <TinyGPS++.h>#include <SoftwareSerial.h>static const int RXPin = 4, TXPin = 3;static const uint32_t GPSBaud = 9600;SoftwareSerial ss(RXPin, TXPin);void setup(){
Serial.begin(9600);
ss.begin(GPSBaud);}void loop(){
while (ss.available() > 0)
{
gps.encode(ss.read());
if (gps.location.isUpdated())
{ Serial.print("Latitude= "); Serial.print(gps.location.lat(), 6); Serial.print(" Longitude= "); Serial.println(gps.location.lng(), 6); Serial.print("Raw latitude = "); Serial.print(gps.location.rawLat().negative ? "-" : "+");
Serial.println(gps.location.rawLat().deg);
Serial.println(gps.location.rawLat().billionths); Serial.print("Raw longitude = "); Serial.print(gps.location.rawLng().negative ? "-" : "+"); Serial.println(gps.location.rawLng().deg); Serial.println(gps.location.rawLng().billionths); Serial.print("Raw date DDMMYY = "); Serial.println(gps.date.value()); Serial.print("Year = "); Serial.println(gps.date.year()); Serial.print("Month = "); Serial.println(gps.date.month()); Serial.print("Day = "); Serial.println(gps.date.day()); Serial.print("Raw time in HHMMSSCC = "); Serial.println(gps.time.value()); Serial.print("Hour = "); Serial.println(gps.time.hour()); Serial.print("Minute = "); Serial.println(gps.time.minute()); Serial.print("Second = "); Serial.println(gps.time.second()); Serial.print("Centisecond = "); Serial.println(gps.time.centisecond()); Serial.print("Raw speed in 100ths/knot = "); Serial.println(gps.speed.value()); Serial.print("Speed in knots/h = "); Serial.println(gps.speed.knots()); Serial.println(gps.speed.mph()); Serial.print("Speed in m/s = "); Serial.println(gps.speed.mps()); Serial.print("Speed in km/h = "); Serial.println(gps.speed.kmph()); Serial.print("Raw course in degrees = "); Serial.println(gps.course.value()); Serial.print("Course in degrees = "); Serial.println(gps.course.deg()); Serial.print("Raw altitude in centimeters = "); Serial.println(gps.altitude.value()); Serial.print("Altitude in meters = "); Serial.println(gps.altitude.meters()); Serial.print("Altitude in miles = "); Serial.println(gps.altitude.miles()); Serial.print("Altitude in kilometers = "); Serial.println(gps.altitude.kilometers()); Serial.print("Altitude in feet = "); Serial.println(gps.altitude.feet()); Serial.print("Number os satellites in use = "); Serial.println(gps.satellites.value()); Serial.print("HDOP = "); Serial.println(gps.hdop.value());
}
}}
TinyGPS ++ 在如何使用其所有功能方面得到了很好的评价。
免责声明:本文来源于今日头条,作者为工控电子爱好者。转载目的在于传播相关技术知识,版权归原作者所有,如涉及侵权,请联系删除。谢谢。最后
以上就是美好白猫为你收集整理的GPS 校验和 代码_如何使用GPS模块?从头到尾,详细讲解和程序说明如何使用GPS模块?从头到尾,详细讲解和程序说明引脚接线要获取原始GPS数据,您只需使用"软件串行口"开始与GPS模块的串行口通信。继续阅读以了解具体的操作方法。四、原理图五、代码六、了解NMEA句子七、使用TinyGPS ++库解析NMEA句子八、使用NEO-6M GPS模块和TinyGPS ++库获取位置的全部内容,希望文章能够帮你解决GPS 校验和 代码_如何使用GPS模块?从头到尾,详细讲解和程序说明如何使用GPS模块?从头到尾,详细讲解和程序说明引脚接线要获取原始GPS数据,您只需使用"软件串行口"开始与GPS模块的串行口通信。继续阅读以了解具体的操作方法。四、原理图五、代码六、了解NMEA句子七、使用TinyGPS ++库解析NMEA句子八、使用NEO-6M GPS模块和TinyGPS ++库获取位置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复