不少新朋友来问,有没有好玩的GNSS定位应用推荐?那么不妨基于小巧易用的合宙Air530Z模组,来简单做一个业余无线电相关的GNSS小玩具。
今天特别分享@W_Linus大佬的开源作品——基于合宙Air530Z的定位器&授时器。
1
项目主要准备工作
基于合宙Air530Z的定位器&授时器,使用STM32G030F6P6单片机进行数据处理以及显示,使用0.96寸ST7735屏幕作为显示终端,同时将GNRMC数据通过串口发送到电脑,供上位机处理,使用按键进行交互。
01. GNSS模块:合宙Air530Z
GNSS模块我选用了合宙的Air530Z,原因是这个模块使用较为方便,原生支持有源GPS天线,效果OK。同时支持北斗三号、GPS以及格洛纳斯系统。
02. 单片机:STM32G030F6P6
对我来说方便开发,资源充足是很重要的因素。所以我决定在STM32系列MCU里面进行选择,项目制作前期STM32的价格一直居高不下,不过STM32G0系列却是一股清流。粗略估计了下所需要的资源后,我最终选择了STM32G030F6P6。
03. 屏幕:0.96寸 ST7735 LCD
至于信息的显示,肯定需要使用屏幕。不过是使用LCD还是OLED屏幕呢?我最终决定使用LCD屏幕。原因也很简单:它可以显示不同的色彩,制作出来的界面更加漂亮。所以,屏幕最终定型为0.96寸 ST7735 LCD屏幕。
04. 其他元器件:参见文末原工程链接BOM表
大框架定下来了,我便着手进行PCB的绘制。到目前为止,我已经绘制了3个版本的PCB。每一次迭代的原因几乎都是发现了一些之前忽略掉的,而现在发现了能难受半天的小缺陷。不过,每个版本都是可以正常使用的。
至于程序,得益于之前玩GNSS模块的成果,没有费多大功夫就写出了初版基本可用的程序。使用STM32CubeMX工具和MDK工具链进行开发,是大多数像我一样的新手的选择罢:
一开始我想着是准备上RT-Thread实时系统的,后面又想了想感觉没多大必要,于是就采取了裸机跑程序的方案。事实证明,没有外加存储器的情况下,屏幕所使用的字库非常占用Flash空间。
当前版本下采用O1优化,程序大小已经来到了惊人的31.54KB,距离塞满我这颗32KB ROM的MCU只差一步之遥。
MCU开了两个串口,一个用于和模块通信,另一个与上位机进行通信。与模块之间的数据流是持续不断的,所以我在这里使用了DMA来进行串口的数据接收以减轻CPU的负担,同时避免丢失数据包。
既然程序准备OK了,那么就等待PCB到货进行焊接制作了。全贴片方案果然还是使用加热台来进行焊接最安逸了 :
焊接完成并且烧录程序后,我们就得到了这样的成果:
2
主要功能及开源交流
合宙Air530Z模块在使用有源天线以及在存在后备电源供电的情况下时,热启动定位非常迅速,几乎可以说是秒定位。不过当模块内存储的历书过期后,使用冷启动就要稍微慢一些了。
根据功能内容的实现和显示差异,我将程序分为了如下几个功能界面:
01. 启动界面
上电时,我们会看到一个启动界面(飞机上未录制,此处使用之前的图片素材)。
02. 详细信息首界面
开机后默认会进入详细信息界面:系统将会显示当前时间、速度、经纬度以及梅登海德网格。最上方的状态栏则指示了当前定位情况、系统温度(MCU内置的温度传感器,使用了工厂校准值)和电池剩余电量指示(电压估算,没有使用库仑计,因此并不精准,只能作为参考)。
03. 日期与时间专题显示界面
通过PCB顶部的右侧按钮可以进行翻页,进入日期与时间的专题显示。此时还可以通过顶部的左侧按钮,切换UTC时间与CST(即北京时间)。
04. 速度专题显示界面
接下来的一页是速度的专题显示,一共三组数值:分别是km/h、m/s和节。事实上显示的速度换算关系并不精准,原因是内容刷新时间并不一致。刷新存在先后关系,导致并非展示同一时刻下的数据。
05. 系统信息显示界面
再接下来的一页是系统信息的展示,内容有当前系统温度(对,和状态栏上那个是一样的)、当前系统工作电压(通过使用ADC对内置的Vrefint通道进行采样,再通过内置的通道校准值来计算实际的3.3V供电电压)、当前电池电压以及固件版本。
06. 报文信息显示界面
最后一页是原始的GNSS报文展示,我这里为了解析方便,设定了模块只使用GNRMC报文。GNRMC已经足够使用,缺点则是没有高程信息以及卫星数量的报告。后面如果有时间,我再尝试加上其它报文(如GNGLL、GNGGA等)的解析功能吧。
在屏幕展示这些数据的同时,MCU与上位机通信的串口也不会闲着。它会实时转发模块发来的GNRMC数据包,这样,我们将这个设备插上电脑(它自带了CH340N芯片),便可以同步使用例如BktTimeSync之类的软件,来利用GNSS系统对电脑进行授时了。这对于在野外操作FT8等严格要求时序的通联模式有较大帮助。
现在的固件只包含了以上功能,接下来我会尝试继续完善这个小玩具。比如增加更多报文的解析、自定义启动屏幕的呼号显示等功能,再将现在的GUI美化一下。希望剩余的ROM还能支持我这么干~
全部0条评论
快来发表一下你的评论吧 !