风筝
发表于: 2022-6-22 16:29:06 | 显示全部楼层

让我们在接下来的Arduino项目中使用NEO-6M GPS模块来实现感知位置,该模块可以跟踪多达22颗卫星并识别世界任何地方的位置。对于希望进入GPS世界的任何人来说,它都可以作为一个很好的起点。


它们功耗低(适用于电池供电的设备)、价格低廉、易于交互,并且在电子爱好者中非常受欢迎。


GPS是如何工作的?

GPS接收器实际上是通过计算它们与许多卫星的距离来工作的。它们经过预先编程,可以在任何给定时间知道GPS卫星的位置。


卫星以无线电信号的形式向地球传输有关其位置和当前时间的信息。这些信号识别卫星并告诉接收器它们的位置。

how-gps-works-trilateration-process.png


然后,接收器通过计算信号到达所需的时间来计算每颗卫星的距离。一旦它掌握了至少三颗卫星的距离以及它们在太空中的位置的信息,它就可以确定你在地球上的位置。这个过程被称为三边测量(Trilateration)。


NEO-6M GPS模块硬件概述

NEO-6M GPS芯片

该模块的核心是u-blox公司的NEO-6M GPS芯片。该芯片的尺寸小于一张邮票的大小,但在它的小尺寸中包含了惊人的功能。

NEO-6M-GPS-Module-Chip.jpg


它可以在50个通道上跟踪多达22颗卫星,并达到业界最高水平的灵敏度,即 -161 d 跟踪,同时仅消耗45mA电流。


与其他GPS模块不同,它每秒最多可进行5次位置更新,水平定位精度为2.5m。u-blox 6定位引擎还拥有不到1秒的首次定位时间 (TTFF)。


该芯片提供的最佳功能之一是省电模式 (PSM)。它可以通过选择性地打开和关闭接收器的某些部分来降低系统功耗。这将模块的功耗显着降低至仅11mA,使其适用于GPS手表等对功耗敏感的应用。


NEO-6M GPS芯片的必要数据引脚引出到0.1英寸间距的排针。这包括通过UART与微控制器通信所需的引脚。模块支持从4800bps到230400bps的波特率,默认波特率为9600。


定位LED指示灯

NEO-6M-GPS-Module-Position-Fix-LED-Indicator.jpg


NEO-6M GPS 模块上有一个 LED,用于指示定位状态。它会根据所处的状态以不同的速率闪烁:

●    不闪烁 - 它正在搜索卫星。

●    每1s闪烁一次 – 找到定位(模块可以寻到足够多的卫星)。


3.3V LDO稳压器

NEO-6M-GPS-Module-3.3V-Voltage-Regulator.jpg


NEO-6M芯片的工作电压为2.7至3.6V。但好消息是,该模块配备了MICREL的MIC5205超低压差3V3稳压器。


逻辑引脚也可以承受5V电压,因此我们可以轻松地将其连接到Arduino或任何5V逻辑微控制器,而无需使用任何逻辑电平转换器。


电池和EEPROM

NEO-6M-GPS-Module-Battery-and-EEPROM.jpg


该模块配备一个两线串行EEPROM - HK24C32 。它大小为4KB,通过I2C连接到NEO-6M 芯片。


该模块还包含一个可充电纽扣电池,用作超级电容器。


EEPROM与电池一起有助于保留电池支持的RAM (BBR)。 BBR包含时钟数据、最新位置数据(GNSS 轨道数据)和模块配置。但这并不意味着永久数据存储。


由于电池保留时钟和最后位置,首次定位时间 (TTFF) 显着减少到1秒。这允许更快的位置锁定。如果没有电池,GPS总是冷启动,因此初始GPS定位需要更多时间。


通电时电池会自动充电,并且可以在没有电源的情况下保持数据长达两周。


天线

使用该模块进行任何类型的通信都需要天线。因此,该模块带有一个具有-161dBm灵敏度的贴片天线。

NEO-6M-Patch-Antenna.jpg


您可以将此天线卡入模块上的小型 U.FL 连接器。

NEO-6M-GPS-Module-u.fl-Connector.jpg


贴片天线非常适合大多数项目。但是,如果您想获得更高的灵敏度或将模块放入金属外壳中,您也可以通过 U.FL 连接器卡入任何 3V 有源 GPS 天线。


NEO-6M GPS模块引脚

NEO-6M GPS模块共有4个引脚与外界连接。连接如下:

