GPS模块解说,使用以及步骤分析
使用Arduino控制NEO-6M GPS模块使用
本使用分析怎样将NEO-6M GPS模块与Arduino一同使用以获取GPS数据。GPS代表举世定位体系,可以在旅游时用于确定地点,时间和速率。
您将学习到怎样:
推出NEO-6M GPS模块
NEO-6M GPS模块如下图所示。它带有一个外部天线,并且不带有插头。因此,您必要获取并焊接一些引脚。
NEO-6M GPS模块还与其他微控制器板兼容。
引脚接线
NEO-6M GPS模块具有四个引脚:VCC,RX,TX和GND。该模块使用TX和RX引脚经过串行通讯与Arduino举行通讯,因此接线是何等简便:
NEO-6M GPS模块 接线到Arduino UNO
VCC 5伏
RX 软件序列中界说的TX引脚
TX 软件序列中界说的RX引脚
GND 地线
获取GPS原始数据
要获取原始GPS数据,您只需使用”软件串行口”开头与GPS模块的串行口通讯。持续阅读以了解具体的利用办法。
所需零件
为了测试此示例,您将必要以下局部:
原理图
请依照以下表现图将NEO-6M GPS模块毗连到Arduino。
代码
将以下代码复制到Arduino IDE,并将其上传到Arduino开发板。
#include <SoftwareSerial.h>
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
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 <TinyGPS++.h>
#include <SoftwareSerial.h>
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 <TinyGPS++.h>
#include <SoftwareSerial.h>
然后,您界说软件串行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 ++ 在怎样使用其一切功效方面取得了很好的评价。
写到最初
渴望本指南对您有所协助。喜好就记得眷注,后续会持续分享更多项目示例,敬请渴望。

















