657|1

19

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子Follow me第1期】任务4:实现定位功能 [复制链接]

  本帖最后由 你家吃的 于 2023-5-28 12:00 编辑
  1. 目标:掌握GNSS模块用法,实现定位功能

            使用硬件:Raspberry Pi Pico w开发板、GROVE - GPS扩展板

  1.  Air530外设的使用
     模块说明文档 NMEA数据格式说明.docx (34.24 KB, 下载次数: 0) Air530 GPS模块用户手册V1.9.pdf (919.37 KB, 下载次数: 0)
20210301115201307_CASIC多模卫星导航接收机协议规范-20210301.pdf (2.87 MB, 下载次数: 0) 20211221160333351_Air530Z定位模块使用手册V1.4.pdf (1.28 MB, 下载次数: 0)

     硬件接口使用的uart。

    支持NMEA0183 协议。

    数据格式使用GKC。

    GKC数据帧如下:

$PGKC cmd arguments * checksum cr     lf

$PGKC是数据帧的帧头

cmd:数据帧的命令号

arguments:参数,可以有多个

*:数据结束的标记

checksum:校验数据

cr:回车 ,即 \r

lf:换行 ,即 \n

 

 

下图是Air530Z的原理图,可看到有一对uart接口引出。mcu通过此接口与芯片通信,获取卫星信息。

 

 

 



 

数据帧帧头格式有两部分组成:xxaaa,其中xx代表发送器标示符,aaa表示数据帧的含义。

下图是发送器标示符的意义:

 

下图是数据帧的含义:

 名词解释:

QZSS:        准天顶卫星导航系统

SBAS:        星基增强系统

GGA:            时间、位置、卫星数量

                    GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh

 

 



以下是简单的获取定位信息数据帧:

import network
import time
import utime
from machine import UART, Pin

uart1 = UART(0, baudrate=9600, tx=Pin("GP0"), rx=Pin("GP1"))


def GetSum(Frame):
    sum = 0;
    for b in Frame:
      #  print("-----------",type(b),'-------',type(Frame),'-------',type('$'))
        if(b == ord('$')):
           # print("this is $,continue!!")
            continue
        if(b == ord('$')):
           # print("to frame end,sum is [%x]!!",sum)
            break
        sum ^=b
        #print("{}  {:x}-sum{:02X}-".format(b,b,sum))
    return sum

#fm2CloseAll = b'$PGKC242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'
#fm2CloseMsg = b'$PGKC242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'
fm3Intval10000ms = b'$PGKC101,10000'
def getFrame(Frame):
    sum = GetSum(Frame)
    fm = '{}*{:02X}{}'.format(Frame,sum,"\r\n")
    print('split nmea frame :',fm)
    #print(fm.hex())
    return fm

#uart1.write(getFrame(fm2CloseAll))
#uart1.write(getFrame(fm2CloseMsg))
uart1.write(getFrame(fm3Intval10000ms))
fm4 = b'$PGKC279*23\r\n'
while True:
    #uart1.write(fm4)
    print('write msg: {}'.format(fm4))
    utime.sleep_ms(100)
    if uart1.any():
        bin_data = uart1.readline()
        print('NMEA msg: {}'.format(bin_data))
        

刷新的数据如下


有一问题下发命令不生效。能够正常读到定位模块发回的数据帧,说明串口配置是正确无误的。

但是写下去的命令都无生效,也无返回。这不太符合逻辑,感觉这个模块好像忙的不得了,不读自己的输入数据了。

后续继续研究研究,感觉代码逻辑里哪里都没错误,文档里讲的有点被我遗漏的信息。

 

-------------毕竟浪费一天时间,怪自己不细心,air530和air530z在一个文档里,自以为他俩使用同一个自定义命令,万万没想到他俩自定义命令不是一个。

如下图:

 唉,一点点疏忽就是一天的白干。。。。。。。。。。。。。。。。。。。。。。

不过现在可以解决疯狂的刷新数据帧的困扰了。

命令帧的校验码不确定的话,可以通过网站:http://www.metools.info/code/c48.html 确认一下。

如下是几条我测试代码使用的:

$PCAS06,0                                                      获取版本号

$PCAS03,0,0,0,0,0,0,0,0,0,0,0,0,0                  停止所有数据源的刷新

PCAS02,1000                                                  刷新率 1000ms

以下是下发正确命令的代码

import network
import time
import utime
from machine import UART, Pin

uart1 = UART(0, baudrate=9600, tx=Pin("GP0"), rx=Pin("GP1"))

def GetSum(Frame):
    sum = 0;
    for b in Frame:
        if(ord(b) == ord('$')):
            #print("this is $,continue!!")
            continue
        if(ord(b) == '*'):
           # print("to frame end,sum is [%x]!!",sum)
            break
        sum ^=ord(b)
        #print("{} {:x}-sum{:02X}-".format(b,b,sum))
    return sum


def getFrame(Frame):
    sum = GetSum(Frame)
    fm = b'{}*{:02X}\r\n'.format(Frame,sum)
    print('NMEA send: {}'.format(fm))
    return fm

fm3GetVer = '$PCAS06,0'
fm2CloseAll = '$PCAS03,0,0,0,0,0,0,0,0,0,0,0,0,0'
fm3Intval500ms = 'PCAS02,500'
fm2UtcOnly =  '$PCAS03,1,1,0,0,0,0,0,0,0,0,,,1,0,,,,1'
fmWkMode = b'$PCAS04,3*1A\r\n'

uart1.write(fmWkMode)
uart1.write(getFrame(fm2CloseAll))
uart1.write(getFrame(fm3GetVer))
uart1.write(getFrame(fm3Intval500ms))
uart1.write(getFrame(fm2UtcOnly))
while True:
    if uart1.any():
        utime.sleep_ms(100)
        bin_data = uart1.readline()
        print('NMEA msg: {}'.format(bin_data))
        


代码开启gll gga格式数据,关闭其他消息,信息刷新频率设置500ms,开机获取一次版本号。

58D113F5AF0EDFC8141FAD074DEC6A72

查看utc时间刚好是对的。

剩下的工作就是解析,并显示。这部分工作就简单了,通过关键字’,‘来分割字符串,摘出来有效的数据,并显示。 

  • 备注:

micropython  字符串处理函数:

                    len ()、upper ()、lower ()、strip ()、replace ()、split () 、join ()

 

  1. ord('b') # convert char to int

  2. chr(100) # convert int to char
  3. unichr(100) # return a unicode byte
  4. print(bin_data.hex())  :打印byte数组的原始16进制数值

 

 

 

 

最新回复

资料可真详细   详情 回复 发表于 2023-5-28 21:18
点赞 关注(2)
 
 

回复
举报

4817

帖子

4

TA的资源

版主

沙发
 

资料可真详细

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表