Ublox-NEO-6M-GPS-Module-Pinout.jpg


GND 是接地引脚,需要连接到Arduino上的GND引脚。

TxD(发送器)引脚用于串行通信。

RxD(接收器)引脚用于串行通信。

VCC 为模块供电。您可以直接将其连接到Arduino上的5V引脚。


使用Arduino UNO开发板连接NEO-6M GPS模块

现在我们了解了有关该模块的所有信息,我们可以开始将它连接到Arduino开发板!


首先将贴片天线连接到U.FL连接器。请记住将U.FL电缆穿过其中一个安装孔,以实现牢固的连接。该模块通常带有未焊接的排针。所以,你需要焊接它们。


现在,将模块上的Tx和Rx引脚分别连接到Arduino上的数字引脚#2和#3;因为我们将使用软件串口与模块通信。然后将VCC引脚连接到Arduino的5V引脚,并将GND接地。

Wiring-Connections-NEO-6M-GPS-Module-to-Arduino-UNO.jpg


一切就绪后,您就可以继续操作了!

跳转到指定楼层
风筝
发表于: 2022-6-22 17:39:52 | 显示全部楼层

Arduino代码 – 读取GPS数据

GPS接收器最好的一点是,一旦给它们供电,就会开始发送数据。


测试此数据的最佳方法是使用Arduino作为USB-TTL转换器。以下是相关的代码:

  1. // Choose two Arduino pins to use for software serial
  2. int RXPin = 2;
  3. int TXPin = 3;

  4. //Default baud of NEO-6M is 9600
  5. int GPSBaud = 9600;

  6. // Create a software serial port called "gpsSerial"
  7. SoftwareSerial gpsSerial(RXPin, TXPin);

  8. void setup()
  9. {
  10.   // Start the Arduino hardware serial port at 9600 baud
  11.   Serial.begin(9600);

  12.   // Start the software serial port at the GPS's default baud
  13.   gpsSerial.begin(GPSBaud);
  14. }

  15. void loop()
  16. {
  17.   // Displays information when new sentence is available.
  18.   while (gpsSerial.available() > 0)
  19.     Serial.write(gpsSerial.read());
  20. }
复制代码

上传程序,然后在Arduino IDE打开串口监视器。记得选择9600波特率。您应该看到如下文本:

NEO-6M-GPS-NMEA-Sentences-Output-On-Arduino.png


您通过串口获取的数据实际上是NMEA 语句。


NMEA是 National Marine Electronics Association(美国国家海洋电子协会)的首字母缩写。这是几乎所有GPS接收器的标准消息格式。NMEA标准采用称为句子的数据行格式。每个句子都用逗号分隔,以便计算机和微控制器更容易解析。


这些NMEA语句以称为更新率的间隔发送出去。


NEO-6M GPS模块默认每秒更新一次此信息(1Hz 频率)。但是您可以将其配置为每秒最多5次更新(5Hz 频率)。


解析NMEA句子

NMEA标准中有很多句子,最常见的有:

●    $GPRMC(全球定位推荐最小坐标)提供时间、日期、纬度、经度、高度和估计速度。

●    $GPGGA 语句提供了提供3D位置和精度数据的基本修复数据。


让我们以来自GPS接收器的$GPRMC NMEA语句为例。

  1. $GPRMC, 123519, A, 4807.038, N, 01131.000, E,022.4, 084.4, 230394, 003.1, W*6A
复制代码

$ 每个NMEA句子都以$字符开头。

GPRMC 全球定位推荐最小坐标(Global Positioning Recommended Minimum Coordinates)

123519 UTC 当前时间 – 12:35:19

A 状态 A=活动或 V=无效。

4807.038,N 纬度 48 度 07.038′ N

01131.000,E 经度 11 度 31.000′ E

022.4 对地速度(节)

084.4 以度为单位的轨道角度

220318 当前日期 – 2018 年 3 月 22 日

003.1,W 偏差

*6A 校验和数据,总是以 * 开头


让我们举个$GPGGA NMEA语句的例子。

  1. $GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0.9, 545.4, M, 46.9, M, , *47
复制代码

$ NMEA 语句的开始。

GPGGA 全球定位系统修复数据(Global Positioning System Fix Data)

123519 UTC 当前时间 – 12:35:19

4807.038,N 纬度 48 度 07.038′ N

01131.000,E 经度 11 度 31.000′ E

1 GPS 定位

08 被跟踪的卫星数量

