迪文科技论坛

 找回密码
 立即注册
搜索
查看: 328|回复: 0

【开源】COF案例分享:用迪文屏模拟660RTK手持机

[复制链接]

574

主题

169

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12353
发表于 2022-4-25 15:39:40 | 显示全部楼层 |阅读模式
——文档转载自电子发烧友

一、660RTK手持机简介

660RTK导航手持机是一种基于合宙4G+GNSS模块开发的终端产品,定位精度可达厘米级,广泛应用于水渠修建、电力巡检、野外勘探、坐标找点、面积测量、日月天文、地形测量、户外探险等等,高精度以及便捷携带需求的应用场景。660RTK主要由三部分组成:

1. 4G通讯:用于下载AGPS星历文件、RTK差分定位的服务端交互、加载地图信息;
2. GNSS定位:确定当前位置及各个系统的定位卫星的相关信息;
3. 大屏显示:为用户显示地图信息等。


二、准备工作

采用合宙的Air551G定位模块和迪文T5L5寸屏,也就是已经具备了660RTK基本功能的组件,完全可以实现GNSS卫星信息的显示,所以打算模拟660RTK做一个简单的卫星显示系统, 我的660RTK是这样的:



三、开发过程

做起来不是很复杂,工作量主要是两点:1.解析合宙Air551G定位模块的数据,获取相关的卫星信息;2.使用迪文屏T5L内部的单片机做主控,合定位模块通讯,并控制屏幕动态显示。下面详细说明一下开发的过程及要点。

1.合宙Air551G定位模块的通讯及数据解析

Air551G支持多种卫星定位系统,美国的GPS、中国的北斗、俄罗斯的格洛纳斯、欧洲的伽利略等都支持,并且GK9701芯片也有对应的指令可以打开或关闭某个系统。既然Air551G支持L1+L5,那么就都打开吧,可以搜到许多卫星。打开方式也很简单,串口直接发送“$PGKC121,5,F,7*2B”设置搜星模式,就是全系统了。并且这个指令会保存到Flash里,只要设置一次断电也没关系。一般的定位模块都使用NMEA0183协议,Air551G也同样支持。将串口连接好后,接收到的所有数据按照NMEA0183来解析即可。常用的数据为:

    (1)GPGGAGPS定位信息;
    (2)GPGSA:当前卫星信息;
    (3)xxGSV:可见卫星信息;
    (4)GPRMC:推荐最小定位信息;

只解析这四种数据就能完成基本功能,其他的可以忽略掉,看具体情况来使用。






自己写的NMEA0183C语言文件,第一个结构体是卫星的基本信息,多个卫星就创建多个实例。第二个结构体是当前定位信息,只要一个实例就够了。接口函数有几个,简单说明一下:
(1)Clear函数。在其他单片机中这个函数不是必须的,但是T5Lxdata数据只能声明不能再初始化之前赋值,所以用这个Clear当作清零和赋初始值用;
(2)Data函数。收到的所有数据都往这里扔,会自动分类并解析。
(3)GetXX:需要取得哪个系统的信息就调用哪个函数,这里只包括四种:GPS、北斗、格洛纳斯和伽利略,其他的没什么用就不要了。
(4)GetGNSS:得到当前的定位信息,经纬度和时间等。
再来看看各个解析数据的实现方法,Clear就不说了:
(1)判断数据头是哪种数据,GNGSAGNRMCGAGSVBDGSVGLGSVGPGSV,有用的是这些,GNGGA是定位的类型,用不到也可忽略;
(2)根据得到的数据类型再分别按照协议的格式解析出每个字段的值。由于xxGSV有可能一批数据分几包发送过来,所以最简单的方法就是以GPGSV为本批数据开始,中间收到的各种xxGSV数据根据上面提到的四种系统分别累计,最后以GNRMC为本批数据结束,此时就可以得到完整的定位信息和卫星信息了。
(3)获取定位信息或者得到指定卫星系统的信息,直接调用GetXX即可。为了防止读写同时进行的死锁,建议在解析完RMC数据后再进行,如果双缓冲区更好。



每次获取数据只在处理完完整的数据后再进行其他的操作,提前获取也没什么意义。Air551G默认一秒钟输出一次全部数据,所以每秒钟更新一次界面上的图表数据。

至此,和定位相关的程序完成。

2.迪文屏T5L的单片机开发及显示控制

