摘要:车载HMI是人与车辆之间的关键设备,使人能够对车辆的运行实现控制;设计了一种触摸控制与数字显示合理结合的车载HMI终端,采用ARM 作为处理器,通过移植Qt/E对系统加以实现;该终端通过在Polo车CAN总线试验台测试,实现了对基本设备的触摸控制和车辆状态信息的实时显示,表明所设计的终端能够满足车载HMI的基本要求。
0 引言
改善HMI (Human Machine Interface)终端性能可降低车辆控制系统操作的复杂性,也可提高驾驶员对自己车辆的控制力。车载HMI通过单一结构中控台,可以减少零部件数量,提高性价比。传统机械式的控制终端正在逐步向直观、便捷的HMI终端发展。2009年6月29日,美国汽车多媒体与通信研究服务公司Strategy Analytics发布最新研究报告,认为“车载人机界面市场领先者保持强势地位”。报告预测,2015年,车载语音和触摸屏市场规模将达到29 亿美元。目前,HMI设备,尤其是语音、触觉控制和触摸屏,在汽车市场上被大量应用。
本文报告了一种基于触摸控制与数字显示理念的车载HMI终端,通过在ARM 上移植Qt/E接TFT-LCD触摸面板加以实现。
1 系统结构介绍
基于ARM 和Qt/E的车载HMI终端主要由两个模块组成,分别是ARM 处理器与触摸显示屏组成的HMI触控平台和CAN/RS232协议转换器模块。该终端可接入车载CAN网络中实现车载设备的触摸控制与状态信息显示。其结构框图如图1所示。
图1 车载HMI终端结构
HMI触控平台主要是将Qt/E交叉编译后移植到ARM 平台,调用GUI在触摸面板显示。通过点击触控界面发送控制字,经CAN/RS232网关发送到CAN网络中对各设备进行控制,同时实时采集各设备运行状态参数并显示,便于驾驶员及时了解车辆运行状态。该平台还预留了UART和USB端口分别可外接GPS模块,无线上网卡或U 盘设备,实现导航、无线上网和多媒体播放功能。
CAN/RS232协议转换模块主要由MCU、CAN 接口与UART接口组成,其中CAN 接口采用CAN 控制器SJA1000和CAN收发器PCA82C250设计,RS232接口采用MAX232设计,以此实现两种不同总线协议数据帧的透明转换,是HMI终端与CAN网络中各设备交互的纽带。
车载CAN网络模块主要以Polo车CAN 试验台为平台,试验台集成了车灯、电动车窗、雨刷和后视镜CAN 节点模块。
2 Qt/E在ARM 上的移植
Qt/E是Trolltech公司专为嵌入式Linux系统开发的图像用户界面(GUI)工具包。提供了窗口操作系统、开发环境、工作辅助应用程序和个性选项等,是基于C++ 可跨平台的GUI应用程序框架;还提供给开发者建立艺术级GUI所需的功能,开发者可根据需求定制整个软件解决方案。目前,众多手机、PDA、机顶盒都采用Qt作为图形引擎。因此,选择了Qt/E作为HMI终端的开发工具。
2.1 交叉编译环境的搭建
采用宿主机Fedora9.0作为开发平台,移植ARM 版Qt/E4.7进行设计。因编译Linux内核和Qt/E都需要交叉编译工具链,交叉编译器版本过高过低都会与Qt/E4.7不兼容,最终导致安装失败,所以一定要根据Qt的版本来选择对应的编译器。本系统采用arm-linux-gcc-4.5.1.安装过程如下:
首先,解压arm-linux-gcc-4.5.1安装包,运行#tarxv*** arm-linux-gcc-4.5.1.tgz命令;然后将编译器所在路径加入系统环境变量,运行#gedit/root/.bashrc编辑该文件,修改最后一行为export PATH=PATH:/usrt/local/arm/4.5.1/binPATH,此时交叉编译器已经安装好;最后执行#arm-linux-gcc-v显示编译器版本信息,验证是否安装成功。
2.2 Qt/E4.7的编译与移植
减压ARM 版Qt/E安装包到指定目录,然后进入该目录执行编译配置源码命令#echo yes | 。/configure -opensource-embedded arm –xplatform qws/linux-arm-g++-no-webkit-qt-libtiff-qt-libmng-qt-mouse-tslib-qt-mouse-pc-no-mouse-linuxtp-no-neon.其中编译ARM 平台的embedded版本配置参数为embedded arm,使用arm-linux交叉编译器进行编译为xplatform qws/linuxarm-g++,qt-mouse-tslib是使用tslib来驱动触摸屏。然后执行make命令进行编译,当编译完成之后执行安装命令make install.最后把安装文件打包#tar cv*** qt4.7.tgz,下载到ARM 开发板,并解压到指定目录。至此Qt/E在ARM 开发板上移植完成。
安装Linux环境下X86版Qt SDK软件-Qt Creator2.0进行Qt程序开发,设置为支持Qt4.7ARM 的交叉编译。最后将设计好的程序通过编译,生产二进制文件下载到ARM 开发板运行,以此实现HMI界面显示功能。
3 车载HMI终端的硬件设计
3.1 CAN/RS232协议转换器的硬件设计
CAN/RS232协议转换器主要有主控制器、CAN接口模块与RS232接口模块组成,其中主控制器采用STC89C52单片机负责处理CAN总线与RS232总线的数据接收与发送,实现两种不同协议数据帧的透明转换与传输。
CAN接口模块采用Philips公司的CAN 控制器SJA1000和CAN收发器PCA82C250芯片组成,主要实现CAN协议的物理层和数据链路层功能。其中CAN控制器完成数据链路层功能,实现与主控制器的信息读写操作,物理层通过CAN收发器实现电平转换和传输。SJA1000的AD0~AD7与单片机P0口连接,实现地址/数据复用;片选/CS与P2.7相连,则基地址为0x7F00;/RD、/WD、ALE引脚依次与单片机各引脚相连;中断/INT接单片机/INT0,因此可通过中断方式对SJA1000进行实时访问。SJA1000的MODE 引脚用于选择CAN控制器在Intel模式还是在Motorola模式工作。由于STC89C52属于Intel系列微控制器,故MODE引脚接+5V高电平设置为Intel模式,以满足89C52的读写时序要求。为了增强节点的抗干扰能力,以及避免当CAN收发器失效时出现过流导致CAN控制器击穿,SJA1000的TX0和RX0引脚通过光耦N6137后与PCA82C250的TXD和RXD连接,以此实现总线上节点间电器隔离;收发器CAN_H 和CAN_L引脚通过5Ω电阻与CAN总线端口连接起到限流作用;同时两端接120Ω终端匹配电阻。
RS232接口电路采用MAX232芯片,实现单片机串口TTL电平与RS232电平相互转换,完成HMI终端UART口的信息传输。STC89C52串口端(P3.0和P3.1)与MAX232的T1IN和R1OUT连接,T1OUT与R1IN接九针串口,然后通过交叉线与HMI终端连接实现数据通信。
3.2 车载HMI触控平台的设计
HMI触控平台以ARM 为处理器,接7.0寸LCD触摸屏来实现,可取代传统的(如图2A)机械按键与表盘显示的中控平台。HMI触控平台如图2B所示,由车灯、车窗、后视镜、多媒体、空调、导航以及状态参数显示菜单组成。将该终端嵌入到方向盘,驾驶员可点击触控菜单进入车灯、车窗等控制界面(如图2C和D)实现车灯、车窗等设备的触摸控制,也可实时采集与显示设备状态参数如:车速、故障码等。其中,触控与显示数据需调用ARM 底层串口驱动来实现读写操作,触控界面通过Button控件的信号与槽机制来实现数据的发送,状态参数的采集与显示通过事件驱动方式实现。终端可外接GPS模块实现导航功能,设计了Qt媒体媒体播放器实现娱乐功能,也可接入无线网卡来实现无线上网功能。
图2 车载HMI终端
4 车载HMI终端的软件设计
4.1 CAN/RS232网关软件设计
主程序中首先要完成初始化操作, 包括单片机、SJA1000、RS232通信以及中断源的初始化。其中SJA1000的初始化是整个设计最重要的部分,也是保证CAN 通信的前提。考虑车辆内部网络的兼容性,SJA1000配置为Peli模式,支持CAN2.0A和B规范,实现标准帧和扩展帧两种报文传输。SJA1000初始化寄存器配置流程如图3所示。
图3 SJA1000初始化寄存器配置流程
为保证数据实时传输,采用中断方式进行数据收发。
当CAN总线有数据接收时SJA1000会跳入接收中断函数将数据接收并存储到接收缓存,根据数据帧头来判别数据类型和所带数据长度,最后提取CAN 数据拆分为单字节通过串口发送,并在HMI终端显示;当HMI终端有控制字发送,串口接收中断函数将所发送的控制字依次接收存入接收缓存,并根据首字节来判别所发数据类型和长度,组装成CAN数据帧格式发送到网络中去,以此实现各节点的控制。具体流程如图4所示。
图4 数据接收与发送流程图
4.2 车载HMI界面的设计
HMI界面采用Qt Creator2.0来设计,因为HMI终端是通过UART接口接入CAN网络中,所以通信时需接上面所介绍的CAN/RS232协议转换器来实现。同时,还需在Linux下编写Qt串口通信程序。
首先,在Linux下利用open函数打开串口设备,用tcsetattr函数来设置串口属性。打开驱动设备UART0进行读写操作:const char*devName= “ /dev/ttySAC0”;fd = ::
open (devName,O_RDWR|O_NONBLOCK);设置波特率等参数:serialAttr.c_cflag= B115200| HUPCL| CS8|CREAD|CLOCAL;serialAttr.c_cc[VMIN]=1;其中串口设备可使用Linux下I/O函数进行Read和Write操作。但是,在数据接收时当数据量过大会导致界面被阻塞(造成界面假死),于是创建了一个线程通过事件驱动实现数据接收。
Qt中可采用QSocketNotifier类来实现设备事件驱动的设计要求。QSocketNotifier类关联Signal/Slot机制,当有数据可读时会触发Ativated信号,LCD Number控件Slot会被调用来连接到该信号并显示,从而实现数据采集与显示功能。在数据发送时,可通过Button控件Signal/Slot调用QObject对象的connect()函数来实现[3]。当按键被按下时触发Signal信号,Slot会调用pressed ()函数将定义好的数据通过串口Write函数发送到总线上。函数实现如下:
void Glass::on_lu_pressed(){char msg[]= {160,34,16,0};//定义所发送数据myserial-》myCom-》write(msg,4);//写发送数据}
通过QPainter类进行对窗体界面和按键图像界面进行设计,达到美观的人机界面。最后将设计好的程序通过交叉编译,生产二进制文件移植到ARM 中,然后在文件系统中调用执行,最终在LCD触摸屏上显示,如图2所示。
5 系统集成与测试
首先将设计好的HMI终端通过交叉串口线与PC机连接,进行相互通信,测试是否能够进行数据收发,测试成功后通过CAN/RS232网关接入Polo车CAN试验台进行综合测试。试验台设备节点可通过触摸方式控制,同时可实时采集与显示运行状态信息,经过多次实验测试,运行稳定可靠,达到了设计要求。
6 结束语
本文所设计的车载HMI终端集车身控制、仪表显示、导航、多媒体和无线上网为一体,简化了车载中控平台,降低了车辆控制系统操作的复杂性。经实验测试实现了车身设备的触摸控制,能够对各设备运行状态信息进行采集与显示。为车载HMI开发提供了一种可行的设计思路与性价比更合理的解决方案。
评论
查看更多