0.9 平面精度指标

545.4,M 以米为单位的海拔高度(高于平均海平面)

46.9,M 大地水准面高度(平均海平面)

(空白)自上次 DGPS 更新以来的时间(以秒为单位)

(空白) DGPS 站 ID 号

*47 校验和数据,总是以 * 开头


有关NMEA句子及其包含的数据的更多信息,请查看gpsinformation.org


Arduino代码 – TinyGPS 库

通常对于我们的项目,我们需要将NMEA句子解析为有用的信息。为了简化我们的工作,我们使用TinyGPS++库。


这个库完成了从GPS模块接收数据所需的大量繁重工作,例如在后台读取和提取有用的数据。所以,我们不需要担心解析工作。感谢Mikal Hart的巨大贡献。他的网站 Arduiniana.org 全面概述了TinyGPS++库的所有功能。


首先通过访问GitHub存储库下载库,或者只需单击此按钮即可下载 zip: TinyGPSPlus-1.0.3.zip (46.64 KB, 下载次数: 14)


要安装它,请打开Arduino IDE,转到 Sketch > Include Library > Add .ZIP Library,然后选择刚刚下载的TinyGPSPlus ZIP文件。如果您需要有关安装库的更多详细信息,请访问此安装Arduino库教程


安装库后,您可以将下面的草图复制到 Arduino IDE 中。以下测试草图将在串口监视器上打印位置信息(纬度、经度和海拔)和 UTC(日期和时间)。试试草图;然后我们将详细解释它。

  1. #include <TinyGPS++.h>
  2. #include <SoftwareSerial.h>

  3. // Choose two Arduino pins to use for software serial
  4. int RXPin = 2;
  5. int TXPin = 3;

  6. int GPSBaud = 9600;

  7. // Create a TinyGPS++ object
  8. TinyGPSPlus gps;

  9. // Create a software serial port called "gpsSerial"
  10. SoftwareSerial gpsSerial(RXPin, TXPin);

  11. void setup()
  12. {
  13.   // Start the Arduino hardware serial port at 9600 baud
  14.   Serial.begin(9600);

  15.   // Start the software serial port at the GPS's default baud
  16.   gpsSerial.begin(GPSBaud);
  17. }

  18. void loop()
  19. {
  20.   // This sketch displays information every time a new sentence is correctly encoded.
  21.   while (gpsSerial.available() > 0)
  22.     if (gps.encode(gpsSerial.read()))
  23.       displayInfo();

  24.   // If 5000 milliseconds pass and there are no characters coming in
  25.   // over the software serial port, show a "No GPS detected" error
  26.   if (millis() > 5000 && gps.charsProcessed() < 10)
  27.   {
  28.     Serial.println("No GPS detected");
  29.     while(true);
  30.   }
  31. }

  32. void displayInfo()
  33. {
  34.   if (gps.location.isValid())
  35.   {
  36.     Serial.print("Latitude: ");
  37.     Serial.println(gps.location.lat(), 6);
  38.     Serial.print("Longitude: ");
  39.     Serial.println(gps.location.lng(), 6);
  40.     Serial.print("Altitude: ");
  41.     Serial.println(gps.altitude.meters());
  42.   }
  43.   else
  44.   {
  45.     Serial.println("Location: Not Available");
  46.   }
  47.   
  48.   Serial.print("Date: ");
  49.   if (gps.date.isValid())
  50.   {
  51.     Serial.print(gps.date.month());
  52.     Serial.print("/");
  53.     Serial.print(gps.date.day());
  54.     Serial.print("/");
  55.     Serial.println(gps.date.year());
  56.   }
  57.   else
  58.   {
  59.     Serial.println("Not Available");
  60.   }

  61.   Serial.print("Time: ");
  62.   if (gps.time.isValid())
  63.   {
  64.     if (gps.time.hour() < 10) Serial.print(F("0"));
  65.     Serial.print(gps.time.hour());
  66.     Serial.print(":");
  67.     if (gps.time.minute() < 10) Serial.print(F("0"));
  68.     Serial.print(gps.time.minute());
  69.     Serial.print(":");
  70.     if (gps.time.second() < 10) Serial.print(F("0"));
  71.     Serial.print(gps.time.second());
  72.     Serial.print(".");
  73.     if (gps.time.centisecond() < 10) Serial.print(F("0"));
  74.     Serial.println(gps.time.centisecond());
  75.   }
  76.   else
  77.   {
  78.     Serial.println("Not Available");
  79.   }

  80.   Serial.println();
  81.   Serial.println();
  82.   delay(1000);
  83. }
