【ATK1218-BD】北斗/GPS定位模块 + Arduino 测试开发

目录

一、概述

二、ATK-1218-BD简介

三、驱动代码测试

四、通信协议解析

(一)GNZDA:时间信息:

(二)GNGGA:卫星定位信息

(三)GPVTG:地面速度信息

五、测试结果

六、总结


一、概述

        GPS模块是功能强大的一款模块,应用非常的广。本文将围绕其展开,从他的配置、驱动代码、通信协议解析、测试结果比对等方面进行阐述,尤其是GPS通信协议的解析对于理解GPS数据有着重要作用,是小白所必须了解的,希望可以给大家带来一定的帮助。

二、ATK-1218-BD简介

         我所使用的ATK-1218-BD所对应的模块是正点原子的一款产品。

 老规矩先给出官方的资料下载链接: 北斗GPS模块ATK-1218-BD — 正点原子资料下载中心 1.0.0 文档

        由于下图中的视频链接内只有展示部分,并没有具体的教学部分,我将在后续过程分享一下自己的操作经验,详细内容可以参考正点原子提供的齐全资料。

        它具体有什么优势我们就不在这里赘述了,先大概阐述一下我的驱动代码实现的功能:以ESP32S3为中控,在检测其他传感器的数据的同时,与ATK-1218-BD模块通信获取实时的时间、位置、速度、海拔、方向(基于真北或磁北)、数据是否有效等等,最后将数据打印出来或者存储起来。

        明确了想要实现的功能之后,我们就先了解一下硬件部分,它的一些基本参数如下:

        其中标注的是一些常见的需要注意的问题:

        1、默认波特率是38400,在驱动测试的时候一定要适配;如果你没有对波特率进行更改的话

        2、启动是需要时间的,而且冷启动最快是29s,这说明它对所处环境要求较高,开阔、没有特殊遮挡物、并且天气也不能过于极端。我在天台上测试的启动时间一般都是一分钟左右可以从卫星上开始接收到信息,在室内基本上就是GG。

三、驱动代码测试

        如果你想要用官方提供的软件平台进行测试的话(也就是下面这张图的操作界面),可以参考资料文件中的《GPS Viewer UserManual_v1.pdf》中的详细资料。

        本文主要讨论ESP32S3和ATK-MO1218之间的驱动测试(如下图)。注意:此代码是在Arduino IDE上进行的测试,其他平台需要另做规划,使用IDE的目的主要是快速的测试出与GPS通信的思路。

#include <SoftwareSerial.h>
 
// The serial connection to the GPS module
SoftwareSerial ss(18, 17);  // RX,TX
 
void setup(){
  Serial.begin(38400);
  ss.begin(38400);
}
 
void loop(){
  if (ss.available() > 0){
    // get the byte data from the GPS
    byte gpsData = ss.read();      
    Serial.write(gpsData);
  }
}

通过图中的代码可以直接读到最原始的数据:

        串口监视器所选择的波特率要和你自己代码里的一致,不然看到的全是乱码,而且也一定要保证你所在的环境是空旷开阔的地带,不然读到的数据全是无效的, 或者全部都是显示0。

        注意:如果你需要调整波特率,想要定制一个更加具体的初始化设置,你可以参考正点原子中所提供的代码以及《ATK-MO1218模块使用说明》。在这里只做一些较为基本的测试。

四、通信协议解析

        如果使用上述代码测试之后可以正确的读到数据了,并且数据不是零,那么就要开始解析这些数据了,因为大概率你是看到了但是看不懂的状态,在这里我将取几个我用到过得来说明,其中也是包括时间、经纬度、加速度、海拔、方向等重要数据。

        具体来讲,我们需要解析的就是GPS NMEA协议,0183 定位数据格式,双模定位:GNXXX GPS+BD,如果是GN开头的数据则不做区分,如果是GP或者BD开头的数据则要进行区分。

数据帧格式:$aaccc,ddd,ddd,…,ddd*hh

​ 数据种类:

  • GNZDA:UTC 时间和日期

  • GNGGA:UTC时间信息

  • GPGLL:地理定位信息

  • GPGSA:当前GPS卫星信息

  • BDGSA:当前北斗卫星信息

  • GPGSV:GPS可见卫星信息

  • BDGSV:北斗可见卫星信息

  • GNRMC:推荐定位信息

  • GPVTG:地面速度信息

(一)GNZDA:时间信息

​         UTC 时间和日期 :这里的UTC时间是指协调世界时,相当于本初子午线(0经度上的时间),和北京时间差8个小时

