文献标识码: A
文章编号: 0258-7998(2011)12-0083-04
OBD(On Board Diagnostics)即“车载诊断系统”[1],装载OBD协议的汽车能够自动监测汽车各项运行参数,具有很高的安全性。但是受到OBD仪表高额制造成本的制约,绝大部分汽车只支持OBD协议并提供OBD接口,但是未设置OBD车载检测仪表,因此OBD的各项功能未得到有效发挥。
Android是一款基于Linux平台的开源移动通信终端操作系统,由Google公司研发,目前全球长期使用的Android平台设备约有1 300万台。
本文介绍一种能够应用在Android设备平台的OBD汽车虚拟仪表设计方案。
1 系统整体设计
1.1 需求分析
OBD系统能够输出汽车电子控制单元ECU(Electronic Control Unit)通过车载传感器获得的燃油系统、温度系统、点火系统、动力系统以及废气控制辅助装置系统运行状态数据,在发生故障的情况下则输出故障码。
基于OBD协议的Android平台汽车虚拟仪表需要实现的功能是扩展OBD接口功能,与OBD接口通信,解析相关报文数据流,将解析结果以图形化的方式显示,如动力监控界面能够显示发动机状态、发动机转速、当前时速、剩余油量、发动机温度等。
1.2 整体设计
用系统工程的方法划分虚拟仪表设计工作,参照模块化软件开发规范,按照以下步骤实现汽车虚拟仪表:
(1)分析OBD接口,设计硬件连接器,将电平转换到Android平台设备可接受的范围;
(2)虚拟仪表软件初始化连接器,读取输入信号,解析OBO信号报文并以图形化的方式显示。系统子模块图如图1所示。
2 OBD接口
根据ISO DIS 15031-3规范,OBD接口被定义为双排16针插座,有A、B两种外形规范,A用于小型乘用车,B用于载重汽车[2]。A型接口一般位于转向柱和汽车中线之间。16个引脚信号定义如下。
如图2,插座的02、06、07、10、14 和15号引脚用于传输不同的汽车通信协议,通常用其作为诊断通信接口。因为一个型号的汽车只使用一种协议,所以同一型号的汽车,只需要使用其中的一个接线柱。插座01、03、08、09、11、12 和13 未做分配,由车辆制造厂商自行定义。如第4节工程实测中使用的长城CC7130SM00 汽车,将11 脚定义为发动机防盗信号、12定义为ABS(Anti-locked Braking System)车轮防抱死信号、13脚定义为安全气囊信号。
3 硬件连接器设计
3.1 连接器设计
连接器的作用是将OBD接口输出信号转换为Android平台设备能够识别的信号并输入。此处选用ELM电子生产的OBD转RS232专用芯片ELM327作为连接器主控芯片,连接器一端连接OBD插座,OBD接口16号引脚为芯片供电,OBD信号通过芯片转换后从数据收发口RXD、TXD输出。基于ELM327的连接器组成框图如图3所示。
3.2 电平转换
Android平台设备一般采用无线蓝牙、WLAN或有线USB端口进行数据通信,这里选择USB端口作为信号输入端口。ELM327输出的信号范围是0 V~12 V,Android平台设备USB端口接收的信号范围为0 V~5 V,两者不匹配[3],设计以PL2303芯片为核心的转换电路完成转换,电路图如图4所示。
4 虚拟仪表软件设计
软件设计平台选用Java JDK、Eclipse IDE for Java EE Developers和Android SDK共同构建的开发平台[4]。采用模块化的设计方法,将虚拟仪表软件分为通信初始化模块、OBD数据解析模块、计算与显示模块。
4.1 通信初始化模块
通信初始化模块功能是通过连接器实现OBD插座与Android平台设备的互联。
(1)打开USB通用串行端口,代码如下:
Fd=open("/dev/ttyS0",O_RDWR);
“/dev/ttyS0”为USB端口设备文件,O_RDWR表示可以对USB串端口进行读写。
(2)设定串行通信参数,SAE J1979协议规定,工程实测中使用的长城CC7130SM00 汽车OBD工作波特率为9 600 Kb/s,每一帧数据由8位数据位和1位停止位组成,帧数据中无奇偶校验位[5]。Android平台将USB端口当做终端I/O文件管理,其参数设置使用Struct Termios结构体实现:
Etispeed( ttys0_opt, B9600); //设置波特率9 600
Ttys0_opt.c_cflag|=CS8; //设置8位数据位
Ttys0_opt.c_cflag &= ~(PARENB|CSTOPB;
//设置1位停止位,无奇偶校验位
4.2 OBD报文解析
报文解析模块是虚拟仪表的核心,以OBD报文组成为基础定义其主要工作流程图如图5所示。
(1)模式选择: SAE J1979 定义了9诊断模式用以获得不同类型的诊断报文数据,本设计只选用选择模式2,即获取动力系统监控数据模式。发送指令“PID$02”到OBD接口,可指定OBD工作在诊断模式2,将当前动力系统监控数据送出。
(2) 发送询问码:虚拟仪表软件通过USB端口发送命令到OBD接口用函数Write ( )实现,关键代码如下:
CMDbuf=PID$02;
N= Write ( fd, CMDbuf,);
以上代码将命令变量CMDbuf中的数据从Android平台设备输出到汽车的OBD端口,返回读取的字节数。运行后,汽车ECU接收数据,OBD接口工作在诊断模式2。
(3)读取信号数据:虚拟仪表软件通过USB端口读取OBD接口的数据用函数Read( )实现,关键代码如下:
N=Read(fd, Rsbuf, 8);
以上代码将汽车OBD端口Android平台设备USB端口的数据读入结果变量Rsbuf中待解析,返回读取的字节数。
(4)从虚拟仪表软件的健康度考虑,将报文信号分为开关信号和流信号分别进行解析。
开关信号报文内容为故障码,对应的程序变量为Logic布尔型,首先建立动力系统的故障码与主要故障码映射简表如表1所示。
通过查表1实现报文的解析,如待解析的OBD报文中含有“P0196”故障码,则通过查表可判定故障为发动机机油温度传感器线路电压不正确[6],此时软件将发动机故障状态逻辑变量置1,即用红色显示发动机故障。关键代码如下:
if((EngStas=1)){
MainFm.EngPIC.Color=#33FF00;}
else{
MainFm.EngPIC.Color=#FF0000;}
流信号为数值数据,如发动机转速。解析的主要工作是进行变量类型转换:报文中的数值数据为String字符型,应先使用如下代码转换为INT整型变量后提交图形显示。
Int i = Integer.parseInt([String]);
4.3 图形显示
图形显示模块的设计关键在于虚拟仪表指针动态显示效果实现。先用图像处理软件Photoshop绘制仪表盘并保存为JPG图像,添加JLabel控件引用图像:
Private URL;
IURL=getClass().getResource("Rate.jpg");
JLabel pic=new JLabel(new ImageIcon(IURL));
指针需要呈现的随相关变量的改变而改变的动态效果,调用AWT (Abstract Window Toolkit) 抽象窗口工具集实现[7]。用DrawLine指令绘制仪表指针,并预先将数值转化为指针起点终点位置坐标数据。如绘制从起点(X1,Y1)到终点(X2,Y2)直线段的关键代码如下:
DrawLine(int X1,int Y1,int X2,int Y2);
5 工程实测
选用Android平台设备摩托罗拉ME722,软件版本Android2.2.2,设置设备为UBS开发模式并预先用三方软件取得系统Root权限,选用长城CC7130SM00轿车作为实测车辆。使用第3节中设计的连接器连接设备和OBD接口后,运行第4节设计的虚拟仪表软件。
虚拟仪表成功读取汽车动力系统的发动机状态、转速、温度、行驶速度、存油量等参数信息并显示,显示结果和汽车仪表盘完全一致,达到设计的预期目的。如图6、图7所示。
基于OBD协议的Android平台汽车虚拟仪表设计方法真实有效,其价格低廉,通用性好,实用性强,达到了预期的设计目标,可以直接用于小型载客汽车或在稍作改造后用于重型汽车或其他支持OBD协议的车辆。
参考文献
[1] CAVALIER S. Meeting real-time constraints in CAN[C].IEEE Transactions on industrial informatics,2005,1(2):124-135.
[2] 尹玉梅. 基于CAN总线和MiniGUI的虚拟仪表设计[J].电子技术应用,2010,36(2):85-87.
[3] CARLOSENA A, MACUA C. Instrument for the Measurement of the instantaneous frequency[C].IEEE Transactions on Instrumentation and Measurement, 2000,1:1-4.
[4] App Inventor[EB/OL].http://appinventor.googlelabs.com,2010.
[5] 炫丽汽车使用手册[M].保定:长城汽车股份有限公司,2008.
[6] BOSCH Company. CAN Specification Version2.0[EB/DL].http://www.bosch. Com. Germany.2011.
[7] 蔡体菁.嵌入式GPS/MIMU/磁罗盘组合导航系统[J].仪器仪表学报,2010(12):32-37.