复制代码

以下就是串口监视器上输出的样子。

NEO-6M-GPS-TinyGPS-Arduino-Library-Output.png


草图首先包括TinyGPS++库和软件串口库。然后,我们定义NEO-6M GPS模块连接到的Arduino引脚和存储默认GPS波特率的变量。


创建TinyGPSPlus对象将有助于访问与库相关的特殊函数。接下来,我们创建一个名为gpsSerial的软件串口,我们可以通过它与模块通信。

  1. #include <TinyGPS++.h>
  2. #include <SoftwareSerial.h>

  3. int RXPin = 2;
  4. int TXPin = 3;
  5. int GPSBaud = 9600;

  6. TinyGPSPlus gps;
  7. SoftwareSerial gpsSerial(RXPin, TXPin);
复制代码

setup()函数中,我们需要启动与计算机以及GPS模块的串口通信。

  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   gpsSerial.begin(GPSBaud);
  5. }
复制代码

loop()函数中,我们调用displayInfo()自定义函数,每次正确编码一个新的NMEA语句时,它都会在串口监视器上打印位置信息(纬度、经度和海拔)和 UTC(日期和时间)。


如果经过5000毫秒并且没有字符通过软件串口进入,我们将显示错误“No GPS detected”。

  1. void loop()
  2. {
  3.   while (gpsSerial.available() > 0)
  4.     if (gps.encode(gpsSerial.read()))
  5.       displayInfo();

  6.   if (millis() > 5000 && gps.charsProcessed() < 10)
  7.   {
  8.     Serial.println(F("No GPS detected"));
  9.     while(true);
  10.   }
  11. }
复制代码

TinyGPS++库中的其他有用函数

您可以将一些有用的函数与 TinyGPS++对象一起使用。下面列出了其中的几个:

●    gps.speed.value() 函数以100节为单位返回当前地速。

●    gps.course.value() 函数以100度返回当前地面层。

●    gps.satellites.value() 函数返回可见的参与卫星的数量。

●    gps.hdop.value() 函数返回精度的水平减小。

●    如果你想知道一个对象的数据有多旧,调用它的 age() 方法,它返回自上次更新以来的毫秒数。如果这返回的值大于 1500 左右,则可能是问题的征兆,例如丢失修复。

●    如果您想从任何其他NMEA句子中提取数据。您可以通过告诉TinyGPS++ 句子名称和您感兴趣的字段编号来使用库的自定义提取函数,如下所示:TinyGPSCustom MagneticVariation(gps, "GPRMC", 10) 并且您可以像其他人一样查询它:magneticVariation.value( )

回复

使用道具 举报

风筝
发表于: 2022-6-22 17:50:56 | 显示全部楼层

u-center软件

u-blox公司的u-center是一个强大的工具,用于评估、性能分析和配置u-blox GPS接收器,包括NEO-6M。它是一个免费工具,但只能在Windows平台上使用。


它可以显示来自任何GPS接收器的实时结构化和图形数据可视化,例如:

●    卫星摘要视图

●    导航摘要视图

●    指南针、车速表、时钟、高度计

●    任意两个选择参数的图表视图

●    数据记录和回放功能


该软件可以从U-blox 网站下载。


将NEO-6M模块连接到u-center软件

为了使用u-center软件,您需要使用USB转TTL模块将NEO-6M连接到计算机。


下图显示NEO-6M通过PL2303 USB转TTL转换器连接到计算机。

Wiring-Connections-NEO-6M-GPS-Module-to-Arduino-UNO.jpg


u-center使用方法

安装成功后,u-center可以从开始菜单(所有程序->u-blox->u-center->u-center)启动,如下图所示。

U-center-Software-On-Start.png


找到通讯工具栏并单击图标旁边的箭头。这将显示一个包含所有可用COM端口的列表。选择连接接收器的对应COM端口。

u-center-COM-Port-Selection.png


文本控制台按钮将显示原始NMEA句子。这对于通过USB快速检查来自模块的可见ASCII非常方便。

u-center-Text-Console.png


u-center可以在预校准或谷歌在线(动态)地图上显示位置

U-center-Map-View.jpg


有关u-center 软件的更多信息,请参阅本用户指南

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 00:48 , Processed in 0.050264 second(s), 7 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表