文献标识码:A
文章编号: 0258-7998(2015)06-0020-04
0 引言
汽车仪表是汽车与驾驶员进行信息交流的窗口,也是汽车电子技术的重要内容。随着现代汽车所使用车载电器不断增多,如车载多媒体、行车记录仪、空调和导航等,汽车驾驶环境在日益改善的同时,显示的信息量也急剧增加。目前,多数汽车厂商采用在中控台安置两个显示屏的方案解决信息显示问题,即“仪表盘+中控彩色大屏”。行车时,该方案容易导致驾驶员频繁转移视线,造成注意力不集中,留下安全隐患。此外,传统的机械式仪表盘存在部件磨损后误差等级大、仪表样式单一的缺点,而以液晶屏作为显示终端的虚拟仪表则存在液晶屏寿命较短的缺陷。
针对上述问题,本文提出了一种基于数字光处理(Digital Light Procession,DLP)[1]投影技术的车载集成前屏方案,将汽车行驶、行车记录仪视频和多媒体播放等功能集中起来,应用DLP投影技术将画面投射到方向盘前的反射屏上,并采用界面分隔的设计方法在一帧屏幕上同时显示不同信息画面,实现了系统样机的研制及模拟实验。实验结果表明,数字化仪表响应灵敏、画面美观,各功能模块之间通过按键切换,交互便利。集成的显示方法避免了驾驶员在两个显示屏中转移视线,驾驶环境更为舒适,提高了行车安全性。
1 系统整体实现方案
汽车集成显示系统整体结构如图1所示。为满足系统快速处理数据和实时性的要求,选用Samsung公司的32位RISC微处理器S5PV210作为系统控制核心,内置高清晰多媒体接口线(High-Definition Multimedia Interface,HDMI)模块,可通过HDMI接口连接DLP投影仪进行投影显示。外围电路包括:存储单元256 MB DDR RAM和1 GB NAND Flash、RS-232口、CAN总线口等扩展通信接口。投影仪选用COOLUX X3S型DLP投影仪。
系统功能为:采集模块采集各类车载信号,两个摄像头分别采集前、后两个行车视频图像信号,处理器根据获得的信号调整信息显示画面,通过HDMI接口将画面输送到DLP投影仪并投射在反射屏上,驾驶员通过观察反射屏的图像即可获取所需信息,并通过人机交互按键实现菜单操作,可方便地调整和切换显示画面。集成显示画面包括汽车行驶信息、行车记录仪、电子地图和多媒体播放4个子功能模块。
2 基于DLP技术的投影显示方案
DLP技术是指通过数字微镜器件(Digital Micromirror Device,DMD)芯片将光强数字化以完成信息显示的技术。DLP投影系统由光源、色轮、数字信号处理器、光学器件和DMD芯片组成。其投影原理为:当光源的光线经过聚透镜和色轮后,被分解为R、G、B三原色投射到DMD芯片上,光线再经过DMD镜片的反射后由投影镜头投影成像。
本文通过HDMI接口将车载集成系统与DLP投影仪连接,HDMI协议数据传输如图2所示,HDMI接口包含:3个用于传输数据的最小化传输差分信号(Transition Minimized Differential Signaling,TMDS)通道;1个独立的同步时序TMDS通道,以保证数据传输时所需的统一时序;显示数据通道(Display Data Channel,DDC),用于HDMI输出端向接收端发送配置信息或读取接收端的显示属性信息。
车载终端与投影仪的连接结构如图3所示。处理器S5PV210内部的视频编码器产生非标准流速视频流,经过双时钟FIFO缓冲器将其调整为标准流速视频流,下一级的像素点转换器将视频流转换为DLP投影仪可处理的24 bit RGB彩色图像,最后经视频信号同步发生器处理,把标准视频流发送给HDMI发送器,由HDMI接收器接收后输入给DLPC300 DMD控制器,DMD镜片将图像反射后由投影镜头投影成像。
为了使终端能够满足不同显示分辨率系统,本文设计配置文件hdmi.conf并加入到根文件系统/etc目录下。系统启动后,后台服务进程hdmi-service首先读取投影仪接口分辨率参数并写入到配置文件hdmi.conf中,随后hdmi-service进程将hdmi.conf中的分辨率配置数据通过DDC通道发送到HDMI接收器的EDID ROM中,投影仪系统根据该数据变更显示分辨率。用户如要更改显示分辨率,只需修改配置文件hdmi.conf即可完成。
本设计将DLP微型投影仪安装在汽车方向盘转向轴上,将图像投影到方向盘前的反射屏上,如图4所示。图4中,标号1表示DLP微型投影仪,标号2表示反射屏。
3 系统软件设计
3.1 开发环境构建与系统软件移植
系统软件设计包括开发环境构建[2]、系统软件移植和应用程序开发三部分。本文采用的开发环境为VMware Workstation虚拟机和Red Hat Linux5操作系统,在虚拟机中安装交叉编译工具链ARM-Linux-gcc4.4.3,用于完成嵌入式操作系统内核、busybox、QT/E4.6.3和车载终端应用程序的编译;安装QT/E4.6.3[3]库以支持应用程序的开发;设计AD驱动jd_adc.c、人机交互按键驱动jd_buttons.c和HDMI驱动等驱动并加入到Linux2.6.38内核源码树中,配置编译内核;设计根文件系统并在其中加入inittab、rcS和hdmi.conf等配置文件以及glibc库、QT库等动态链接库构建车载终端应用程序的运行环境。
3.2 应用程序设计
车载终端应用程序设计主要解决信号采集、图形用户界面(Graphical User Interface,GUI)实时显示和信号与GUI实时通信3个关键问题。其中信号采集包括车载传感器信号采集与摄像头图像信号采集。
3.2.1 车载信号的采集
车载传感器信号主要采集车速、发动机转速、燃油量、冷却液温度、车灯信号和车身报警信号等,一般为数字脉冲信号、模拟电压信号和开关量信号,分别引入S5PV210的tclk0(输入频率在0~720 Hz)和tclk1(输入频率在0~8 kHz)两个引脚;模拟电压信号引入S5PV210的AD输入引脚adcAIN[0]和adcAIN[1],两个AD输入引脚电压范围在0~3.3 V;车灯信号接S5PV210的外部I/O引脚GPH1[4:7],车身报警信号接中断引脚EINT[0:3]。由于采集的信号多且实时性强,为提高程序运行效率,采集模块设计采用多线程方法,分别设计车速speedThread、发动机转速rotateThread、燃油量oilThread、冷却液温度watertempThread等信号采集子线程。系统工作时,各个子线程循环采集传感器传来的信号。
在信号采集线程中,为了保证实时性,设计while(1)循环持续读取信号值。由usleep函数控制采集频率,其功能是将线程挂起一段时间。经过反复试验,usleep函数频率设为10 Hz为佳,即把挂起时间设定为0.1 s。
以车速信号的采集为例,部分代码如下:
void Thread::readSpeed()
{int fd;
char buffer[BUF_SIZE];
fd = open(“/dev/ashspeed”,0);//打开车速设备文件
while(1){
…
value = atoi(buffer);//获取当前速度值
emit speedChanged(value);
//将当前速度值传递给时速表刷新函数
usleep(100000);//线程挂起0.1 s
}
3.2.2 视频信号的采集
本系统在车头和车尾各安装一个摄像头,能同时记录汽车前后的行车视频图像。本文设计行车记录仪模块为双摄像头图像采集方案,通过界面分隔的方法使双摄像头采集的视频能够同时在一屏显示图像画面。
系统的视频采集设备选用中星微ZC301摄像头和泰科姆2C8型CMOS摄像头,分别对应/dev目录下的video0和video1设备文件。设计视频采集程序时,基于LinuxV4l2驱动程序框架[4],视频图像采集通过调用v4l2_read、v4l2_ioctl和v4l2_mmap等函数实现。在进行界面分隔显示时,通过向屏幕缓冲区中写入前后摄像头所采集的图像信息以进行屏幕绘图,实现在同一屏中同时显示不同画面的效果。视频信号的采集流程如图5所示。
3.2.3 多道程序并发控制
多道程序并行性提高了系统资源的利用率和实时性能,但也相应产生了一些问题。在行车记录仪模块中,事件轮询代码块在执行时需要一次性完成,不允许被其它线程打断,因此必须加入并发控制机制。
本系统在并发控制处理中采用了互斥锁机制,在需要保护的代码块执行前进行上锁操作,代码块执行后进行解锁操作,保证代码块执行时不被打断。部分代码如下:
LockMutex(affmutex);//上锁
while (PollEvent(event))
{switch(event->type)
{ ……
}
}//被保护的代码块
UnlockMutex(affmutex);//解锁
3.2.4 信号与GUI界面通信
程序运行时,GUI界面模块需要对各采集信号作出实时响应。本系统各子线程的采集信号与界面模块的通信使用信号(signal)-槽(slot)机制[5]实现,采集线程与界面刷新函数连接方法是:各子线程采集传感器信号作为signal信号源,界面刷新函数作为slot槽函数。各采集子线程每隔一段时间将当前采集的信号值发送到主线程的界面刷新函数,完成界面的更新。以时速表为例,信号-槽的连接代码如下:
connect(&speedThread,SIGNAL(speedChanged(int)),this,SLOT(updateSpeed(int)));
3.2.5 GUI界面的设计
数字仪表盘模块显示汽车行驶中的各类关键信息,可实现时速表、发动机转速表、燃油表、水温表和车灯、报警信号的实时显示。程序设计时需解决静态仪表绘图和界面实时刷新两个关键问题。
考虑到驾驶员的审美习惯,设计的仪表盘沿用了传统的指针式仪表盘[6]。使用drawRect()、drawEllipse()、drawText()等函数完成静态仪表绘图。为了使绘图更加美观、更具立体感,在渲染时加入了渐变效果,时速表渲染前后对比如图6所示。
界面的实时刷新主要体现在仪表指针的转动,首先根据传感器采集的速度信号确定指针转动角度,利用信号-槽机制将角度信息传递到刷新函数update()中。在update()函数中,应用rotate()函数旋转逻辑坐标系,用drawConvexPolygon()函数完成指针的绘制[7]。
数字仪表盘模块的启动流程如图7所示。
系统采用EEPROM芯片AT24C08完成行驶里程等数据的存储,通过I2C总线完成对芯片存储数据的修改。汽车行驶时,里程数据需要不断更新,增加的里程数据ΔS(单位:km)与车速(单位:km/h)的关系为:
其中,v(i)为某次采集的速度值,采集间隔为10 ms。
4 系统测试与结论
本文设计的车载集成显示终端将汽车仪表、电子地图、多媒体播放和行车记录等功能集成在一起,通过DLP投影技术将信息集中显示在反射屏上,极大地节省了车内空间,方便驾驶员获取信息,提高了行车安全性。测试结果如图8所示。
测试结果表明,系统画面显示稳定,实时数据准确,动画效果较好,界面切换迅速。此外,本系统提供多种通信接口,可扩展性强,具有较高的实用价值和广阔的应用前景。
参考文献
[1] 胡坚.DLP和LCD投影机对比分析[J].微计算机信息,2005,21(2):140-142.
[2] 韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2011:240-360.
[3] 闫锋欣,曾泉人.C++ GUI Qt4编程(第二版)[M].北京:电子工业出版社,2010:138-268.
[4] 奚海蛟,吕铁军.嵌入式Linux驱动程序实战开发[M].北京:北京航空航天大学出版社,2012:1-91.
[5] 王润民.基于嵌入式Linux的车载终端系统研究与实现[D].西安:长安大学,2013.
[6] 曹成昆,何彬.混合动力汽车真彩液晶数字仪表软件设计[J].上海交通大学学报,2008,42(7):1081-1084.
[7] 陈新.电动汽车液晶数字仪表的设计[J].汽车工程,2013,35(3):272-276.