​ 数据示例: $GNZDA,092320.000,25,04,2021,00,00*40

​ 帧格式:$GPZDA, <1>,<2>,<3>,<4>,<5>*hh

​ 数据说明:

  • <1> :UTC时间,dd:dd:dd.ddd —> 时分秒
  • <2>:日
  • <3>:月
  • <4>:年
  • <5>:地方时与世界时之差
  • <6>: 检校位 *hh

(二)GNGGA:卫星定位信息

数据示例:$GNGGA,092320.000,2519.0490,N,11024.8391,E,1,23,0.7,175.7,M,0.0,M,*7D

$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh

  • <1> UTC 时间,hhmmss(时分秒)格式 和GNZDA的UTC一样,属于协调世界时
  • <2> 纬度 ddmm.mmmm(度分)格式(前面的 0 也将被传输)
  • <3> 纬度半球 N(北半球)或 S(南半球)
  • <4> 经度 dddmm.mmmm(度分)格式(前面的 0 也将被传输)
  • <5> 经度半球 E(东经)或 W(西经)
  • <6> GPS 状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
  • <7> 正在使用解算位置的卫星数量(00~12)(前面的 0 也将被传输)
  • <8> HDOP 水平精度因子(0.5~99.9)
  • <9> 海拔高度(‐9999.9~99999.9)
  • <10> 地球椭球面相对大地水准面的高度
  • <11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
  • <12> 差分站 ID 号 0000~1023(前面的 0 也将被传输,如果不是差分定位将为空)

        经纬度转化方法:假如得到的数据中,可以得到纬度是 2519.0490 N,那么实际的纬度=25+19.0490÷60,得到的经度是11024.8391,那么实际的经度是:110+24.8391÷60 因为报文里面用的是标准的度分格式,由于经纬的范围分别是090、0180,所以切割位置也不一样 。

(三)GPVTG:地面速度信息

         示例数据:$GNVTG,0.00,T,M,0.00,N,0.00,K,A*23

​ $GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
​ <1> 以真北为参考基准的地面航向(000~359 度,前面的 0 也将被传输)
​ <2> 以磁北为参考基准的地面航向(000~359 度,前面的 0 也将被传输)
​ <3> 地面速率(000.0~999.9 节,前面的 0 也将被传输)
​ <4> 地面速率(0000.0~1851.8 公里/小时,前面的 0 也将被传输)
​ <5> 模式指示(仅 NMEA0183 3.00 版本输出,A=自主定位,D=差分,E=估算,N=数据无效)  

五、测试结果

        GPS的测试结果比较敏感,存在暴露隐私信息的风险,我只能简要阐述一下我得到的结果: 时间(数据与Arduino IDE生成的时间戳相差700ms左右)、经纬度也存在一定的偏差(大概达到了0.0002的差值,经过地图反查得到的结果偏差还是挺大的,理想应该是最多几米的偏差)

其中我所使用的地图反查网页是:(比百度地图好像要细致一些)

在Google地图上测量:纬度经度坐标,地址,距离,面积,折线,圆 (sunearthtools.com)

        暂时由于工作原因无法得到较多的实验数据,但是根据目前车辆上的GPS使用情况,通过设计以及具体硬件辅助配置GPS的精度肯定是可以达到很高的,主要在于启动速度、存储方式、数据解析这几个方向还需要进一步编辑。

值得一提的是,geogle地图真的好清晰:(无需魔法可以直接访问)

谷歌卫星高清地图-Google地图在线 (gditu.net)

六、总结

        其实可以看出来,和GPS模块进行通信并不困难,甚至可以说十分简单,但是在对他的数据如何进行处理时往往会比较复杂,但是不至于没有思路,无非就是换算的问题,实在不行根据官方提供的资料里面的代码仿写改进一个也就有了适合自己使用的驱动。

        在调试过程中我最感慨的还是GPS太牛逼了,卫星太牛逼了,我在地面上的传感器都不一定说自己肯定测得准,它在万里高空还能得到如此多、如此准确的数据,覆盖到我们的生活的方方面面,可惜了,没机会去造个卫星,哈哈哈。

        留坑:最近在想利用加速度传感器手搓一个计步器,希望可以比微信步数的准,而且方便操作,用来乐呵乐呵。并且如果在后续有更加准确的GPS测试数据我也会在上文补齐更新。

        如果本文对你有帮助的话,不妨点个赞。欢迎留言讨论问题,一起讨论问题、解决问题。也欢迎你对我的频道进行关注,告诉我你想要看到的内容。

  • 36
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值