Adafruit Ultimate GPS模块的使用教程

电子说

1.3w人已加入

描述

概述

gps

我们在Adafruit商店中提供了几种不同的GPS模块,但是没有一个能够满足我们的所有愿望-这就是为什么我们设计了这个小小的GPS接线板。我们认为这是 Ultimate GPS模块,因此我们将其命名为。它具有您想要的一切以及更多的功能:

-165 dBm灵敏度,10 Hz更新,66个通道

5V友好设计和仅20mA的电流消耗

易于使用的木板+两个安装孔

兼容RTC电池

内置数据记录

PPS固定输出

内置贴片天线+用于外部有源天线的u.FL连接器

固定状态LED

此突破围绕MTK3339芯片组构建,这是毫无疑问的,高质量GPS模块,可以在66个频道上跟踪多达22颗卫星,具有出色的高灵敏度接收器(-165 dB跟踪!)和内置天线。它每秒最多可以进行10个位置更新,以进行高速,高灵敏度的记录或跟踪。功耗非常低,在导航期间仅为20 mA。

gps

最终GPS分线板

面包板突破板随附::超低压降3.3V稳压器,因此您可以使用3.3-5VDC输入,5V电平安全输入和ENABLE引脚为其供电,从而可以使用以下方式关闭模块:任何微控制器引脚或开关,可选CR1220纽扣电池的占位面积,以保持RTC正常运行并允许热启动和微小的亮红色LED。搜索卫星时,LED指示灯以大约1Hz的频率闪烁,找到可节省电量的解决方案时,它每15秒闪烁一次。如果您一直希望有一个LED,我们还会在引脚上提供FIX信号,以便您可以将一个外部LED点亮。

gps

最终GPS USB板

USB Breakout板随附: 4针USB Break板,用于直接焊接或连接到USB主机,两个黄色的接收/发送LED指示灯可让您知道何时将数据发送到GPS模块串行接口或从GPS模块串行接口发送数据;可选的CR1220纽扣电池的占用空间可保持RTC的运行并允许热启动,并且还有一个很小的亮红色LED指示灯。搜索卫星时,LED指示灯以大约1Hz的频率闪烁,找到可节省电量的解决方案时,它每15秒闪烁一次。如果您一直希望有一个LED,我们还会在引脚上提供FIX信号,以便您可以将一个外部LED点亮。

gps

天线使用情况

基于版本3 MTK3339的模块真正突出的两个功能是外部天线功能和内置的数据记录功能。该模块具有标准的陶瓷贴片天线,可提供-165 dB的灵敏度,但是如果您想要更大的天线,则可以通过uFL连接器扣紧任何3V有源GPS天线。模块将自动检测活动的天线并进行切换!大多数GPS天线使用SMA连接器,因此您可能需要使用我们的uFL到SMA适配器之一。

基于MTK3339的新模块(我们已经成功测试)的另一个很酷的功能是内置的数据记录功能。由于模块内部有一个微控制器,带有一些空的闪存,因此,最新的固件现在允许发送命令以对该闪存进行内部记录。唯一的事情是您确实需要让微控制器发送“开始记录”命令。但是,发送该消息后,微控制器可以进入睡眠状态,并且无需唤醒即可与GPS通话以降低功耗。时间,日期,经度,纬度和高度每15秒记录一次,并且仅在有修正时记录。内部闪存可以存储大约16个小时的数据,它将自动追加数据,因此您不必担心断电会意外丢失数据。无法将记录的内容和记录的频率更改为已硬编码到模块中,但是我们发现这种安排涵盖了许多最常见的GPS数据记录要求。

今天在Adafruit商店提货一个!

规格:

模块规格:

卫星:跟踪22条,搜索66条

贴片天线尺寸:15mm x 15mm x 4mm

更新速率:1至10 Hz

位置精度:1.8米

速度精度:0.1米/秒

暖/冷启动:34秒

采集灵敏度:-145 dBm

跟踪灵敏度:-165 dBm

最大速度:515m/s

输入电压范围:3.0-5.5VDC

MTK3339工作电流:25mA跟踪,导航时消耗20mA电流

输出:NMEA 0183,默认9600波特率

支持DGPS/WAAS/EGNOS

符合FCC E911和支持AGPS(离线模式:EPO,有效期最长为14天)

多达210个PRN频道

干扰检测和减少

多径检测和补偿

突破b详情:

重量(不包括纽扣电池或支架):8.5g

尺寸(不包括纽扣电池或支架):25.5mm x 35mm x 6.5mm/1.0“ x 1.35” x 0.25“

如果您在2012年3月26日之前购买了模块,并且丝网印刷版上显示MTK3329,则您可以使用MT3329芯片组获得此突破的PA6B版本。 MTK3329没有内置的数据记录。如果您的模块有沙皮笔标记划掉了MTK3329文本或没有文本,则您的PA6C MTK3339具有数据记录功能。如果名称旁边带有“ v3”的版本,则说明PA6H具有PPS输出并支持外部天线。

本教程假定您使用的是‘3339类型的模块。

插脚

普通的GPS分组接口旨在与具有3/5V UART且所有GPIO引脚暴露在底部0.1“接头上的微控制器一起使用

gps

USB版本没有这些突破,而是只有一个USB串行端口。当您要将其直接焊接到USB主机传送器时,右侧有4个焊盘是USB引脚。

断路器电源引脚

gps

这些是与GPS供电有关的引脚。在右侧是必需的电源引脚:

VIN -电源输入,连接到3-5VDC。连接到干净安静电源很重要。 GPS非常敏感,因此您需要一个安静的电源。如果可以避免的话,请不要连接到开关电源,否则LDO的噪音会减少!

GND -电源和信号地。连接到电源和微控制器接地。

然后,在左侧是一些可选的电源引脚:

VBAT 输入引脚-连接到GPS实时时钟备用电池。我们建议使用背面的电池点,但是如果您有一个项目要使用纽扣电池或其他类型的电池(且其电压低于3.3V),则可以将其连接至VBAT引脚。 对于V1和V2模块:如果要执行此操作,请确保在RTC焊盘之间切掉背面的走线

EN 是启用引脚,通过一个10K电阻将其拉高。当该引脚接地时,它将关闭GPS模块。这对于非常低功耗的项目可能非常方便,在这些项目中您想轻松地长时间关闭模块。如果禁用GPS,将会丢失修复程序;如果未安装备用电池,则修复过程也将花费很长时间。

3.3V 是输出来自板载3.3V稳压器。如果您需要干净的3.3V输出,可以使用它!它可以提供至少100mA的输出。

中断串行数据引脚

gps

接下来要使用的引脚是串行数据引脚:

TX -传输数据的引脚从GPS模块到您的微控制器或计算机。它是3.3V逻辑电平。默认情况下,数据以9600波特的速率输出

RX -您可以使用该引脚向GPS发送数据 。您可以使用使用3.3V或5V逻辑,有一个逻辑电平转换器。默认情况下,它期望9600波特数据,并且记住您需要向其发送校验和的NMEA句子

中断其他引脚

gps

FIX 是输出引脚-它与驱动红色LED的引脚相同。如果没有解决办法,FIX引脚将每秒上下脉冲一次。修复后,大部分时间该引脚处于低电平(0V),每15秒钟将脉冲高电平200毫秒

