Raspberry Pi Pico玩转GPS—L80-R

 之前有用STM32玩过移远的GPS模组L80-R,现在有了Pico,自然要移植把玩一番。

01

L80-R简介

移远L80-R GPS模块,带嵌入式贴片天线(15mm× 15毫米× 4毫米)LNA带来高性能MTK定位引擎的工业应用性能。它能够实现行业的最高级别的灵敏度、精确度和TTFF,在较小的占地面积内具有最低的功耗,它有66个搜索频道和22个同时跟踪频道,即使在室内信号水平,也能在最短时间内跟踪卫星。

L80-R模块集成了许多先进的功能,包括AIC,易于进入紧凑的外形因素。

这些特性有利于降低TTFF,提高GPS系统的灵敏度。L80-R型由于采用了嵌入式贴片天线和低噪声放大器,使得器件的设计和成本大大降低。

L80-R模块是SMD型模块,紧凑型16mm× 16毫米× 6.45mm外形尺寸。可能是的通过间距为2.54毫米的12针焊盘嵌入到应用程序中。它提供了必要的

与主PCB连接的硬件接口。该模块完全符合欧盟法规

原理图如下所示:

02


GPS协议

GPS 上电后,会有一定的启动时间,冷启动在15s左右,具体时间如下表

每隔一定的时间就会返回一定格式的数据,$GPGSV $GPGLL $GPRMC  $GPVTG $GPGGA$ 数据格式为 $信息类型,x,x,x,x,x,x,x,x,x,x,x,x,x每行开头的字符都是'$',接着是信息类型,后面是数据,以逗号分隔开。比如我们需要的最小定位信息一行完整的数据如下:

"$GPRMC,090634.000,A,2812.7182,N,11252.7955,E,0.23,29.82,270421,,,A*5A"

GPS信息类型:

GPGSV:可见卫星信息
GPGLL:地理定位信息
GPRMC:推荐最小定位信息
GPVTG:地面速度信息
GPGGA:GPS定位信息
GPGSA:当前卫星信息
GPRMC 最小定位信息:
数据详解:$GPRMC,

,,,,,
,

,

,

,

,

,

*hh

 UTC 时间,hhmmss(时分秒)格式  定位状态,A=有效定位,V=无效定位 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)  纬度半球N(北半球)或S(南半球) 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
 经度半球E(东经)或W(西经)

地面速率(000.0~999.9节,前面的0也将被传输)

地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)

 UTC 日期,ddmmyy(日月年)格式

磁偏角(000.0~180.0度,前面的0也将被传输)

 磁偏角方向,E(东)或W(西)

模式指示(仅NMEA01833.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

解析内容:
1.时间,这个是格林威治时间,是世界时间(UTC),我们需要把它转换成北京时间(BTC),BTC和UTC差了8个小时,要在这个时间基础上加8个小时。
2. 定位状态,在接收到有效数据前,这个位是‘V’,后面的数据都为空,接到有效数据后,这个位是‘A’,后面才开始有数据。
3. 纬度,我们需要把它转换成度分秒的格式,计算方法:如接收到的纬度是:2812.71822812.7182/100=28.127182可以直接读出28度, 2812.7182–28*100=12.7182, 可以直接读出12分12.7182–12 =0.7182*60=43.092读出43秒, 所以纬度是:28度12分43秒。
4. 南北纬,这个位有两种值‘N’(北纬)和‘S’(南纬)
5. 经度的计算方法和纬度的计算方法一样
6. 东西经,这个位有两种值‘E’(东经)和‘W’(西经)
7.速率,这个速率值是海里/时,单位是节,要把它转换成千米/时,根据:1海里=1.85公里,把得到的速率乘以1.85。
8. 航向,指的是偏离正北的角度
9. 日期,这个日期是准确的,不需要转换

所以我们需要的做的事情就是从数据中筛选出最小定位信息,然后对数据进行解析即可

03


Pico解析GPS数据

1、首先配置好两路串口,一路用来接收GPS数据,一路用来打印解析结果

#串口配置
uart1 = UART(1,baudrate=9600,tx=Pin(8),rx=Pin(9))
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

2、定义一个数据解析的方法,用来在后面调用

def DataParse(value,flag):#定位数据解析temp=float(value)/100temp_arr=str(temp).split('.')fac=100000if flag==0:#纬度fac=10000temp_arr[1]=str(float(temp_arr[1])/60*fac).replace('.','')result=temp_arr[0]+'.'+temp_arr[1]   return result

3、串口接收数据并处理,我们以'\n'作为结束符

while True:   while uart0.any() > 0:rxData_One = uart0.read(1)rxData = rxData+rxData_Oneif rxData_One == b'\n': #以\n作为一帧数据j结束#把数据长度作为数据处理的开始if 604 and rxData[0]=='$GPRMC':#纬度latitude=rxData[3]if latitude=='':uart1.write("the latitude is {}\r\n".format(float(0.00)))else:latitude=DataParse(latitude,0)uart1.write("the latitude is %.2f" % float(latitude) +"{}\r\n".format(rxData[4]))#经度longitude=rxData[5]if latitude=='':uart1.write("the longitude is {} \r\n".format(float(0.00)))else:longitude=DataParse(longitude,1)uart1.write("the longitude is %.2f" % float(longitude)+"{}\r\n".format(rxData[6]))rxData=bytes()else:rxData=bytes()

我们可以看到Thonny 的shell打印出原始数据以及处理成列表的数据

串口助手上可以看到解析后的经纬度数据,我们这里只保留了两位小数

到这里,整个对接过程基本完成,没什么太大难度,需要注意的是,GPS在室内是很难收到信号的,接收的GPRMC的数据长度也会发生变化,这也就是我们为什么要通过数据长度来过滤数据了。

听说关注公众号的都是大牛


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部