摘 要: 在CAN總線技術(shù)基礎(chǔ)上,設(shè)計了一款CAN總線嵌入式汽車儀表。該儀表采用Samsung公司的S3C6410處理器,利用Nokia公司開發(fā)的Qt Quick及QML語言制作美觀大方的人機交互界面以實時顯示車輛工作情況。給出了系統(tǒng)軟硬件結(jié)構(gòu)設(shè)計方案。檢測結(jié)果表明,該設(shè)計方案滿足了汽車儀表指示精度與穩(wěn)定性要求。
關(guān)鍵詞: QML;CAN總線;S3C6410;GUI
中國汽車工業(yè)強勁發(fā)展,產(chǎn)銷能力排行世界第一,但絕大部分國產(chǎn)汽車仍搭載步進(jìn)電機式汽車儀表。隨著電子技術(shù)的迅猛發(fā)展,汽車信息容量與系統(tǒng)復(fù)雜程度產(chǎn)生了很大的變化。目前,國外各大汽車公司都在研究全數(shù)字式汽車儀表,汽車儀表正加速向智能化、數(shù)字化和網(wǎng)絡(luò)化方向發(fā)展。
本文設(shè)計了一種基于CAN(Controller Area Network)總線的汽車智能儀表系統(tǒng)。設(shè)計思路是將獲取的行駛速度、發(fā)動機轉(zhuǎn)速、油量、里程表、冷卻液和警示燈等數(shù)據(jù)顯示在人機交互界面上,并將巡航控制、導(dǎo)航、視頻和音樂等功能集成到該儀表系統(tǒng)當(dāng)中,所有信息都直觀顯示在大屏幕TFT-LCD上,觸摸屏技術(shù)給駕駛員與乘員帶來更為有趣的行駛過程。
Qt是一個跨平臺的C++圖形用戶界面庫,它基于面向?qū)ο蟮乃枷?,擴展容易且可移植性好,其良好的封裝機制使得Qt模塊化程度很高,用戶開發(fā)十分方便,并具有優(yōu)良的跨平臺特性。Qt包括多達(dá)250個以上的C++類,支持2D/3D圖形渲染和OpenGL,集成Webkit引擎。本文采用Nokia最新開發(fā)的Qt Quick高級用戶界面技術(shù),為嵌入式設(shè)備快速輕松地創(chuàng)建動態(tài)觸摸式界面和輕量級應(yīng)用程序。在Qt Quick中,新增加了一種簡便易學(xué)的語言QML,這種語言能讓Qt應(yīng)用程序開發(fā)變得更為方便快捷。
1 汽車儀表總體結(jié)構(gòu)
汽車儀表主要由數(shù)據(jù)接收發(fā)送、數(shù)據(jù)處理與存儲和觸摸屏顯示3個模塊組成,如圖1所示。
數(shù)據(jù)接收發(fā)送模塊負(fù)責(zé)接收CAN總線傳輸?shù)母鞣N數(shù)據(jù),如速度、轉(zhuǎn)速和溫度等,并將處理后的數(shù)據(jù)發(fā)送到微處理器;或者將微處理器發(fā)送的數(shù)據(jù)進(jìn)行處理之后發(fā)送至CAN總線。微處理器接收到需要的數(shù)據(jù)后,按照預(yù)定的算法和要求對數(shù)據(jù)進(jìn)行處理,并將結(jié)果輸出。人機交互界面程序接收到微處理器發(fā)送的數(shù)據(jù)后進(jìn)行相應(yīng)的顯示,并將觸摸事件反饋給微處理器。
2 汽車儀表硬件設(shè)計
本儀表采用Samsung公司的S3C6410處理器,它是一款低功耗、高性價比的32 bit RSIC處理器,其處理器在視頻媒體編解碼、2D/3D圖形加速、顯示處理和縮放等方面有很大的性能優(yōu)勢。S3C6410有很多硬件功能外設(shè),如TFT真彩色LCD控制器,4通道的UART,4通道定時器,通用I/O口,I2S總線,I2C總線,USB Host,高速USB OTG、SD Host、MMC卡接口以及內(nèi)部的PLL時鐘發(fā)生器等。該處理器具有很大的擴展空間,在后續(xù)開發(fā)中潛力巨大。Qt Quick開發(fā)出美觀炫麗的用戶圖形界面,需要選擇圖形處理能力較強的處理芯片,因此選擇S3C6410處理器。
S3C6410處理器沒有內(nèi)置CAN控制器模塊,需要外接一個CAN控制器和一個CAN收發(fā)器。該儀表選用美國微芯科技有限公司生產(chǎn)的MCP2510作為CAN控制器。MCP2510是帶有SPI接口的獨立的CAN控制器,它支持CAN 2.0A/B,含有3個發(fā)送緩沖器和兩個接收緩沖器,可以使MCP2510發(fā)送和接收標(biāo)準(zhǔn)幀和擴展幀。本設(shè)計采用飛利浦公司生產(chǎn)的TJA1050作為CAN收發(fā)器,如圖2所示。將MCP2510的數(shù)據(jù)輸出TXCAN和RXCAN引腳通過6N137光耦接到TJA1050的TXD和RXD引腳上,MCP2510的SPI接口的SCK、SI、SO引腳用導(dǎo)線引出,S3C6410通過SPI接口與MCP2510進(jìn)行實時通信,MCP2510將數(shù)據(jù)轉(zhuǎn)換成CAN報文發(fā)送到TJA1050,TJA1050把MCP2510傳輸?shù)男盘栟D(zhuǎn)換為差分電壓信號發(fā)送到CAN總線上。
3 汽車儀表軟件設(shè)計
3.1 CAN總線通信
德國Bosch公司開發(fā)的CAN總線是為解決現(xiàn)代汽車中大量的電控單元而開發(fā)的一種串行通信協(xié)議,在車載各電子控制單元ECU(Electronic Control Unit)之間交換信息,形成了重要的汽車電子控制網(wǎng)絡(luò)。CAN技術(shù)規(guī)范遵從ISO/OSI標(biāo)準(zhǔn)定義的7層基準(zhǔn)參考模型,按照這個標(biāo)準(zhǔn)模型,最早的CAN規(guī)范只定義了數(shù)據(jù)鏈路層和物理層,用戶需要自己制定相應(yīng)的應(yīng)用層協(xié)議。J1939協(xié)議是美國汽車工程協(xié)會SAE(Society of Automotive Engineers)根據(jù)CAN 2.0B為核心協(xié)議制定的協(xié)議。J1939協(xié)議制定了應(yīng)用層協(xié)議,明確規(guī)定了ECU地址、報文發(fā)送優(yōu)先級、擴展幀格式和通信方式等。由CAN總線高速網(wǎng)絡(luò)連接車載電子裝置,實現(xiàn)了高速數(shù)據(jù)共享。因此本文采用SAE J1939協(xié)議。
3.1.1 SAE J1939協(xié)議數(shù)據(jù)幀格式
SAE J1939協(xié)議數(shù)據(jù)幀以協(xié)議數(shù)據(jù)單元PDU為單位,如圖3所示。PDU包含優(yōu)先級(P)、保留位(R)、數(shù)據(jù)頁(DP)、PDU格式(PF)、PDU細(xì)節(jié)(PS)、源地址(SA)以及數(shù)據(jù)域(Data Field)。指定PDU(PS):當(dāng)PF值為0~239時,PS是目標(biāo)地址DA;當(dāng)PF值為240~255時,PS為組擴展(GE)。CAN擴展幀中,SOF、SRR、IDE、RTR位、控制域場、CRC、ACK和EOF場沒有包括在PDU內(nèi),這些場由CAN規(guī)范定義,未被SAE J1939修改。
3.1.2 CAN通信軟件設(shè)計
本設(shè)計中S3C6410通過SPI總線與CAN控制器MCP2510通信,CAN通信可分為各個獨立的程序模塊,包括SPI初始化、MCP2510的初始化和發(fā)送接收子程序等。在CAN總線工作開始時,首先需要對S3C6410微處理器的SPI進(jìn)行初始化操作,設(shè)置相應(yīng)寄存器,然后對MCP2510進(jìn)行初始化操作。在對MCP2510進(jìn)行讀寫操作時,必須嚴(yán)格遵守SPI指令。SPI指令包括復(fù)位(11000000)、讀(00000011)、寫(00000010)、發(fā)送請求(10000000)、狀態(tài)讀(10100000)和位修改(00000101)。
MCP2510只有在配置模式下才能對器件進(jìn)行正常的初始化。其中包括CAN通信的波特率、MCP2510的配置寄存器、濾波/屏蔽寄存器和中斷使能寄存器等。在進(jìn)行完初始化之后,必須將MCP2510置為Normal模式。CAN控制器MCP2510初始化流程如圖4所示。
3.2 人機交互界面設(shè)計
Qt Quick提供了一套高動態(tài)、豐富的QML元素來制定用戶圖形界面的框架以及Qt Quick Designer開發(fā)工具。QML語言是一種描述性語言,用于描述用戶界面的外觀和行為。QML中采用JavaScript作為腳本語言,用戶界面被規(guī)定為樹形結(jié)構(gòu)。
3.2.1 QML語言模塊以及語法
QML已經(jīng)定義了許多功能強大的界面元素,如Item、Rectangle、Image、Text和ListView等,其中Item是QML中可視元素的基礎(chǔ)。import語句導(dǎo)入包含所有標(biāo)準(zhǔn)QML元素的Qt模塊,其中一些元素可以作為其他元素(children)的容器(parent)。每個元素具有唯一的id屬性,此id允許對象被其他的對象引用。屬性以name:value形式指定。State、property、Animation、Transition、Timer和Connection等元素用于描述應(yīng)用程序的行為。在QML中常常用到的Anchors描述的是當(dāng)前元素的位置和其他元素的相對關(guān)系。一個元素通過形式為Type.property的屬性附加到另一個元素當(dāng)中,其中Type是附加property元素的類型。在QML中,狀態(tài)(States)用于管理有id的元素,它由多個state元素構(gòu)成,每個元素都可以定義自己的不同狀態(tài),當(dāng)元素進(jìn)入某個狀態(tài)時,狀態(tài)所對應(yīng)的屬性將被設(shè)置修改。在設(shè)計中通過判斷條件來決定是否激活一個狀態(tài),使用when屬性,返回值為true或者false。在QML語言描述一個按鈕的單擊功能時,可以使用QML事件處理功能,這個功能是非常類似于Qt的Signal/Slot機制。
QML中用戶界面創(chuàng)建數(shù)據(jù)模型非常重要,具有資源利用率高、數(shù)據(jù)傳輸快、數(shù)據(jù)存儲空間合理和用戶界面流暢等優(yōu)點。模型為其他部件提供數(shù)據(jù)接口,在設(shè)計中使用ListView能快速建立菜單欄列表類型的界面。
QML元素ListModel可以從內(nèi)部創(chuàng)建這些Model,或使用QAbstractListModel繼承的C++ Model類,ListElement在ListModel中定義數(shù)據(jù)項,列表ListView顯示Model的數(shù)據(jù),Delegate定義如何顯示數(shù)據(jù)。通過ListView定義Items的布局為水平布局和垂直布局來顯示Items的布局方式。ListModel、Delegate和ListView之間的關(guān)系如圖5所示。
3.2.2 QML與C++交互
Qt Quick包含QtDeclarative C++模塊,并且被整合進(jìn)Qt creator IDE當(dāng)中。QML API有QDeclarativeEngine、QDeclarativeComponent和QDeclarativeContext 3個主要成員: QDeclarativeEngine提供在C++中QML應(yīng)用的運行庫以及QML內(nèi)容與Qt/C++程序中的接口; QDeclarative
Component加載QML文檔,每個QDeclarativeComponent實例對應(yīng)一個QML文檔,文檔URL可以是本地文件系統(tǒng)URL或任何QNetworkAccessManager支持的網(wǎng)絡(luò)URL;QDeclarativeContext暴露數(shù)據(jù)給QML實例。
在Qt/C++中使用QML開發(fā)的組件,必須先讓QML運行的環(huán)境被應(yīng)用程序加載調(diào)用,創(chuàng)建一個QDeclarativeEngine實例,使用QDeclarativeEngine加載QML組件并對所有的QML組件進(jìn)行全局配置。通過QDeclarativeComponent::create()方法創(chuàng)建QML組件實例。下面的代碼演示了如何加載一個QML Document并創(chuàng)建一個實例。
QDeclarativeEngine*engine=new QDeclarativeEngine(parent);
QDeclarativeComponent component(engine,QUrl::fromLocalFile("main.qml"));
QObject*Object=component.create();
為了把QML組件嵌入到Qt/C++應(yīng)用程序中,需要使用Qt 4.7以上的SDK。
3.2.3 人機交互界面開發(fā)
在本設(shè)計中設(shè)計人機交互界面主要涉及布局、Signal/Slot通信機制的運用、狀態(tài)轉(zhuǎn)換、Transition過渡效果、ListModel與ListView元素等內(nèi)容。通信方式使用QML發(fā)送Signal,Qt/C++中定義用Slot接收。
在人機交互主界面中,使用Scale縮放儀表盤圖片,使其適合屏幕,設(shè)置Rotate來旋轉(zhuǎn)儀表盤指針,旋轉(zhuǎn)默認(rèn)是以圖片中心為轉(zhuǎn)軸,但是可以通過transformOrigin屬性來設(shè)置轉(zhuǎn)軸。轉(zhuǎn)向燈使用State元素,State通過PropertyChanges修改屬性,當(dāng)總線傳來開啟轉(zhuǎn)向燈信號時,圖片透明度從較低值變換到較高值,當(dāng)接收到總線傳來的關(guān)閉轉(zhuǎn)向燈信號時,圖片透明度從較高值變換到較低值,從而實現(xiàn)了警示燈的亮與滅。警示燈狀態(tài)變化要迅速直觀,減少駕駛員對警示燈誤判,因此并沒有采用Transition元素為狀態(tài)轉(zhuǎn)換間提供動畫動態(tài)過渡,同理,其他警示燈也采用這種方法實現(xiàn)。狀態(tài)轉(zhuǎn)換同樣用于儀表中菜單欄圖標(biāo)的顯示中,例如瀏覽器網(wǎng) 頁縮略圖模式與瀏覽模式切換,代碼如下:
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}
基本的菜單欄都類似于上面的代碼。在儀表系統(tǒng)中,實現(xiàn)數(shù)字、英文字母與符號輸入使用Grid元素來布局,spacing屬性控制網(wǎng)格單元之間的距離。代碼例子如下:
Grid{
id:keyboard
spacing:2
columns:12
KeyButton{operation:“Q”}
……
KeyButton{operation:“Enter”;width:50}
……
KeyButton{operation:“1”}
……
}
4 開發(fā)環(huán)境編譯與移植
Qt Creator是跨平臺的Qt IDE,提供了圖形化的調(diào)試窗口和qmake工具,Qt Creator代碼編輯窗口具有非常人性化的設(shè)計,具有對C++及QML語言表達(dá)式檢查,代碼語句整齊排列,代碼自動補全,對類與函數(shù)及變量作上下文關(guān)聯(lián)分析,告知函數(shù)聲明和調(diào)用的位置。Qt Demo提供大量的Qt實例并提供在Qt Linguist下的源代碼鏈接,通過Qt Demo可以快速學(xué)習(xí)Qt和QML編程。
要在ARM上運行Qt程序,需要移植ARM版本的Qt/E。進(jìn)入到ARM版Qt/E目錄當(dāng)中,執(zhí)行配置源碼命令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。
在上面的語句當(dāng)中,最后的語句-importdir/usr/local/Trolltech/QtEmbedded-4.8.0-arm/qml是將qml相關(guān)庫添加到Qt/E庫當(dāng)中,使用arm-linux交叉編譯器進(jìn)行編譯,-xplatform qws/linux-arm-g++,-qt-mouse-tslib命令為使用tslib來驅(qū)動觸摸屏。編寫好配置命令后,使用make與make install命令進(jìn)行編譯安裝,然后將文件打包下載到ARM板并解壓縮,這樣Qt/E的ARM環(huán)境就移植完畢。
5 汽車儀表測試
儀表系統(tǒng)是駕駛過程中非常重要的系統(tǒng)之一,在此選用較深色背景作為LCD終端顯示背景,避免駕駛員出現(xiàn)視覺疲勞現(xiàn)象,背景也可以根據(jù)用戶喜好而改變。汽車車速表、轉(zhuǎn)速表、燃油表與溫度表都以圓盤式指針表顯示,這樣的設(shè)計比較符合駕駛員對傳統(tǒng)汽車儀表的使用習(xí)慣。菜單欄位于屏幕上部,便于乘員對儀表盤進(jìn)行操作。
使用嵌入式Linux作為車載儀表系統(tǒng)是比較流行的解決方案之一,其中嵌入式GUI能給用戶提供良好的操作界面,而Qt Quick能迅速開發(fā)美觀易用的嵌入式GUI,在今后的實際應(yīng)用中有著巨大的潛力,有比較大的參考價值。
參考文獻(xiàn)
[1] 饒運濤,鄒繼軍,鄭勇蕓.現(xiàn)場總線CAN原理與應(yīng)用技術(shù)(第2版)[M].北京:北京航空航天大學(xué)出版社,2007.
[2] 廖樂平,楊松,高琛,等.基于SAE J1939的車身控制系統(tǒng)設(shè)計[J].汽車實用技術(shù),2011(5):31-33.
[3] 宋曉東,王建.CAN總線汽車儀表研究[J].電子設(shè)計工程,2010(4):35-37.
[4] 李宏梅,佟為明,程樹康.CAN總線全數(shù)字式汽車儀表[J].電子器件,2010(5):646-650.
[5] 肖楚海,梁杰申,黃煒中.基于CAN總線的汽車儀表的設(shè)計[J].信息技術(shù),2010(2):80-82.