PPS 是一个新的引脚输出在V3模块上。其“每秒脉冲数”输出。多数情况下,它处于逻辑低电平(地),然后每秒脉冲高电平(3.3V),持续50-100ms,因此,微控制器应该很容易地与之同步

备用电池

GPS具有内置的实时时钟,即使掉电且尚未修复,它也可以跟踪时间。如果您希望使用火焰状电源连接(例如,您使用的是太阳能或类似产品),它还可以帮助减少修理时间。要使用RTC,我们需要安装电池。 CR1220 尺寸的电池座背面有一个斑点。我们提供支架,但不包括电池。您可以使用任何12毫米硬币电池-这些硬币电池很受欢迎,我们也可以在Adafruit商店中使用它们。

通常,如果GPS断电,它将恢复到出厂默认的波特率,配置等。备用电池将意味着这些默认值不会丢失!

备用实时时钟电路消耗7 uA(0.007 mA),因此CR1220的使用寿命为40mAh/0.007mA = 5,714小时= 240天连续。备用电池仅在GPS没有3V主电源时使用,因此,只要偶尔使用一次,就可以使用几年

gps

如果仅具有v1或v2模块:在将电池插入电池盒之前,请先切割背面两个焊垫之间的走线,标记为RTC(这将VIN引脚与电池输入断开连接)使用万用表进行连续性检查,以确保两个焊盘不再连接在一起。

V3模块没有切割痕迹,它们具有内置二极管!

gps

请记住, GPS不知道您处于哪个时区(即使知道您所在的位置,没有大量查找表也无法轻松确定时区),因此所有日期/时间数据都采用UTC(又称格林威治标准时间)-你会必须编写将其转换为您当地时区的代码,并在需要时记入夏令时!由于这很复杂,因此大多数人都坚持将所有内容保留在UTC

外部天线

版本3中的新功能在Ultimate GPS突破中,我们现在支持可选的外部天线!该功能在v1或v2中不可用,因此,如果看不到uFL连接器,则说明该模块的版本较旧,不支持天线

gps

所有Ultimate GPS模块具有内置贴片天线-该天线提供-165 dBm的灵敏度,非常适合许多项目。但是,如果要将项目放在盒子中,则可能无法使天线指向上方,或者可能位于金属屏蔽中,或者可能需要更高的灵敏度。在这些情况下,您可能需要使用外部有源天线。

有源天线会吸收电流,因此它们确实可以提供更大的增益,但会降低功耗。检查天线数据表中的确切电流(通常为10-20mA)。大多数GPS天线使用流行且易于使用的SMA连接器。但是,SMA接头在GPS突破口上会相当大,因此我们选择了uFL接头-重量轻,体积小且易于制造。如果您不需要外部天线,则不会增加重量或空间,但是易于连接uFL-》 SMA适配器电缆。然后将GPS天线连接到电缆。

uFL连接器小巧,纤巧,没有额定应变或大量的连接/断开。一旦您连接了uFL适配器,请使用应力消除以避免剥落uFL

Ultimate GPS将自动检测到已连接外部有源天线并“切换” -您不需要发送任何命令。

有一个输出语句可以告诉您天线的状态。 $ PGTOP,11,x ,其中 x 是状态号。如果 x 为 3 ,则表示它正在使用外部天线。如果 x 为 2 ,则使用内部天线,如果 x 为 1 ,则表明天线短路或出现问题。

在较新的防护罩和模块上,您需要告知要输出此报告的固件,可以通过在同一时间添加 gps.sendCommand(PGCMD_ANTENNA)来做到这一点。设置更新率/句子输出。

gps

直接计算机接线

GPS模块很棒,因为打开它们的那一刻,它们将开始吐出数据,并尝试获取“修复”(位置验证)。就像现有的几乎所有GPS一样,Adafruit Ultimate GPS使用TTL串行输出发送数据,因此首先测试GPS的最佳方法是通过Arduino上的TTL串行到USB转换器将其直接连接到计算机。您也可以使用FTDI Friend或其他TTL适配器,但在本演示中,我们将使用经典的Arduino。

Leonardo用户:本教程步骤不适用于Leonardo。继续下一步,“ Arduino接线”,但是请回到这里进行有关GPS数据的讨论!

首先,将“空白”草图加载到Arduino中:

下载:文件

复制代码

// this sketch will allow you to bypass the Atmega chip

// and connect the Ultimate GPS directly to the USB/Serial

// chip converter.

// Connect VIN to +5V

// Connect GND to Ground

// Connect GPS RX (data into GPS) to Digital 0

// Connect GPS TX (data out from GPS) to Digital 1

void setup() {}

void loop() {} // this sketch will allow you to bypass the Atmega chip

// and connect the Ultimate GPS directly to the USB/Serial

// chip converter.

// Connect VIN to +5V

// Connect GND to Ground

// Connect GPS RX (data into GPS) to Digital 0

// Connect GPS TX (data out from GPS) to Digital 1

void setup() {}

void loop() {}

这将释放转换器,因此您可以直接接线并绕过Arduino芯片。上传该草图后,请按照以下步骤连接GPS。您的模块外观可能略有不同,但是只要您连接到正确的引脚名称,它们在该部分的工作原理都是相同的

gps

现在插入USB电缆,然后从Arduino IDE打开串行监视器,并确保选择 9600波特 中。您应该看到如下文本:

gps