我申请到的是DMG85480F050_01WTC5寸的电容屏,分辨率为480x854,默认竖屏显示。迪文屏其实就是个串口屏,可以通过发送各种指令在屏幕上显示不同的东西。不过,一般的串口屏需要外接一个单片机来作为主控,所有的逻辑操作或外设的驱动都要在这个单片机中来完成,屏幕也只是个外设而已。迪文屏的屏内芯片是一个双核的51单片机,其中一核专用于接收指令显示对应内容,经过优化后显示速度很快,用户不能直接操作此核;另外一核就是用户可操作核,自己写的程序可以烧写到这个核内来执行,所以不需要再外接单片机了。虽然是C51的内核,但是频率已经提高到了206M,不管是用户的程序还是屏幕的显示,运行起来非常迅速,没有卡顿。


迪文屏这边的开发又分为两个部分:界面的静态显示及动态数据的显示和C51程序逻辑及外设控制。

(1)界面的静态显示:

首先要做好一张背景图片,所有的网格线都做再图片中而不是用程序或控件画出来,这样可以免去反复调试的麻烦。
如图,四个定位系统区分开了,每个部分只显示对应的系统,没有显示说明没有这个系统的卫星信息,更加直观。每种系统用不同颜色来显示,一目了然。红色北斗、蓝色GPS、黄色格洛纳斯、绿色伽利略,再图例中加以说明。图片的大小就是屏幕分辨率的大小,480x854



迪文提供了制作显示界面的工具DWIN DGUS,首先用这个工具建立一个新工程,把刚才做好的背景图片导入进来,背景图片的文件名要以0为开头,后面任意。导入后增加显示的控件,柱状图是动态画上去的,使用“基本图形显示”这个控件来指定可画图的范围。每个控件可以显示多种图形,如点、线、面等,但一个控件同一时刻只能显示一种,比如这次画点,那么这个控件上这一次只能画点,虽然能显示许许多多的点,但是想要改成线就只能清除后再次画线,不能并存。多个同种图形的颜色可以分别指定。

回到这个程序,想在不同的地方画图,我使用了四个控件,其实一个大的控件也可以,因为实际画图的坐标是绝对坐标而不是相对坐标,也就是坐标的原点是屏幕的0,0而不是控件的0x0。用一个大的控件反而更容易理解一些,不过已经做出来了就懒得改了,一样的。四个控件要指定四个不同的变量地址,程序中控制画图的时候要指定在哪个控件上画需要这个变量地址。

界面设计完成后,点击“生成”按钮可以自动产生烧写用到的屏幕相关的文件,0CNR.icl背景文件、13TouchFile.bin触控文件、14ShowFile.bin显示文件、22_Config.bin界面配置文件还有T5LCFG.CFG屏幕配置文件。模拟程序还没有做完,后面再显示卫星数据的话,还需要增加字库文件。



(2)C51程序的外设控制

为了开发方便,封装了外设接口,在使用时就不需要再查看寄存器了。


还没有写完,用到的时候随时补充。迪文T5L4个串口,比一些小单片机用起来爽多了。不过注意一下,串口2如非必要最好保留,后续烧写程序时可能会用到。代码的实现就不细说了,有例程可以参考。

(3)动态数据的显示:

前面说过柱状图是动态画上去的,现在就要用程序来控制画图,并使“基本图形显示”控件显示出来。


代码非常非常简单,就是定了一个结构体,每个结构体的实例是一个图形的起始坐标和结束坐标,再加上一个颜色。按照定位系统分成四类,每类的结束坐标的Y轴是固定的,开始坐标的Y根据信号强度计算出来;每一个柱状图的起始X和结束X,根据卫星编号计算出结果。有几颗卫星就生成几个实例,然后把这些数据组成图形显示的数据发送给屏幕。读屏和写屏有专用的函数,ReadVPWriteVP,指定控件的自定义地址,再把刚才拼成的实例数据当成参数传进来,写就是了,速度很快。

(4)C51程序的逻辑控制:

逻辑控制就更简单了,把上面那几项功能串起来而已。当每一批的定位数据收全后,分别获取北斗、GPS、格洛纳斯和伽利略四种系统的卫星信息,遍历每一个信息并调用计算图形的函数,最后写入屏幕,完成。




代码和界面都做完了,现在要编译一下C51的程序,生成hex文件。不过烧写的时候需要的是bin文件,所以要先转换一下。首先在工程文件夹下新建一个文件夹,名称随意,我这里命名Release,批处理文件中使用command命令进入这个文件夹,删除之前转换好的文件,再调用一下srec_cat.exe这个转换工具,并指定输出的文件名。保存后,再在Keil里设置为每次编译后执行,就会把hex文件自动转换后放入Release文件夹里,省去了手动的操作。




烧录成功界面展示。




演示视频链接:https://www.bilibili.com/video/BV1ZY411V7fo/


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-1-14 21:27 , Processed in 0.080153 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表