迪文智能屏
直播中

jf_89761755

4年用户 141经验值
擅长:嵌入式技术
私信 关注
[经验]

【迪文COF结构智能屏试用体验】用迪文屏模拟660RTK手持机

660RTK.png

    660RTK导航手持机是一种基于合宙4G+GNSS模块开发的终端产品,定位精度可达厘米级,广泛应用于水渠修建、电力巡检、野外勘探、坐标找点、面积测量、日月天文、地形测量、户外探险等等,高精度以及便捷携带需求的应用场景。在我看来,660RTK主要由三部分组成:
    1.4G通讯:用于下载AGPS星历文件、RTK差分定位的服务端交互、加载地图信息;
    2.GNSS定位:确定当前位置及各个系统的定位卫星的相关信息;
    3.大屏显示:为用户显示地图信息等;

    恰巧在电子发烧友同时申请到了合宙的Air551G定位模块合迪文T5L的5寸屏,也就是已经具备了660RTK基本功能的组件,完全可以实现GNSS卫星信息的显示,所以打算模拟660RTK做一个简单的卫星显示系统。我的660不RTK是这样的:

My.jpg
    很Low是吧,哈哈。


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

一、合宙Air551G定位模块的通讯及数据解析:

551G.png
    Air551G支持多种卫星定位系统,美国的GPS、中国的北斗、俄罗斯的格洛纳斯、欧洲的伽利略等都支持,并且GK9701芯片也有对应的指令可以打开或关闭某个系统。既然Air551G支持L1+L5,那么就都打开吧,可以搜到许多卫星。打开方式也很简单,串口直接发送“$PGKC121,5,F,7*2B”设置搜星模式,就是全系统了。并且这个指令会保存到Flash里,只要设置一次断电也没关系。
    一般的定位模块都使用NMEA0183协议,Air551G也同样支持。将串口连接好后,接收到的所有数据按照NMEA0183来解析即可。常用的数据为:
    1.GPGGA:GPS定位信息;
    2.GPGSA:当前卫星信息;
    3.xxGSV:可见卫星信息;
    4.GPRMC:推荐最小定位信息;
只解析这四种数据就能完成基本功能,其他的可以忽略掉,看具体情况来使用。


NMEA0183.png
    自己写的NMEA0183的C语言文件,第一个结构体是卫星的基本信息,多个卫星就创建多个实例。第二个结构体是当前定位信息,只要一个实例就够了。接口函数有几个,简单说明一下:
    1.Clear函数。在其他单片机中这个函数不是必须的,但是T5L的xdata数据只能声明不能再初始化之前赋值,所以用这个Clear当作清零和赋初始值用;
    2.Data函数。收到的所有数据都往这里扔,会自动分类并解析。
    3.GetXX:需要取得哪个系统的信息就调用哪个函数,这里只包括四种:GPS、北斗、格洛纳斯和伽利略,其他的没什么用就不要了。
    4.GetGNSS:得到当前的定位信息,经纬度和时间等。

    再来看看各个解析数据的实现方法,Clear就不说了:
    1.判断数据头是哪种数据,GNGSA、GNRMC、GAGSV、BDGSV、GLGSV、GPGSV,有用的是这些,GNGGA是定位的类型,用不到也可忽略;
    2.根据得到的数据类型再分别按照协议的格式解析出每个字段的值。由于xxGSV有可能一批数据分几包发送过来,所以最简单的方法就是以GPGSV为本批数据开始,中间收到的各种xxGSV数据根据上面提到的四种系统分别累计,最后以GNRMC为本批数据结束,此时就可以得到完整的定位信息和卫星信息了。
    3.获取定位信息或者得到指定卫星系统的信息,直接调用GetXX即可。为了防止读写同时进行的死锁,建议在解析完RMC数据后再进行,如果双缓冲区更好。


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

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

二、迪文屏T5L的单片机开发及显示控制:

T5L.png
    迪文T5L屏分为许多型号,我申请到的是DMG85480F050_01WTC,5寸的电容屏,分辨率为480x854,默认竖屏显示。迪文屏其实就是个串口屏,可以通过发送各种指令在屏幕上显示不同的东西。不过,一般的串口屏需要外接一个单片机来作为主控,所有的逻辑操作或外设的驱动都要在这个单片机中来完成,屏幕也只是个外设而已。迪文屏的屏内芯片是一个双核的51单片机,其中一核专用于接收指令显示对应内容,经过优化后显示速度很快,用户不能直接操作此核;另外一核就是用户可操作核,自己写的程序可以烧写到这个核内来执行,所以不需要再外接单片机了。虽然是C51的内核,但是频率已经提高到了206M,不管是用户的程序还是屏幕的显示,运行起来非常迅速,没有卡顿。
    迪文屏开发起来说简单也简单,说复杂也挺复杂的,规则比较多,图片文件编号、显示控件文件编号、触摸控件文件编号、字库文件编号等都有具体的规定,不能错。好在迪文提供了相关的开发工具,能够省去一些制作上的麻烦。先来看一下效果:

GNSS.jpg
    简单的模拟660RTK,所以东西不多,背景图+柱状图显示,柱状图是动态画上去的,数据来源就是定位模块提供的串口数据,解析后得到的结果。那么,迪文屏这边的开发又分为两个部分:界面的静态显示及动态数据的显示和C51程序逻辑及外设控制。

    1.界面的静态显示:
    首先要做好一张背景图片,为了简单起见,所有的网格线都做再图片中而不是用程序或控件画出来,这样可以免去反复调试的麻烦。

CNR背景.png
    如图,四个定位系统区分开了,每个部分只显示对应的系统,没有显示说明没有这个系统的卫星信息,更加直观。每种系统用不同颜色来显示,一目了然。红色北斗、蓝色GPS、黄色格洛纳斯、绿色伽利略,再图例中加以说明。图片的大小就是屏幕分辨率的大小,480x854。


DGUS.png
    迪文提供了制作显示界面的工具DWIN DGUS,首先用这个工具建立一个新工程,把刚才做好的背景图片导入进来,背景图片的文件名要以0为开头,后面任意。导入后增加显示的控件。柱状图是动态画上去的,使用“基本图形显示”这个控件来指定可画图的范围。每个控件可以显示多种图形,如点、线、面等,但一个控件同一时刻只能显示一种,比如这次画点,那么这个控件上这一次只能画点,虽然能显示许许多多的点,但是想要改成线就只能清除后再次画线,不能并存。多个同种图形的颜色可以分别指定。
    回到这个程序,想在不同的地方画图,我使用了四个控件,其实一个大的控件也可以,因为实际画图的坐标是绝对坐标而不是相对坐标,也就是坐标的原点是屏幕的0,0而不是控件的0x0。用一个大的控件反而更容易理解一些,不过已经做出来了就懒得改了,一样的。四个控件要指定四个不同的变量地址,程序中控制画图的时候要指定在哪个控件上画需要这个变量地址。
    界面设计完成后,点击“生成”按钮可以自动产生烧写用到的屏幕相关的文件,0CNR.icl背景文件、13TouchFile.bin触控文件、14ShowFile.bin显示文件、22_Config.bin界面配置文件还有T5LCFG.CFG屏幕配置文件。模拟程序还没有做完,后面再显示卫星数据的话,还需要增加字库文件。

    2.C51程序的外设控制:
    同其他的51单片机一样,迪文T5L的外设种类也很少,只有IO口、串口、定时器、看门狗等,其他的比如I2C、SPI什么的都需要软件模拟来实现,不过T5L多了个CAN口,在组区域网的时候还是很实用的,只是我这个程序用不到。为了开发方便,我同样封装了一下,在使用时就不需要再查看寄存器了。

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

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

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

    4.C51程序的逻辑控制:
    逻辑控制就更简单了,把上面那几项功能串起来而已。

逻辑代码.png
    当每一批的定位数据收全后,分别获取北斗、GPS、格洛纳斯和伽利略四种系统的卫星信息,遍历每一个信息并调用计算图形的函数,最后写入屏幕,完成。

    代码和界面都做完了,现在要编译一下C51的程序,生成hex文件。不过烧写的时候需要的是bin文件,所以要先转换一下。迪文提供的转换工具,每次都要手动点一下,次数多了感觉有点麻烦,还是自动完成的好,一个批处理解决。

批处理.png
    首先再工程文件夹下新建一个文件夹,名称随意,我这里叫Release,批处理文件中使用command命令进入这个文件夹,删除之前转换好的文件,再调用一下srec_cat.exe这个转换工具,并指定输出的文件名。保存后,再在Keil里设置为每次编译后执行,就会把hex文件自动转换后放入Release文件夹里,省去了手动的操作。

     准备烧写。烧写就更麻烦了,由于我申请的这个屏幕是所谓的“标准品”,我的理解就是样品,功能还不是很完善,烧写的时候要将所有用到的文件拷贝到TF卡上,再插入屏幕的转接板上电来烧写。同样次数多了就感觉很烦,目前还不能用串口来烧写,不过迪文的工程师已经再做了,期待ISP工具。

烧写成功.jpg
    烧写成功是这个样子滴。

    扔到窗外上电,看下效果:

[media]https://www.bilibili.com/video/BV1ZY411V7fo?share_source=copy_web[/media]

    许多功能还没有做,不过只要入门了,其他都是工作量的问题,也就不是问题了。迪文屏显示的速度很快,没有一点卡顿,合宙的Air551G定位也很快,同一位置二次上电瞬间就能定位,性能也不错。希望迪文的ISP工具赶快发布,这样调试起来就方便了。(完)



更多回帖

发帖
×
20
完善资料,
赚取积分