这是模块输出的原始GPS“ NMEA语句”。 NMEA句子有几种,人们最常用的是 $ GPRMC (( G lobal P 定位 R 推荐 M 至少 C 个坐标或类似内容)和 $ GPGGA 语句。这两个提供时间,日期,纬度,经度,高度,估计的陆地速度和定位类型。修复类型表示GPS是否已锁定到卫星数据上并接收到足够的数据来确定位置(2D修复)或位置+高度(3D修复)。

有关NMEA语句以及它们的数据的更多详细信息包含,请查看此站点

如果您在上面的窗口中查看数据,您会发现其中有很多逗号,而中间没有数据。这是因为此模块在我的桌子上,室内,并且没有“修复”功能。要解决此问题,我们需要将该模块放在外面。

GPS模块将即使没有修复程序,也始终发送数据!为了获取“有效”(非空白)数据,您必须将GPS模块直接放在外面,方形陶瓷天线指向上方,并享有晴朗的天空。在理想条件下,该模块可以在45秒内得到修复。但是,取决于您的位置,卫星配置,太阳耀斑,附近的高楼大厦,RF噪声等,修复可能最多需要半小时(或更长时间)!这并不意味着您的GPS模块已损坏,GPS模块将始终尽可能快地工作以获取修复。

如果您能获得很长的USB线(或将GPS天线连接到v3模块),然后将GPS伸出窗口,使其指向天空,最终GPS将得到修复,窗口数据将转换为传输有效数据,如下所示:

gps

查找以下内容: $ GPRMC,194509.000,A,4042.6142,N,07400.4168,W,2.03,221.11,160412 ,,, A * 77

该行称为RMC(建议的最低要求)句子,所有最有用的数据。每个数据块都用逗号分隔。

第一部分 194509.000 是当前时间 GMT (格林威治标准时间)。前两个数字 19 表示小时(1900h,也称为7pm),后两个数字是分钟,后两个数字是秒,最后是毫秒。因此,截取该屏幕截图的时间为7:45 pm和9秒。 GPS不知道您所在的时区或“夏令时”,因此您必须进行计算才能将GMT转换为您的时区

第二部分是“状态代码”,如果它是 V ,表示数据是 V oid(无效)。如果它是 A ,则表示其 A 功能(GPS可以获取锁定/修复)

接下来的4个数据是地理位置数据。根据GPS,我的位置是 4042.6142,N (北纬40度,北42.6142分钟)和 07400.4168,W 。 (西经74度,西数0.4168,十进制分钟)要在Google地图中查看此位置,请在Google地图搜索框中输入 +40 42.6142’,-74 00.4168‘。不幸的是,gmaps要求您使用+/-而不是NSWE表示法。 N和E为正,S和W为负。

人们经常会感到困惑因为GPS正常工作,但“距5英里远”-这是因为GPS不能正确解析经纬度数据。尽管有外观,但是地理位置数据并非以十进制度为单位。格式为度和分钟,格式如下:纬度:DDMM.MMMM(前两个字符为度。)经度:DDDMM.MMMM(前三个字符为度。)

下一个数据是地面速度(以节为单位)。我们要 2.03 结

在此之后是跟踪角度,这意味着根据过去的行程来近似我们要驶向的“罗盘”方向

此后的一个是 160412 ,它是当前日期(2012年4月16日)。

最后是 * XX 用作数据传输校验和的数据

使用GPS模块获得修复后,请使用Google地图(或某些其他地图软件)验证您的位置。请记住,GPS通常只能精确到5-10米,如果您在室内或被高大的建筑物包围着,则更糟。

中断Arduino接线

一旦您通过直接接线对GPS模块进行了测试,我们就可以将其接线到微控制器上。我们将使用Arduino,但您可以将我们的代码改编为能够以9600波特接收TTL串行的任何其他微控制器。

将 VIN 连接到+ 5V, GND 接地, RX 至数字2, TX 至数字3。

gps

下一步,下载Adafruit GPS库。该库完成了从GPS模块接收数据所需的许多“繁重工作”,例如在后台中断中读取流数据并自动对其进行魔术解析。要下载它,请访问GitHub存储库,或单击下面的

从github下载Adafruit GPS库

重命名未压缩的文件夹 Adafruit_GPS 。检查 Adafruit_GPS 文件夹是否包含 Adafruit_GPS.cpp 和 Adafruit_GPS.h

移动 Adafruit_GPS 到您的Arduino/Libraries文件夹,然后重新启动Arduino IDE。库安装是一个经常遇到的障碍……如果您需要帮助,我们的《关于Arduino的所有图书馆指南》将其详细说明!

莱昂纳多和Micro用户:我们在Adafruit_GPS库中有特殊的示例草图,可与Micro/Leo配合使用!

打开文件→示例→Adafruit_GPS→echo 草图并将其上传到Arduino。然后打开串行监视器。该草图仅从软件串行端口(引脚2和3)读取数据,并将其输出到连接到USB的硬件串行端口。

打开Arduino IDE串行控制台,并确保将串行波特率设置为 115200

您可以在 setup()过程中通过注释/取消注释行来配置所看到的GPS输出。例如,我们可以要求GPS发送不同的句子,并更改其发送数据的频率。最大速度为10 Hz(每秒10次),并且是大量数据。您可能无法以该速度输出“所有数据”,因为9600波特率不够快。

下载:文件

复制代码

// You can adjust which sentences to have the module emit, below

// uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude

GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);

// uncomment this line to turn on only the “minimum recommended” data for high update rates!

//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);

// uncomment this line to turn on all the available data - for 9600 baud you’ll want 1 Hz rate

//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_ALLDATA);

// Set the update rate

// 1 Hz update rate

//GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);

// 5 Hz update rate- for 9600 baud you‘ll have to set the output to RMC or RMCGGA only (see above)

GPS.sendCommand(PMTK_SET_NMEA_UPDATE_5HZ);

// 10 Hz update rate - for 9600 baud you’ll have to set the output to RMC only (see above)

//GPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ); // You can adjust which sentences to have the module emit, below

// uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude

GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);

// uncomment this line to turn on only the “minimum recommended” data for high update rates!

//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);

// uncomment this line to turn on all the available data - for 9600 baud you‘ll want 1 Hz rate

//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_ALLDATA);

// Set the update rate

// 1 Hz update rate

//GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);

// 5 Hz update rate- for 9600 baud you’ll have to set the output to RMC or RMCGGA only (see above)

GPS.sendCommand(PMTK_SET_NMEA_UPDATE_5HZ);

// 10 Hz update rate - for 9600 baud you‘ll have to set the output to RMC only (see above)

//GPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ);

通常,我们发现仅大多数项目需要RMC和GGA NMEA,因此除非您需要了解卫星位置,否则您不需要ALLDATA。

突破性的Arduino解析

由于所有GPS的输出NMEA语句(通常对于我们的项目,我们都需要从中提取实际数据),因此在使用Adafruit GPS库。通过使库在后台中断中读取,存储和解析数据,可以轻松地查询库并获取最新的更新信息,而无需进行任何麻烦的解析工作。

打开文件→示例→Adafruit_GPS→解析草图并将其上传到Arduino。然后打开串行监视器。

gps

在此草图中,我们在主循环中不断调用 GPS.read()(如果可以的话,请使其在中断中运行一毫秒)。然后在主循环中,我们可以通过调用 GPS.newNMEAreceived()来询问是否已接收到新的数据块,如果返回的结果是 true ,那么我们可以要求图书馆使用 GPS.parse(GPS.lastNMEA())解析数据。

我们确实必须在主循环中保持查询和解析-不可能在中断,因为那样的话我们会意外丢失GPS数据。

一旦解析了数据,我们就可以从库中获取数据,例如 GPS.day , GPS .month 和 GPS.year 作为当前日期。 GPS.fix 如果有修复,将为1,如果没有,则为0。如果我们有解决办法,那么我们可以要求 GPS。纬度, GPS。经度, GPS。速度(以节为单位,而不是mph或k/hr!), GPS.angle , GPS.altitude (以厘米为单位)和 GPS.satellites (卫星数)

这应该使基于位置的项目更加容易。我们建议将更新速率保持在1Hz,并要求GPS仅输出RMC和GGA,因为解析器始终无法跟踪其他数据。

CircuitPython和Python设置

除Arduino外,您还可以轻松地将GPS模块与Python或CircuitPython代码一起使用。 Python代码非常适合解析和处理从GPS模块输出的文本,此Adafruit CircuitPython GPS模块可以为您处理大部分工作!

CircuitPython微控制器接线

首先请确保将GPS模块连接到CircuitPython板,以便使用硬件UART引脚。这是Metro M0 Express的示例:

table》

Python计算机接线

由于您可以使用数十种Linux计算机/板,因此我们将显示Raspberry Pi的接线。对于其他平台,请访问Linux上的CircuitPython指南,以了解您的平台是否受支持。

这里有两个选项:外部USB到串行转换器,或Pi的TX/RX引脚上的内置UART。下面是连接USB到串行转换器的示例:

gps

板5V 或 3.3V 到 GPS模块VIN 。

板GND 到 GPS模块GND 。

板串行TX 到 GPS模块RX 。

板载串行RX 到 GPS模块TX 。

GPS Vin 至 USB 5V 或 3V 》(USB控制台电缆上的红色电线)

GPS地面到 USB接地(黑线)

GPS RX 到 USB TX (绿线)

GPS TX 到 USB RX (白线)

gps

