摘 要: 在CAN总线技术基础上,设计了一款CAN总线嵌入式汽车仪表。该仪表采用Samsung公司的S3C6410处理器,利用Nokia公司开发的Qt Quick及QML语言制作美观大方的人机交互界面以实时显示车辆工作情况。给出了系统软硬件结构设计方案。检测结果表明,该设计方案满足了汽车仪表指示精度与稳定性要求。
关键词: QML;CAN总线;S3C6410;GUI
中国汽车工业强劲发展,产销能力排行世界第一,但绝大部分国产汽车仍搭载步进电机式汽车仪表。随着电子技术的迅猛发展,汽车信息容量与系统复杂程度产生了很大的变化。目前,国外各大汽车公司都在研究全数字式汽车仪表,汽车仪表正加速向智能化、数字化和网络化方向发展。
本文设计了一种基于CAN(Controller Area Network)总线的汽车智能仪表系统。设计思路是将获取的行驶速度、发动机转速、油量、里程表、冷却液和警示灯等数据显示在人机交互界面上,并将巡航控制、导航、视频和音乐等功能集成到该仪表系统当中,所有信息都直观显示在大屏幕TFT-LCD上,触摸屏技术给驾驶员与乘员带来更为有趣的行驶过程。
Qt是一个跨平台的C++图形用户界面库,它基于面向对象的思想,扩展容易且可移植性好,其良好的封装机制使得Qt模块化程度很高,用户开发十分方便,并具有优良的跨平台特性。Qt包括多达250个以上的C++类,支持2D/3D图形渲染和OpenGL,集成Webkit引擎。本文采用Nokia最新开发的Qt Quick高级用户界面技术,为嵌入式设备快速轻松地创建动态触摸式界面和轻量级应用程序。在Qt Quick中,新增加了一种简便易学的语言QML,这种语言能让Qt应用程序开发变得更为方便快捷。
1 汽车仪表总体结构
汽车仪表主要由数据接收发送、数据处理与存储和触摸屏显示3个模块组成,如图1所示。
数据接收发送模块负责接收CAN总线传输的各种数据,如速度、转速和温度等,并将处理后的数据发送到微处理器;或者将微处理器发送的数据进行处理之后发送至CAN总线。微处理器接收到需要的数据后,按照预定的算法和要求对数据进行处理,并将结果输出。人机交互界面程序接收到微处理器发送的数据后进行相应的显示,并将触摸事件反馈给微处理器。
2 汽车仪表硬件设计
本仪表采用Samsung公司的S3C6410处理器,它是一款低功耗、高性价比的32 bit RSIC处理器,其处理器在视频媒体编解码、2D/3D图形加速、显示处理和缩放等方面有很大的性能优势。S3C6410有很多硬件功能外设,如TFT真彩色LCD控制器,4通道的UART,4通道定时器,通用I/O口,I2S总线,I2C总线,USB Host,高速USB OTG、SD Host、MMC卡接口以及内部的PLL时钟发生器等。该处理器具有很大的扩展空间,在后续开发中潜力巨大。Qt Quick开发出美观炫丽的用户图形界面,需要选择图形处理能力较强的处理芯片,因此选择S3C6410处理器。
S3C6410处理器没有内置CAN控制器模块,需要外接一个CAN控制器和一个CAN收发器。该仪表选用美国微芯科技有限公司生产的MCP2510作为CAN控制器。MCP2510是带有SPI接口的独立的CAN控制器,它支持CAN 2.0A/B,含有3个发送缓冲器和两个接收缓冲器,可以使MCP2510发送和接收标准帧和扩展帧。本设计采用飞利浦公司生产的TJA1050作为CAN收发器,如图2所示。将MCP2510的数据输出TXCAN和RXCAN引脚通过6N137光耦接到TJA1050的TXD和RXD引脚上,MCP2510的SPI接口的SCK、SI、SO引脚用导线引出,S3C6410通过SPI接口与MCP2510进行实时通信,MCP2510将数据转换成CAN报文发送到TJA1050,TJA1050把MCP2510传输的信号转换为差分电压信号发送到CAN总线上。
3 汽车仪表软件设计
3.1 CAN总线通信
德国Bosch公司开发的CAN总线是为解决现代汽车中大量的电控单元而开发的一种串行通信协议,在车载各电子控制单元ECU(Electronic Control Unit)之间交换信息,形成了重要的汽车电子控制网络。CAN技术规范遵从ISO/OSI标准定义的7层基准参考模型,按照这个标准模型,最早的CAN规范只定义了数据链路层和物理层,用户需要自己制定相应的应用层协议。J1939协议是美国汽车工程协会SAE(Society of Automotive Engineers)根据CAN 2.0B为核心协议制定的协议。J1939协议制定了应用层协议,明确规定了ECU地址、报文发送优先级、扩展帧格式和通信方式等。由CAN总线高速网络连接车载电子装置,实现了高速数据共享。因此本文采用SAE J1939协议。
3.1.1 SAE J1939协议数据帧格式
SAE J1939协议数据帧以协议数据单元PDU为单位,如图3所示。PDU包含优先级(P)、保留位(R)、数据页(DP)、PDU格式(PF)、PDU细节(PS)、源地址(SA)以及数据域(Data Field)。指定PDU(PS):当PF值为0~239时,PS是目标地址DA;当PF值为240~255时,PS为组扩展(GE)。CAN扩展帧中,SOF、SRR、IDE、RTR位、控制域场、CRC、ACK和EOF场没有包括在PDU内,这些场由CAN规范定义,未被SAE J1939修改。
3.1.2 CAN通信软件设计
本设计中S3C6410通过SPI总线与CAN控制器MCP2510通信,CAN通信可分为各个独立的程序模块,包括SPI初始化、MCP2510的初始化和发送接收子程序等。在CAN总线工作开始时,首先需要对S3C6410微处理器的SPI进行初始化操作,设置相应寄存器,然后对MCP2510进行初始化操作。在对MCP2510进行读写操作时,必须严格遵守SPI指令。SPI指令包括复位(11000000)、读(00000011)、写(00000010)、发送请求(10000000)、状态读(10100000)和位修改(00000101)。
MCP2510只有在配置模式下才能对器件进行正常的初始化。其中包括CAN通信的波特率、MCP2510的配置寄存器、滤波/屏蔽寄存器和中断使能寄存器等。在进行完初始化之后,必须将MCP2510置为Normal模式。CAN控制器MCP2510初始化流程如图4所示。
3.2 人机交互界面设计
Qt Quick提供了一套高动态、丰富的QML元素来制定用户图形界面的框架以及Qt Quick Designer开发工具。QML语言是一种描述性语言,用于描述用户界面的外观和行为。QML中采用JavaScript作为脚本语言,用户界面被规定为树形结构。
3.2.1 QML语言模块以及语法
QML已经定义了许多功能强大的界面元素,如Item、Rectangle、Image、Text和ListView等,其中Item是QML中可视元素的基础。import语句导入包含所有标准QML元素的Qt模块,其中一些元素可以作为其他元素(children)的容器(parent)。每个元素具有唯一的id属性,此id允许对象被其他的对象引用。属性以name:value形式指定。State、property、Animation、Transition、Timer和Connection等元素用于描述应用程序的行为。在QML中常常用到的Anchors描述的是当前元素的位置和其他元素的相对关系。一个元素通过形式为Type.property的属性附加到另一个元素当中,其中Type是附加property元素的类型。在QML中,状态(States)用于管理有id的元素,它由多个state元素构成,每个元素都可以定义自己的不同状态,当元素进入某个状态时,状态所对应的属性将被设置修改。在设计中通过判断条件来决定是否激活一个状态,使用when属性,返回值为true或者false。在QML语言描述一个按钮的单击功能时,可以使用QML事件处理功能,这个功能是非常类似于Qt的Signal/Slot机制。
QML中用户界面创建数据模型非常重要,具有资源利用率高、数据传输快、数据存储空间合理和用户界面流畅等优点。模型为其他部件提供数据接口,在设计中使用ListView能快速建立菜单栏列表类型的界面。
QML元素ListModel可以从内部创建这些Model,或使用QAbstractListModel继承的C++ Model类,ListElement在ListModel中定义数据项,列表ListView显示Model的数据,Delegate定义如何显示数据。通过ListView定义Items的布局为水平布局和垂直布局来显示Items的布局方式。ListModel、Delegate和ListView之间的关系如图5所示。
3.2.2 QML与C++交互
Qt Quick包含QtDeclarative C++模块,并且被整合进Qt creator IDE当中。QML API有QDeclarativeEngine、QDeclarativeComponent和QDeclarativeContext 3个主要成员: QDeclarativeEngine提供在C++中QML应用的运行库以及QML内容与Qt/C++程序中的接口; QDeclarative
Component加载QML文档,每个QDeclarativeComponent实例对应一个QML文档,文档URL可以是本地文件系统URL或任何QNetworkAccessManager支持的网络URL;QDeclarativeContext暴露数据给QML实例。
在Qt/C++中使用QML开发的组件,必须先让QML运行的环境被应用程序加载调用,创建一个QDeclarativeEngine实例,使用QDeclarativeEngine加载QML组件并对所有的QML组件进行全局配置。通过QDeclarativeComponent::create()方法创建QML组件实例。下面的代码演示了如何加载一个QML Document并创建一个实例。
QDeclarativeEngine*engine=new QDeclarativeEngine(parent);
QDeclarativeComponent component(engine,QUrl::fromLocalFile("main.qml"));
QObject*Object=component.create();
为了把QML组件嵌入到Qt/C++应用程序中,需要使用Qt 4.7以上的SDK。
3.2.3 人机交互界面开发
在本设计中设计人机交互界面主要涉及布局、Signal/Slot通信机制的运用、状态转换、Transition过渡效果、ListModel与ListView元素等内容。通信方式使用QML发送Signal,Qt/C++中定义用Slot接收。
在人机交互主界面中,使用Scale缩放仪表盘图片,使其适合屏幕,设置Rotate来旋转仪表盘指针,旋转默认是以图片中心为转轴,但是可以通过transformOrigin属性来设置转轴。转向灯使用State元素,State通过PropertyChanges修改属性,当总线传来开启转向灯信号时,图片透明度从较低值变换到较高值,当接收到总线传来的关闭转向灯信号时,图片透明度从较高值变换到较低值,从而实现了警示灯的亮与灭。警示灯状态变化要迅速直观,减少驾驶员对警示灯误判,因此并没有采用Transition元素为状态转换间提供动画动态过渡,同理,其他警示灯也采用这种方法实现。状态转换同样用于仪表中菜单栏图标的显示中,例如浏览器网 页缩略图模式与浏览模式切换,代码如下:
State{
name:“Internet”
PropertyChanges{
target:bookmark
y:parent.height
opacity:0
}
PropertyChanges{
target:browser
opacity:1
height:mainView.height}
}
仪表各分界面菜单使用ListView显示,例如定义一个菜单栏,代码为:
ListView{id:buttons;x:10;model:{};delegate:ItemDrawer;
orientation:“Horizontal”;
width:container.width;
height:container.height;
spacing:15;interactive:false}
基本的菜单栏都类似于上面的代码。在仪表系统中,实现数字、英文字母与符号输入使用Grid元素来布局,spacing属性控制网格单元之间的距离。代码例子如下:
Grid{
id:keyboard
spacing:2
columns:12
KeyButton{operation:“Q”}
……
KeyButton{operation:“Enter”;width:50}
……
KeyButton{operation:“1”}
……
}
4 开发环境编译与移植
Qt Creator是跨平台的Qt IDE,提供了图形化的调试窗口和qmake工具,Qt Creator代码编辑窗口具有非常人性化的设计,具有对C++及QML语言表达式检查,代码语句整齐排列,代码自动补全,对类与函数及变量作上下文关联分析,告知函数声明和调用的位置。Qt Demo提供大量的Qt实例并提供在Qt Linguist下的源代码链接,通过Qt Demo可以快速学习Qt和QML编程。
要在ARM上运行Qt程序,需要移植ARM版本的Qt/E。进入到ARM版Qt/E目录当中,执行配置源码命令echo yes|./configure-opensource-embedded arm-xplatform qws/linux-arm-g++-webkit-qt-libtiff-qt-libmng-qt-mouse-tslib-no-mouse-linuxtp-declarative-no-qt3support-nomake examples-nomake demos-nomake docs-importdir/usr/local/Trolltech/QtEmbedded-4.8.0-arm/qml–fast。
在上面的语句当中,最后的语句-importdir/usr/local/Trolltech/QtEmbedded-4.8.0-arm/qml是将qml相关库添加到Qt/E库当中,使用arm-linux交叉编译器进行编译,-xplatform qws/linux-arm-g++,-qt-mouse-tslib命令为使用tslib来驱动触摸屏。编写好配置命令后,使用make与make install命令进行编译安装,然后将文件打包下载到ARM板并解压缩,这样Qt/E的ARM环境就移植完毕。
5 汽车仪表测试
仪表系统是驾驶过程中非常重要的系统之一,在此选用较深色背景作为LCD终端显示背景,避免驾驶员出现视觉疲劳现象,背景也可以根据用户喜好而改变。汽车车速表、转速表、燃油表与温度表都以圆盘式指针表显示,这样的设计比较符合驾驶员对传统汽车仪表的使用习惯。菜单栏位于屏幕上部,便于乘员对仪表盘进行操作。
使用嵌入式Linux作为车载仪表系统是比较流行的解决方案之一,其中嵌入式GUI能给用户提供良好的操作界面,而Qt Quick能迅速开发美观易用的嵌入式GUI,在今后的实际应用中有着巨大的潜力,有比较大的参考价值。
参考文献
[1] 饶运涛,邹继军,郑勇芸.现场总线CAN原理与应用技术(第2版)[M].北京:北京航空航天大学出版社,2007.
[2] 廖乐平,杨松,高琛,等.基于SAE J1939的车身控制系统设计[J].汽车实用技术,2011(5):31-33.
[3] 宋晓东,王建.CAN总线汽车仪表研究[J].电子设计工程,2010(4):35-37.
[4] 李宏梅,佟为明,程树康.CAN总线全数字式汽车仪表[J].电子器件,2010(5):646-650.
[5] 肖楚海,梁杰申,黄炜中.基于CAN总线的汽车仪表的设计[J].信息技术,2010(2):80-82.