文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2011)12-0083-04
OBD(On Board Diagnostics)即“車載診斷系統(tǒng)”[1],裝載OBD協(xié)議的汽車能夠自動監(jiān)測汽車各項運(yùn)行參數(shù),具有很高的安全性。但是受到OBD儀表高額制造成本的制約,絕大部分汽車只支持OBD協(xié)議并提供OBD接口,但是未設(shè)置OBD車載檢測儀表,因此OBD的各項功能未得到有效發(fā)揮。
Android是一款基于Linux平臺的開源移動通信終端操作系統(tǒng),由Google公司研發(fā),目前全球長期使用的Android平臺設(shè)備約有1 300萬臺。
本文介紹一種能夠應(yīng)用在Android設(shè)備平臺的OBD汽車虛擬儀表設(shè)計方案。
1 系統(tǒng)整體設(shè)計
1.1 需求分析
OBD系統(tǒng)能夠輸出汽車電子控制單元ECU(Electronic Control Unit)通過車載傳感器獲得的燃油系統(tǒng)、溫度系統(tǒng)、點火系統(tǒng)、動力系統(tǒng)以及廢氣控制輔助裝置系統(tǒng)運(yùn)行狀態(tài)數(shù)據(jù),在發(fā)生故障的情況下則輸出故障碼。
基于OBD協(xié)議的Android平臺汽車虛擬儀表需要實現(xiàn)的功能是擴(kuò)展OBD接口功能,與OBD接口通信,解析相關(guān)報文數(shù)據(jù)流,將解析結(jié)果以圖形化的方式顯示,如動力監(jiān)控界面能夠顯示發(fā)動機(jī)狀態(tài)、發(fā)動機(jī)轉(zhuǎn)速、當(dāng)前時速、剩余油量、發(fā)動機(jī)溫度等。
1.2 整體設(shè)計
用系統(tǒng)工程的方法劃分虛擬儀表設(shè)計工作,參照模塊化軟件開發(fā)規(guī)范,按照以下步驟實現(xiàn)汽車虛擬儀表:
(1)分析OBD接口,設(shè)計硬件連接器,將電平轉(zhuǎn)換到Android平臺設(shè)備可接受的范圍;
(2)虛擬儀表軟件初始化連接器,讀取輸入信號,解析OBO信號報文并以圖形化的方式顯示。系統(tǒng)子模塊圖如圖1所示。
2 OBD接口
根據(jù)ISO DIS 15031-3規(guī)范,OBD接口被定義為雙排16針插座,有A、B兩種外形規(guī)范,A用于小型乘用車,B用于載重汽車[2]。A型接口一般位于轉(zhuǎn)向柱和汽車中線之間。16個引腳信號定義如下。
如圖2,插座的02、06、07、10、14 和15號引腳用于傳輸不同的汽車通信協(xié)議,通常用其作為診斷通信接口。因為一個型號的汽車只使用一種協(xié)議,所以同一型號的汽車,只需要使用其中的一個接線柱。插座01、03、08、09、11、12 和13 未做分配,由車輛制造廠商自行定義。如第4節(jié)工程實測中使用的長城CC7130SM00 汽車,將11 腳定義為發(fā)動機(jī)防盜信號、12定義為ABS(Anti-locked Braking System)車輪防抱死信號、13腳定義為安全氣囊信號。
3 硬件連接器設(shè)計
3.1 連接器設(shè)計
連接器的作用是將OBD接口輸出信號轉(zhuǎn)換為Android平臺設(shè)備能夠識別的信號并輸入。此處選用ELM電子生產(chǎn)的OBD轉(zhuǎn)RS232專用芯片ELM327作為連接器主控芯片,連接器一端連接OBD插座,OBD接口16號引腳為芯片供電,OBD信號通過芯片轉(zhuǎn)換后從數(shù)據(jù)收發(fā)口RXD、TXD輸出?;贓LM327的連接器組成框圖如圖3所示。
3.2 電平轉(zhuǎn)換
Android平臺設(shè)備一般采用無線藍(lán)牙、WLAN或有線USB端口進(jìn)行數(shù)據(jù)通信,這里選擇USB端口作為信號輸入端口。ELM327輸出的信號范圍是0 V~12 V,Android平臺設(shè)備USB端口接收的信號范圍為0 V~5 V,兩者不匹配[3],設(shè)計以PL2303芯片為核心的轉(zhuǎn)換電路完成轉(zhuǎn)換,電路圖如圖4所示。
4 虛擬儀表軟件設(shè)計
軟件設(shè)計平臺選用Java JDK、Eclipse IDE for Java EE Developers和Android SDK共同構(gòu)建的開發(fā)平臺[4]。采用模塊化的設(shè)計方法,將虛擬儀表軟件分為通信初始化模塊、OBD數(shù)據(jù)解析模塊、計算與顯示模塊。
4.1 通信初始化模塊
通信初始化模塊功能是通過連接器實現(xiàn)OBD插座與Android平臺設(shè)備的互聯(lián)。
(1)打開USB通用串行端口,代碼如下:
Fd=open("/dev/ttyS0",O_RDWR);
“/dev/ttyS0”為USB端口設(shè)備文件,O_RDWR表示可以對USB串端口進(jìn)行讀寫。
(2)設(shè)定串行通信參數(shù),SAE J1979協(xié)議規(guī)定,工程實測中使用的長城CC7130SM00 汽車OBD工作波特率為9 600 Kb/s,每一幀數(shù)據(jù)由8位數(shù)據(jù)位和1位停止位組成,幀數(shù)據(jù)中無奇偶校驗位[5]。Android平臺將USB端口當(dāng)做終端I/O文件管理,其參數(shù)設(shè)置使用Struct Termios結(jié)構(gòu)體實現(xiàn):
Etispeed( ttys0_opt, B9600); //設(shè)置波特率9 600
Ttys0_opt.c_cflag|=CS8; //設(shè)置8位數(shù)據(jù)位
Ttys0_opt.c_cflag &= ~(PARENB|CSTOPB;
//設(shè)置1位停止位,無奇偶校驗位
4.2 OBD報文解析
報文解析模塊是虛擬儀表的核心,以O(shè)BD報文組成為基礎(chǔ)定義其主要工作流程圖如圖5所示。
(1)模式選擇: SAE J1979 定義了9診斷模式用以獲得不同類型的診斷報文數(shù)據(jù),本設(shè)計只選用選擇模式2,即獲取動力系統(tǒng)監(jiān)控數(shù)據(jù)模式。發(fā)送指令“PID$02”到OBD接口,可指定OBD工作在診斷模式2,將當(dāng)前動力系統(tǒng)監(jiān)控數(shù)據(jù)送出。
(2) 發(fā)送詢問碼:虛擬儀表軟件通過USB端口發(fā)送命令到OBD接口用函數(shù)Write ( )實現(xiàn),關(guān)鍵代碼如下:
CMDbuf=PID$02;
N= Write ( fd, CMDbuf,);
以上代碼將命令變量CMDbuf中的數(shù)據(jù)從Android平臺設(shè)備輸出到汽車的OBD端口,返回讀取的字節(jié)數(shù)。運(yùn)行后,汽車ECU接收數(shù)據(jù),OBD接口工作在診斷模式2。
?。?)讀取信號數(shù)據(jù):虛擬儀表軟件通過USB端口讀取OBD接口的數(shù)據(jù)用函數(shù)Read( )實現(xiàn),關(guān)鍵代碼如下:
N=Read(fd, Rsbuf, 8);
以上代碼將汽車OBD端口Android平臺設(shè)備USB端口的數(shù)據(jù)讀入結(jié)果變量Rsbuf中待解析,返回讀取的字節(jié)數(shù)。
(4)從虛擬儀表軟件的健康度考慮,將報文信號分為開關(guān)信號和流信號分別進(jìn)行解析。
開關(guān)信號報文內(nèi)容為故障碼,對應(yīng)的程序變量為Logic布爾型,首先建立動力系統(tǒng)的故障碼與主要故障碼映射簡表如表1所示。
通過查表1實現(xiàn)報文的解析,如待解析的OBD報文中含有“P0196”故障碼,則通過查表可判定故障為發(fā)動機(jī)機(jī)油溫度傳感器線路電壓不正確[6],此時軟件將發(fā)動機(jī)故障狀態(tài)邏輯變量置1,即用紅色顯示發(fā)動機(jī)故障。關(guān)鍵代碼如下:
if((EngStas=1)){
MainFm.EngPIC.Color=#33FF00;}
else{
MainFm.EngPIC.Color=#FF0000;}
流信號為數(shù)值數(shù)據(jù),如發(fā)動機(jī)轉(zhuǎn)速。解析的主要工作是進(jìn)行變量類型轉(zhuǎn)換:報文中的數(shù)值數(shù)據(jù)為String字符型,應(yīng)先使用如下代碼轉(zhuǎn)換為INT整型變量后提交圖形顯示。
Int i = Integer.parseInt([String]);
4.3 圖形顯示
圖形顯示模塊的設(shè)計關(guān)鍵在于虛擬儀表指針動態(tài)顯示效果實現(xiàn)。先用圖像處理軟件Photoshop繪制儀表盤并保存為JPG圖像,添加JLabel控件引用圖像:
Private URL;
IURL=getClass().getResource("Rate.jpg");
JLabel pic=new JLabel(new ImageIcon(IURL));
指針需要呈現(xiàn)的隨相關(guān)變量的改變而改變的動態(tài)效果,調(diào)用AWT (Abstract Window Toolkit) 抽象窗口工具集實現(xiàn)[7]。用DrawLine指令繪制儀表指針,并預(yù)先將數(shù)值轉(zhuǎn)化為指針起點終點位置坐標(biāo)數(shù)據(jù)。如繪制從起點(X1,Y1)到終點(X2,Y2)直線段的關(guān)鍵代碼如下:
DrawLine(int X1,int Y1,int X2,int Y2);
5 工程實測
選用Android平臺設(shè)備摩托羅拉ME722,軟件版本Android2.2.2,設(shè)置設(shè)備為UBS開發(fā)模式并預(yù)先用三方軟件取得系統(tǒng)Root權(quán)限,選用長城CC7130SM00轎車作為實測車輛。使用第3節(jié)中設(shè)計的連接器連接設(shè)備和OBD接口后,運(yùn)行第4節(jié)設(shè)計的虛擬儀表軟件。
虛擬儀表成功讀取汽車動力系統(tǒng)的發(fā)動機(jī)狀態(tài)、轉(zhuǎn)速、溫度、行駛速度、存油量等參數(shù)信息并顯示,顯示結(jié)果和汽車儀表盤完全一致,達(dá)到設(shè)計的預(yù)期目的。如圖6、圖7所示。
基于OBD協(xié)議的Android平臺汽車虛擬儀表設(shè)計方法真實有效,其價格低廉,通用性好,實用性強(qiáng),達(dá)到了預(yù)期的設(shè)計目標(biāo),可以直接用于小型載客汽車或在稍作改造后用于重型汽車或其他支持OBD協(xié)議的車輛。
參考文獻(xiàn)
[1] CAVALIER S. Meeting real-time constraints in CAN[C].IEEE Transactions on industrial informatics,2005,1(2):124-135.
[2] 尹玉梅. 基于CAN總線和MiniGUI的虛擬儀表設(shè)計[J].電子技術(shù)應(yīng)用,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/磁羅盤組合導(dǎo)航系統(tǒng)[J].儀器儀表學(xué)報,2010(12):32-37.