如果是Raspberry Pi以外的单板计算机,则串行端口可能已绑定到控制台,或者对用户不可用。请参阅主板文档以了解如何使用串行端口

gps

您也可以跳过USB控制台电缆,只需将Micro B电缆直接从计算机插入最终GPS USB

下面是使用Pi内置UART的示例:

gps

GPS Vin 至 3。 3V (红线)

GPS接地到地面(黑线)

GPS RX 至 TX (绿线)

GPS TX 至 RX (白线)

如果要使用内置UART,则需要禁用串行控制台,并在 raspi-config 中启用串行端口硬件。有关如何执行此操作的详细说明,请参见《 Raspberry Pi上的CircuitPython指南》的“ UART/串行”部分。

CircuitPython安装GPS库

接下来,您需要在CircuitPython板上安装Adafruit CircuitPython GPS库。请记住,该模块用于Adafruit CircuitPython固件,而不是用于MicroPython.org固件!

首先,请确保您的电路板正在运行最新版本的Adafruit CircuitPython。

下一步,需要安装必要的库才能使用硬件。仔细按照以下步骤从Adafruit的CircuitPython库捆绑包中查找和安装这些库。例如,Circuit Playground Express指南上有一个很棒的页面,介绍了如何为Express和非Express板安装库包。

请记住Trinket M0,Gemma M0和Trinket M0等非Express板。 Feather/Metro M0 basic,您需要从捆绑包中手动安装必要的库:

adafruit_gps.mpy

您还可以从Adafruit CircuitPython GPS版本页面下载 adafruit_gps.mpy 文件。

在继续之前,请确保您开发板的 lib 文件夹中的 adafruit_gps.mpy 文件复制过来。

GPS库的Python安装

您需要安装 Adafruit_Blinka 库,该库在Python中提供了CircuitPython支持。这可能需要验证您正在运行Python3。由于每个平台都有一些不同,并且Linux经常更改,请访问Linux上的CircuitPython指南以使您的计算机准备就绪!

完成后,从命令行运行以下命令:

下载:文件

复制代码

sudo pip3 install adafruit-circuitpython-gps sudo pip3 install adafruit-circuitpython-gps

CircuitPython和Python UART的用法

为演示在使用UART的CircuitPython中GPS模块的用法,我们来看一个完整的程序示例 gps_simpletest.py 文件中的示例。

CircuitPython微控制器

使用CircuitPython微控制器,将该文件另存为 code.py 在您的板上,然后打开串行控制台以查看其输出。

具有Python的Linux/Computer/Raspberry Pi

如果您在Raspberry Pi(或任何计算机)上运行gps_simpletest.py,则必须进行一些更改。

在Raspberry Pi上,注释掉uart = busio(。..)行,并取消注释import serial和uart = serial.Serial(。..)行,将/dev/ttyUSB0更改为适当的序列号港口。现在,您可以使用以下命令运行该程序:

下载:文件

复制代码

python3 gps_simpletest.py python3 gps_simpletest.py

示例解析代码

下载:Project Zip 或 gps_simpletest.py | 在Github上查看

复制代码

# Simple GPS module demonstration.

# Will wait for a fix and print a message every second with the current location

# and other details.

import time

import board

import busio

import adafruit_gps

# Create a serial connection for the GPS connection using default speed and

# a slightly higher timeout (GPS modules typically update once a second)。

# These are the defaults you should use for the GPS FeatherWing.

# For other boards set RX = GPS module TX, and TX = GPS module RX pins.

uart = busio.UART(board.TX, board.RX, baudrate=9600, timeout=10)

# for a computer, use the pyserial library for uart access

#import serial

#uart = serial.Serial(“/dev/ttyUSB0”, baudrate=9600, timeout=10)

# If using I2C, we’ll create an I2C interface to talk to using default pins

#i2c = busio.I2C(board.SCL, board.SDA)

# Create a GPS module instance.

gps = adafruit_gps.GPS(uart, debug=False) # Use UART/pyserial

#gps = adafruit_gps.GPS_GtopI2C(i2c, debug=False) # Use I2C interface

# Initialize the GPS module by changing what data it sends and at what rate.

# These are NMEA extensions for PMTK_314_SET_NMEA_OUTPUT and

# PMTK_220_SET_NMEA_UPDATERATE but you can send anything from here to adjust

# the GPS module behavior:

# https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf

# Turn on the basic GGA and RMC info (what you typically want)

gps.send_command(b‘PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)

# Turn on just minimum info (RMC only, location):

#gps.send_command(b‘PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)

# Turn off everything:

#gps.send_command(b‘PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)

# Tuen on everything (not all of it is parsed!)

#gps.send_command(b‘PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0’)

# Set update rate to once a second (1hz) which is what you typically want.

gps.send_command(b‘PMTK220,1000’)

# Or decrease to once every two seconds by doubling the millisecond value.

# Be sure to also increase your UART timeout above!

#gps.send_command(b‘PMTK220,2000’)

# You can also speed up the rate, but don‘t go too fast or else you can lose

# data during parsing. This would be twice a second (2hz, 500ms delay):

#gps.send_command(b’PMTK220,500‘)

# Main loop runs forever printing the location, etc. every second.

last_print = time.monotonic()

while True:

# Make sure to call gps.update() every loop iteration and at least twice

# as fast as data comes from the GPS unit (usually every second)。

# This returns a bool that’s true if it parsed new data (you can ignore it

# though if you don‘t care and instead look at the has_fix property)。

gps.update()

# Every second print out current location details if there’s a fix.

current = time.monotonic()

if current - last_print 》= 1.0:

last_print = current

if not gps.has_fix:

# Try again if we don‘t have a fix yet.

print(’Waiting for fix.。.‘)

continue

# We have a fix! (gps.has_fix is true)

# Print out details about the fix like location, date, etc.

print(’=‘ * 40) # Print a separator line.

print(’Fix timestamp: {}/{}/{} {:02}:{:02}:{:02}‘.format(

gps.timestamp_utc.tm_mon, # Grab parts of the time from the

gps.timestamp_utc.tm_mday, # struct_time object that holds

gps.timestamp_utc.tm_year, # the fix time. Note you might

gps.timestamp_utc.tm_hour, # not get all data like year, day,

gps.timestamp_utc.tm_min, # month!

gps.timestamp_utc.tm_sec))

print(’Latitude: {0:.6f} degrees‘.format(gps.latitude))

print(’Longitude: {0:.6f} degrees‘.format(gps.longitude))

print(’Fix quality: {}‘.format(gps.fix_quality))

# Some attributes beyond latitude, longitude and timestamp are optional

# and might not be present. Check if they’re None before trying to use!

if gps.satellites is not None:

