【得捷电子Follow me第1期】任务4:实现定位功能
[复制链接]
本帖最后由 你家吃的 于 2023-5-28 12:00 编辑
- 目标:掌握GNSS模块用法,实现定位功能
使用硬件:Raspberry Pi Pico w开发板、GROVE - GPS扩展板
- Air530外设的使用
硬件接口使用的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 ()
-
ord('b') # convert char to int
- chr(100) # convert int to char
- unichr(100) # return a unicode byte
- print(bin_data.hex()) :打印byte数组的原始16进制数值
|