print(‘# satellites: {}’.format(gps.satellites))

if gps.altitude_m is not None:

print(‘Altitude: {} meters’.format(gps.altitude_m))

if gps.speed_knots is not None:

print(‘Speed: {} knots’.format(gps.speed_knots))

if gps.track_angle_deg is not None:

print(‘Track angle: {} degrees’.format(gps.track_angle_deg))

if gps.horizontal_dilution is not None:

print(‘Horizontal dilution: {}’.format(gps.horizontal_dilution))

if gps.height_geoid is not None:

print(‘Height geo ID: {} meters’.format(gps.height_geoid))

# Simple GPS module demonstration.

# Will wait for a fix and print a message every second with the current location

# and other details.

import time

import board

import busio

import adafruit_gps

# Create a serial connection for the GPS connection using default speed and

# a slightly higher timeout (GPS modules typically update once a second)。

# These are the defaults you should use for the GPS FeatherWing.

# For other boards set RX = GPS module TX, and TX = GPS module RX pins.

uart = busio.UART(board.TX, board.RX, baudrate=9600, timeout=10)

# for a computer, use the pyserial library for uart access

#import serial

#uart = serial.Serial(“/dev/ttyUSB0”, baudrate=9600, timeout=10)

# If using I2C, we‘ll create an I2C interface to talk to using default pins

#i2c = busio.I2C(board.SCL, board.SDA)

# Create a GPS module instance.

gps = adafruit_gps.GPS(uart, debug=False) # Use UART/pyserial

#gps = adafruit_gps.GPS_GtopI2C(i2c, debug=False) # Use I2C interface

# Initialize the GPS module by changing what data it sends and at what rate.

# These are NMEA extensions for PMTK_314_SET_NMEA_OUTPUT and

# PMTK_220_SET_NMEA_UPDATERATE but you can send anything from here to adjust

# the GPS module behavior:

# https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf

# Turn on the basic GGA and RMC info (what you typically want)

gps.send_command(b’PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)

# Turn on just minimum info (RMC only, location):

#gps.send_command(b’PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)

# Turn off everything:

#gps.send_command(b’PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)

# Tuen on everything (not all of it is parsed!)

#gps.send_command(b’PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0‘)

# Set update rate to once a second (1hz) which is what you typically want.

gps.send_command(b’PMTK220,1000‘)

# Or decrease to once every two seconds by doubling the millisecond value.

# Be sure to also increase your UART timeout above!

#gps.send_command(b’PMTK220,2000‘)

# You can also speed up the rate, but don’t go too fast or else you can lose

# data during parsing. This would be twice a second (2hz, 500ms delay):

#gps.send_command(b‘PMTK220,500’)

# Main loop runs forever printing the location, etc. every second.

last_print = time.monotonic()

while True:

# Make sure to call gps.update() every loop iteration and at least twice

# as fast as data comes from the GPS unit (usually every second)。

# This returns a bool that‘s true if it parsed new data (you can ignore it

# though if you don’t care and instead look at the has_fix property)。

gps.update()

# Every second print out current location details if there‘s a fix.

current = time.monotonic()

if current - last_print 》= 1.0:

last_print = current

if not gps.has_fix:

# Try again if we don’t have a fix yet.

print(‘Waiting for fix.。.’)

continue

# We have a fix! (gps.has_fix is true)

# Print out details about the fix like location, date, etc.

print(‘=’ * 40) # Print a separator line.

print(‘Fix timestamp: {}/{}/{} {:02}:{:02}:{:02}’.format(

gps.timestamp_utc.tm_mon, # Grab parts of the time from the

gps.timestamp_utc.tm_mday, # struct_time object that holds

gps.timestamp_utc.tm_year, # the fix time. Note you might

gps.timestamp_utc.tm_hour, # not get all data like year, day,

gps.timestamp_utc.tm_min, # month!

gps.timestamp_utc.tm_sec))

print(‘Latitude: {0:.6f} degrees’.format(gps.latitude))

print(‘Longitude: {0:.6f} degrees’.format(gps.longitude))

print(‘Fix quality: {}’.format(gps.fix_quality))

# Some attributes beyond latitude, longitude and timestamp are optional

# and might not be present. Check if they‘re None before trying to use!

if gps.satellites is not None:

print(’# satellites: {}‘.format(gps.satellites))

if gps.altitude_m is not None:

print(’Altitude: {} meters‘.format(gps.altitude_m))

if gps.speed_knots is not None:

print(’Speed: {} knots‘.format(gps.speed_knots))

if gps.track_angle_deg is not None:

print(’Track angle: {} degrees‘.format(gps.track_angle_deg))

if gps.horizontal_dilution is not None:

print(’Horizontal dilution: {}‘.format(gps.horizontal_dilution))

if gps.height_geoid is not None:

print(’Height geo ID: {} meters‘.format(gps.height_geoid))

在代码运行时,它将每秒打印一条消息,或者更新它仍在等待GPS修复:

gps

注意:由于与内置天线相比,PA1010D微型GPS模块可能需要比其他带有永恒天线的GPS模块更通畅的天空视野。对于任何GPS模块,如果您在获取修复程序时遇到问题,请尝试将其移动到更理想的位置。

一旦建立了修复程序,它将打印有关当前位置和其他GPS数据的详细信息:

gps

让我们更详细地看一下代码,以了解其工作原理。首先,该示例需要导入一些模块,例如用于访问串行端口和其他硬件的内置busio和board模块:

下载:文件

复制代码

import board

import busio

import time import board

import busio

import time

接下来导入GPS模块:

下载:文件

复制代码

import adafruit_gps import adafruit_gps

现在已创建了串行UART,并将其连接到GPS模块将使用的串行端口引脚,这是用于与GPS模块通信:

下载:文件

复制代码

# Define RX and TX pins for the board’s serial port connected to the GPS.

# These are the defaults you should use for the GPS FeatherWing.

# For other boards set RX = GPS module TX, and TX = GPS module RX pins.

RX = board.RX

TX = board.TX

# Create a serial connection for the GPS connection using default speed and

# a slightly higher timeout (GPS modules typically update once a second)。

uart = busio.UART(TX, RX, baudrate=9600, timeout=3000)

# for a computer, use the pyserial library for uart access

#import serial

#uart = serial.Serial(“/dev/ttyUSB0”, baudrate=9600, timeout=3000) # Define RX and TX pins for the board‘s serial port connected to the GPS.

# These are the defaults you should use for the GPS FeatherWing.

# For other boards set RX = GPS module TX, and TX = GPS module RX pins.

RX = board.RX

TX = board.TX

# Create a serial connection for the GPS connection using default speed and

# a slightly higher timeout (GPS modules typically update once a second)。

uart = busio.UART(TX, RX, baudrate=9600, timeout=3000)

# for a computer, use the pyserial library for uart access

#import serial

#uart = serial.Serial(“/dev/ttyUSB0”, baudrate=9600, timeout=3000)

一旦连接的GPS模块可以使用UART对象,您就可以创建GPS解析类的实例。您需要将此类传递给UART实例,它将从内部从与其连接的GPS模块读取新数据:

下载:文件

复制代码

gps = adafruit_gps.GPS(uart) gps = adafruit_gps.GPS(uart)

GPS示例代码已解释

在读取GPS数据之前,该示例通过发送一些自定义的NMEA GPS命令来配置模块数据量和速率。阅读评论以查看一些用于调整数据速率和数据量的选项,但是通常您希望默认使用每秒一次的核心位置信息默认值:

下载:文件

复制代码

# Initialize the GPS module by changing what data it sends and at what rate.

# These are NMEA extensions for PMTK_314_SET_NMEA_OUTPUT and

# PMTK_220_SET_NMEA_UPDATERATE but you can send anything from here to adjust

# the GPS module behavior:

# https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf

# Turn on the basic GGA and RMC info (what you typically want)

gps.send_command(b’PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)

# Turn on just minimum info (RMC only, location):

#gps.send_command(b’PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)

# Turn off everything:

#gps.send_command(b’PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‘)

# Tuen on everything (not all of it is parsed!)

#gps.send_command(b’PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0‘)

# Set update rate to once a second (1hz) which is what you typically want.

gps.send_command(b’PMTK220,1000‘)

# Or decrease to once every two seconds by doubling the millisecond value.

# Be sure to also increase your UART timeout above!

#gps.send_command(b’PMTK220,2000‘)

# You can also speed up the rate, but don’t go too fast or else you can lose

# data during parsing. This would be twice a second (2hz, 500ms delay):

#gps.send_command(b‘PMTK220,500’) # Initialize the GPS module by changing what data it sends and at what rate.

# These are NMEA extensions for PMTK_314_SET_NMEA_OUTPUT and

# PMTK_220_SET_NMEA_UPDATERATE but you can send anything from here to adjust

# the GPS module behavior:

# https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf

# Turn on the basic GGA and RMC info (what you typically want)

gps.send_command(b‘PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)

# Turn on just minimum info (RMC only, location):

#gps.send_command(b‘PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)

# Turn off everything:

#gps.send_command(b‘PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0’)

# Tuen on everything (not all of it is parsed!)

#gps.send_command(b‘PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0’)

# Set update rate to once a second (1hz) which is what you typically want.

gps.send_command(b‘PMTK220,1000’)

# Or decrease to once every two seconds by doubling the millisecond value.

# Be sure to also increase your UART timeout above!

#gps.send_command(b‘PMTK220,2000’)

# You can also speed up the rate, but don‘t go too fast or else you can lose

# data during parsing. This would be twice a second (2hz, 500ms delay):

#gps.send_command(b’PMTK220,500‘)

如果需要,可以使用上面显示的send_command功能将其他自定义命令发送到GPS模块。您也不必担心在命令中添加NMEA校验和,该函数将自动执行此操作(或者不自动将add_checksum=False设置为参数,并跳过校验和的添加)。

《现在,我们可以进入一个主循环,该循环不断更新来自GPS模块的数据并打印出状态。此循环最重要的部分是调用GPS更新功能:

下载:文件

复制代码

# Make sure to call gps.update() every loop iteration and at least twice

# as fast as data comes from the GPS unit (usually every second)。

# This returns a bool that’s true if it parsed new data (you can ignore it

# though if you don‘t care and instead look at the has_fix property)。

gps.update() # Make sure to call gps.update() every loop iteration and at least twice

# as fast as data comes from the GPS unit (usually every second)。

# This returns a bool that’s true if it parsed new data (you can ignore it

# though if you don‘t care and instead look at the has_fix property)。

gps.update()

就像注释中提到的那样,您必须在每次循环迭代中调用update,理想情况下必须多次调用次。每次调用update时,它都会允许GPS库代码从GPS模块读取新数据并更新其状态。由于GPS模块始终在发送数据,因此您必须注意不断读取数据,否则可能会由于缓冲区已满而丢失数据。

您可以检查has_fix属性,看看是否该模块具有GPS定位功能,如果有,则可以读取许多属性,如latitude和longitude(以度为单位):

下载:文件

复制代码

if not gps.has_fix:

# Try again if we don’t have a fix yet.

print(‘Waiting for fix.。.’)

continue

# We have a fix! (gps.has_fix is true)

# Print out details about the fix like location, date, etc.

print(‘=’ * 40) # Print a separator line.

print(‘Fix timestamp: {}/{}/{} {:02}:{:02}:{:02}’.format(

gps.timestamp_utc.tm_mon, # Grab parts of the time from the

gps.timestamp_utc.tm_mday, # struct_time object that holds

gps.timestamp_utc.tm_year, # the fix time. Note you might

gps.timestamp_utc.tm_hour, # not get all data like year, day,

gps.timestamp_utc.tm_min, # month!

gps.timestamp_utc.tm_sec))

print(‘Latitude: {} degrees’.format(gps.latitude))

print(‘Longitude: {} degrees’.format(gps.longitude))

print(‘Fix quality: {}’.format(gps.fix_quality))

# Some attributes beyond latitude, longitude and timestamp are optional

# and might not be present. Check if they‘re None before trying to use!

if gps.satellites is not None:

print(’# satellites: {}‘.format(gps.satellites))

if gps.altitude_m is not None:

print(’Altitude: {} meters‘.format(gps.altitude_m))

if gps.track_angle_deg is not None:

print(’Speed: {} knots‘.format(gps.speed_knots))

if gps.track_angle_deg is not None:

print(’Track angle: {} degrees‘.format(gps.track_angle_deg))

if gps.horizontal_dilution is not None:

print(’Horizontal dilution: {}‘.format(gps.horizontal_dilution))

if gps.height_geoid is not None: if not gps.has_fix:

# Try again if we don’t have a fix yet.

print(‘Waiting for fix.。.’)

continue

# We have a fix! (gps.has_fix is true)

# Print out details about the fix like location, date, etc.

print(‘=’ * 40) # Print a separator line.

print(‘Fix timestamp: {}/{}/{} {:02}:{:02}:{:02}’.format(

gps.timestamp_utc.tm_mon, # Grab parts of the time from the

gps.timestamp_utc.tm_mday, # struct_time object that holds

gps.timestamp_utc.tm_year, # the fix time. Note you might

gps.timestamp_utc.tm_hour, # not get all data like year, day,

gps.timestamp_utc.tm_min, # month!

gps.timestamp_utc.tm_sec))

print(‘Latitude: {} degrees’.format(gps.latitude))

print(‘Longitude: {} degrees’.format(gps.longitude))

print(‘Fix quality: {}’.format(gps.fix_quality))

# Some attributes beyond latitude, longitude and timestamp are optional

# and might not be present. Check if they‘re None before trying to use!

if gps.satellites is not None:

print(’# satellites: {}‘.format(gps.satellites))

if gps.altitude_m is not None:

print(’Altitude: {} meters‘.format(gps.altitude_m))

if gps.track_angle_deg is not None:

print(’Speed: {} knots‘.format(gps.speed_knots))

if gps.track_angle_deg is not None:

print(’Track angle: {} degrees‘.format(gps.track_angle_deg))

if gps.horizontal_dilution is not None:

print(’Horizontal dilution: {}‘.format(gps.horizontal_dilution))

if gps.height_geoid is not None:

注意,在读取之前,已将某些属性(如altitude_m)检查为None。这是插入代码的明智选择,因为有时GPS模块不会发送这些属性。如果模块未发送属性,则会为该属性提供None/null值,并且在Python中尝试打印或读取该属性将失败。 latitude,longitude和timestamp的核心属性通常总是可用的(如果您按原样使用示例),但是如果您使用以下命令关闭了这些输出,则它们可能不可用一个自定义的NMEA命令!

这是用CircuitPython代码读取GPS位置的全部内容!

CircuitPython数据记录

数据记录示例

GPS的另一个便捷任务是将GPS模块的所有原始输出记录到文件中。如果要将GPS数据导入到可以处理原始NMEA句子的工具(如Google Earth)中,这将非常有用。您可以使用CircuitPython非常轻松地执行此数据记录。

要存储数据,您需要选择以下两个选项之一:

将SD卡固定器连接到主板的SPI总线,或者使用内置SD卡座的板,例如Feather M0 Adalogger。推荐的方法,因为它为您提供了很多存储数据的空间,并且您可以轻松地将数据复制到

将数据存储在电路板的内部文件系统中。这需要更多的设置,但是允许您保存到CircuitPython板的内部文件系统上的文件中,紧挨代码和其他数据文件的驻留位置。这是较为有限的,因为根据您的主板,您可能只有几个千字节或几兆字节的可用空间,并且GPS句子将迅速累加(在记录几个小时内轻松填充几兆字节)。

安装SD卡库

如果要在SD卡上存储数据,您必须确保SD卡已连接至开发板上,并且已安装Adafruit SD卡库。幸运的是,有完整的指南可供您学习,以了解连接SD卡和安装必要的库的过程。请务必仔细按照指南进行操作,以使卡已连接并已安装了磁带库,并且可以确认能够从Python提示符下手动将数据写入卡。

启用内部文件系统写入

如果要在内部文件系统上存储数据,则必须仔细按照CPU温度记录指南中的步骤进行操作,以允许写入内部存储。如果要写入SD卡,请跳过这些步骤,然后继续查看下面的数据记录代码。 在板上编辑 boot.py (如果不存在则创建它)并添加以下行:

下载:文件

复制代码

import digitalio

import board

import storage

switch = digitalio.DigitalInOut(board.D5)

switch.direction = digitalio.Direction.INPUT

switch.pull = digitalio.Pull.UP

# If the D5 is connected to ground with a wire

# you can edit files over the USB drive again.

storage.remount(“/”, not switch.value) import digitalio

import board

import storage

switch = digitalio.DigitalInOut(board.D5)

switch.direction = digitalio.Direction.INPUT

switch.pull = digitalio.Pull.UP

# If the D5 is connected to ground with a wire

# you can edit files over the USB drive again.

storage.remount(“/”, not switch.value)

记住,一旦重新挂载(“/”),您将无法再通过USB驱动器编辑代码!这意味着您无法编辑 boot.py ,这有点难题。因此,我们将 boot.py 配置为基于开关或什至只是鳄鱼夹接地而选择性地将内部文件系统安装为可写状态。就像CPU温度指南显示的一样。在此示例中,我们使用 D5 ,但选择任何可用的引脚。

此代码将在电路板启动时以及是否将其接地时查看D5数字输入。鳄鱼夹或电线,例如,将其从D5连接到电路板接地),它将禁用内部文件系统写操作,并允许您照常通过USB驱动器编辑代码。卸下鳄鱼夹,重置板,然后 boot.py 会切换为以可写方式安装内部文件系统,以便您可以再次将映像记录到该文件系统(但不要编写任何代码!)。

请记住,当您启用USB驱动器写入(通过在启动时将D5接地)时,您无法将文件写入内部文件系统以及您的 main.py 中的任何代码尝试这样做(如下面的示例)将失败。编辑代码时请记住这一点-修改代码后,您需要删除鳄鱼夹,将板重置为重新启用内部文件系统写操作,然后查看程序的输出。

如果遇到困难,可以按照https://learn.adafruit.com/cpu-temperature-如果需要返回并编辑代码,请使用电路日志记录python/write-to-the-filesystem从REPL中删除boot.py!

数据记录示例代码

GPS库示例具有数据记录。 py 文件,您可以将其编辑并另存为 main.py 在板上:

下载:Project Zip 或 gps_computer_datalogging.py | 在Github上查看

复制代码

Temporarily unable to load content:

Temporarily unable to load content:

默认情况下,此示例希望将GPS NMEA句子记录到内部存储系统上的文件中,该文件位于/gps.txt 。每次示例开始运行时,新句子都会添加到文件末尾。

如果您想改为写入SD卡,请注意不要注释注释中提到的相应行:

下载:文件

复制代码

# Path to the file to log GPS data. By default this will be appended to

# which means new lines are added at the end and all old data is kept.

# Change this path to point at internal storage (like ’/gps.txt‘) or SD

# card mounted storage (’/sd/gps.txt‘) as desired.

#LOG_FILE = ’/gps.txt‘ # Example for writing to internal path /gps.txt

LOG_FILE = ’/sd/gps.txt‘ # Example for writing to SD card path /sd/gps.txt # Path to the file to log GPS data. By default this will be appended to

# which means new lines are added at the end and all old data is kept.

# Change this path to point at internal storage (like ’/gps.txt‘) or SD

# card mounted storage (’/sd/gps.txt‘) as desired.

#LOG_FILE = ’/gps.txt‘ # Example for writing to internal path /gps.txt

LOG_FILE = ’/sd/gps.txt‘ # Example for writing to SD card path /sd/gps.txt

以及下面的内容:

都应取消注释,并与上面相同。这将配置代码以将GPS NMEA数据写入/sd/gps.txt 文件,并将新数据追加到文件末尾。

示例运行方式为板上的 main.py 打开串行REPL,您应该看到原始的NMEA语句已打印出来:

gps

检查 gps.txt 文件(位于根目录下或/sd路径,具体取决于您如何设置示例)在文本编辑器中,您将看到相同的原始NMEA语句:

gps

太棒了!这就是使用GPS模块和CircuitPython对NMEA句子进行基本数据记录的全部内容!

内置日志记录

MTK3339的优点之一是内置的数据记录器。这种基本的数据记录功能可以将日期,时间,纬度,经度和高度数据存储到内部的64K闪存芯片中。它不是高分辨率记录器-修复后仅每15秒记录一次-但对于99%的想要跟踪位置的项目,这可能是一种低功耗的数据记录方式-无需SD卡或其他EEPROM需要!它最多可以存储16个小时的数据。

GPS模块确实要求微控制器通过请求启动记录仪来“启动”记录仪。如果断电,则需要重新启动。如果闪存中已经有一些数据,则将创建新的跟踪(这样就不会丢失旧数据),如果空间用完了,它只会停止并且不会覆盖旧数据。尽管有这种烦恼,但它仍然是一个非常不错的附加功能,我们提供了一些库支持来帮助您使用它。

有关更多详细信息,请查阅LOCUS(内置数据记录系统)用户指南

首先,我们应该尝试运行记录器。打开文件→示例→Adafruit_GPS→locus_start 草图。这将演示如何启动记录器(称为LOCUS)

关键部分在这里:

下载:文件

复制代码

Serial.print(“STARTING LOGGING.。..”);

if (GPS.LOCUS_StartLogger())

Serial.println(“ STARTED!”);

else

Serial.println(“ no response :(”);

delay(1000); Serial.print(“STARTING LOGGING.。..”);

if (GPS.LOCUS_StartLogger())

Serial.println(“ STARTED!”);

else

Serial.println(“ no response :(”);

delay(1000);

,您应该启动记录仪,然后检查响应:

gps

记录状态

GPS可以记录日志,您可以加载状态草图,这还将为您提供更多数据。上载文件→示例→Adafruit_GPS→locus_status

gps

此输出为您提供了更多信息。第一个条目是日志号。这是内存中有多少日志跟踪。每次启动并保存数据时,都会创建一个新日志。完全停止意味着记录器一旦内存用完,它将停止。接下来的输出表明我们仅在修复数据期间并以设置的间隔进行记录,间隔延迟为15秒。我们不是根据距离或速度进行记录。当前状态为LOGGING(活动),还有我们存储的记录数。每条记录都是带有时间戳的位置。我们每15秒记录一次,您可以在此处看到记录从344增加到345的过程。最后,我们可以看到内部闪存的使用量,目前只有4%

在实际使用中,您可能希望开始记录,然后让微控制器进入睡眠状态保留电源,有时会醒来以检查日志记录状态。

下载数据

最后,完成记录后,我们需要提取数据。为此,我们需要首先从闪存中获取原始数据,然后对语句进行解码。将文件→示例→Adafruit_GPS→locus_dump 上传到Arduino,并打开串行监视器

请注意:请具有2K RAM缓冲区的Arduino处理64KB FLASH数据并将其从GPS吐出有时会给处理器增加负担。如果遇到打h,请查看下面的GPS工具说明

gps

将所有文本复制并粘贴到“-”之后(以 $ PMTKLOX,0,86 * 67 开头 $ PMTK001,622,3 * 36 ),然后将其粘贴到此页面上的框中

,您可以尝试使用该工具请捐赠给社区!

GPS工具

如果您在使用Arduino/javascript工具时遇到困难,也可以尝试使用GPS工具。该工具仅在Windows下运行,但功能非常强大。

将GPS模块连接到Arduino(与Direct Wiring示例连接),FTDI适配器或其他TTL转换器,然后下载GPS工具-通过COM连接到GPS Arduino/FTDI/TTL电缆的端口。然后,您可以查询,转储和删除日志存储器

资源

数据表

MTK3329/MTK3339命令集表,用于更改固定数据速率,波特率,句子输出等!

PMTK“完整”数据表(与上面类似,但具有更多命令)

PA6B(MTK3329)GPS模块本身的数据表

PA6C(MTK3339)GPS模块本身的数据表

PA6H(MTK3339)GPS模块本身的数据表

MT3339 GPS PC工具(仅限Windows)和PC工具手册

LOCUS内置记录器的示例代码和规格表

LOCUS(内置内置数据记录系统)用户指南

迷你GPS工具(仅适用于Windows)

更多阅读:

Trimble的GPS教程

Garmin的GPS教程

用于Arduino的Adafruit GPS库

https://github.com/adafruit/Adafruit-GPS -Library/

用于AGPS的EPO文件

EPO文件的数据格式

MTK_EPO_Nov_12_2014.zip

常见问题解答

终极GPS可以用于高海拔吗?我怎么知道?

2013年以上出厂的模块(许多2012年下半年开始安装)固件已通过40公里GPS工厂的仿真测试。

您可以通过发送固件查询命令 $ PMTK605 * 31 来告诉您拥有什么固件(您可以使用echo演示将自定义语句发送到GPS)

如果您的模块回复了 AXN_2.10_3339_2012072601 5223 ,这意味着您具有版本#5223,这是40Km支持的固件版本。如果数量大于5223,则其数量甚至更近,并且还应包括40Km支持

但是,这些模块不是专门为高空气球使用而设计的。人们已经成功使用了它们,但是由于我们(在Adafruit)尚未对它们进行高空使用的亲自测试,因此我们不以任何方式保证它们适合高海拔使用。

请不要要求我们“证明”它们适合高海拔使用,我们没有任何办法

如果您想使用GPS测量高海拔,请找到可以保证/保证高空功能的模块

终极GPS是否受2019周转期问题影响?

终极GPS( 20110922_GTOP_EVK01_A2.10 和更高-在2011年以后出售的任何产品)都经过了测试,直到2019年都可以正常工作。

它们没有通过2038过渡测试,因此您可能需要从现在到2038之间更新固件。这不会影响他的2019年展期(每20年有一次)

好,我想要最新的固件!

此处是5632固件的二进制文件,您可以使用此工具通过FTDI或USB-TTL电缆(或直接接线)上传FTDI)。我们没有更新固件的教程,如果您更新固件并以某种方式使GPS变砖,我们将不提供替代产品!在执行更新过程之前,请记住这一点!

我修改了示例代码,但我的GPS NMEA句子都乱码且不完整!

我们使用SoftwareSerial从GPS读取数据,这是对“ bitbang” UART的支持。它在Arduino上不是很好,并且可以工作,但是添加太多的delay()且未足够调用GPS数据解析器将导致其阻塞数据。

如果您使用的是Leonardo(或Micro/Flora/ATmega32u4)或Mega,请考虑使用HardwareSerial端口而不是SoftwareSerial!

我的GPS正在给我数据,但位置不正确!

由于GPS是工作正常,但“相距5英里”-这是因为它们没有正确解析经纬度数据。尽管有外观,但是地理位置数据并非以十进制度为单位。格式为度和分钟,格式如下:纬度:DDMM.MMMM(前两个字符为度。)经度:DDDMM.MMMM(前三个字符为度。)

为什么我无法使GPS以10Hz的频率输出?

GPS的默认波特率为9600-这只能以10Hz的频率发送RMC消息。如果要输出更多数据,可以提高GPS波特率(例如,达到57600)或采用2或5Hz的频率。您希望GPS输出更多数据,GPS波特率,Arduino缓冲区/处理能力和更新率之间存在权衡!

可能需要进行实验才能获得最佳结果。我们建议RMC仅在10Hz进行测试,因为它已经过测试。

为什么不能使用Adafruit RTC库设置RTC?

GPS中的实时时钟不可“写入”,也无法从Arduino访问。它仅在GPS中!一旦安装了电池,并且GPS首次从卫星接收数据,它将设置内部RTC。然后,只要安装了电池,就可以照常从GPS读取时间。即使没有适当的“ gps修复”,时间也将是正确的。

时区无法更改,因此您必须基于UTC计算本地时间!

所有GPS模块是否同时发出PPS脉冲?

在理想条件下,GPS模块在每个GPS秒开始的10ns内发出PPS信号。

实际上,每个GPS模块与GPS时钟系统的同步取决于修复的质量,GPS模块修复了多长时间以及一组该模块用于修复的卫星。我们已经观察到刚刚获得修复的模块之间的偏移约为300ns,在模块具有良好的修复后,偏移减少到不到100ns(模块用于修复的卫星的信噪比高于20)持续十分钟。

当两个GPS模块使用同一组卫星进行定位时,一旦模块获得定位,PPS脉冲之间的偏移就小于30ns。

如何读取Ultimate GPS USB上的PPS信号?

PPS线连接到串行端口 RI (环形指示器)引脚。您可以使用串行端口接口代码来阅读。例如,这是使用pyserial的Python版本:

import serial

ser = serial.Serial(’/dev/ttyS34‘) # open serial port

print(ser.name) # check which port was really used

last_ri = ser.ri

while True:

if ser.ri != last_ri:

last_ri = ser.ri

if last_ri:

print(“ ---------- Pulse high ----------”)

else:

print(“ ---------- Pulse low ----------”)

if ser.in_waiting:

print(ser.read(ser.in_waiting).decode(’utf-8‘), end=“”)

下载

文件

MTK3329/MTK3339命令集表,用于更改固定数据速率,波特率,句子输出等!

LOCUS(内置数据记录系统)用户指南

PA6B(MTK3329)GPS模块本身的数据表-在该模块的版本1中使用

PA6C(MTK3339)GPS模块本身的数据表-在该模块的版本2中使用

PA6H(MTK3339)GPS模块本身的数据表-在该模块的版本3中使用

MT3339 GPS PC工具(仅限Windows)和PC工具手册

小型GPS工具(仅限Windows)

GitHub上的EagleCAD PCB文件

Adafruit Fritzing库中的Fritzing对象

最终GPS v3原理图

gps

U精确的GPS加工打印

英寸尺寸

gps

最终GPS USB原理图

gps

最终GPS USB构造打印

gps

责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • gps

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分