王 璐,潘 明
(桂林電子科技大學 電子工程與自動化學院,廣西 桂林 541004)
中國汽車工業(yè)強勁發(fā)展,產(chǎn)銷能力排行世界第一,但絕大部分國產(chǎn)汽車仍搭載步進電機式汽車儀表。隨著電子技術(shù)的迅猛發(fā)展,汽車信息容量與系統(tǒng)復雜程度產(chǎn)生了很大的變化。目前,國外各大汽車公司都在研究全數(shù)字式汽車儀表,汽車儀表正加速向智能化、數(shù)字化和網(wǎng)絡(luò)化方向發(fā)展。
本文設(shè)計了一種基于CAN(Controller Area Network)總線的汽車智能儀表系統(tǒng)。設(shè)計思路是將獲取的行駛速度、發(fā)動機轉(zhuǎn)速、油量、里程表、冷卻液和警示燈等數(shù)據(jù)顯示在人機交互界面上,并將巡航控制、導航、視頻和音樂等功能集成到該儀表系統(tǒng)當中,所有信息都直觀顯示在大屏幕TFT-LCD上,觸摸屏技術(shù)給駕駛員與乘員帶來更為有趣的行駛過程。
Qt是一個跨平臺的C++圖形用戶界面庫,它基于面向?qū)ο蟮乃枷耄瑪U展容易且可移植性好,其良好的封裝機制使得Qt模塊化程度很高,用戶開發(fā)十分方便,并具有優(yōu)良的跨平臺特性。Qt包括多達250個以上的C++類,支持 2D/3D圖形渲染和 OpenGL,集成 Webkit引擎。本文采用Nokia最新開發(fā)的Qt Quick高級用戶界面技術(shù),為嵌入式設(shè)備快速輕松地創(chuàng)建動態(tài)觸摸式界面和輕量級應(yīng)用程序。在Qt Quick中,新增加了一種簡便易學的語言QML,這種語言能讓Qt應(yīng)用程序開發(fā)變得更為方便快捷。
汽車儀表主要由數(shù)據(jù)接收發(fā)送、數(shù)據(jù)處理與存儲和觸摸屏顯示3個模塊組成,如圖1所示。
圖1 嵌入式汽車儀表硬件系統(tǒng)
數(shù)據(jù)接收發(fā)送模塊負責接收CAN總線傳輸?shù)母鞣N數(shù)據(jù),如速度、轉(zhuǎn)速和溫度等,并將處理后的數(shù)據(jù)發(fā)送到微處理器;或者將微處理器發(fā)送的數(shù)據(jù)進行處理之后發(fā)送至CAN總線。微處理器接收到需要的數(shù)據(jù)后,按照預定的算法和要求對數(shù)據(jù)進行處理,并將結(jié)果輸出。人機交互界面程序接收到微處理器發(fā)送的數(shù)據(jù)后進行相應(yīng)的顯示,并將觸摸事件反饋給微處理器。
本儀表采用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ā)送和接收標準幀和擴展幀。本設(shè)計采用飛利浦公司生產(chǎn)的TJA1050作為CAN收發(fā)器,如圖2所示。將MCP2510的數(shù)據(jù)輸出TXCAN和RXCAN引腳通過6N137光耦接到TJA1050的TXD和RXD引腳上,MCP2510的 SPI接口的 SCK、SI、SO引腳用導線引出,S3C6410通過SPI接口與 MCP2510進行實時通信,MCP2510將數(shù)據(jù)轉(zhuǎn)換成CAN報文發(fā)送到TJA1050,TJA1050把MCP2510傳輸?shù)男盘栟D(zhuǎn)換為差分電壓信號發(fā)送到CAN總線上。
圖2 CAN控制器與收發(fā)器接口電路
德國Bosch公司開發(fā)的CAN總線是為解決現(xiàn)代汽車中大量的電控單元而開發(fā)的一種串行通信協(xié)議,在車載各電子控制單元 ECU(Electronic Control Unit)之間交換信息,形成了重要的汽車電子控制網(wǎng)絡(luò)。CAN技術(shù)規(guī)范遵從ISO/OSI標準定義的7層基準參考模型,按照這個標準模型,最早的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 細節(jié)(PS)、源地址(SA)以及數(shù)據(jù)域(Data Field)。 指定 PDU(PS):當 PF 值為 0~239時,PS是目標地址 DA; 當 PF值為 240~255時,PS為組擴展(GE)。CAN 擴展幀中,SOF、SRR、IDE、RTR 位、控制域場、CRC、ACK和 EOF場沒有包括在 PDU內(nèi),這些場由CAN規(guī)范定義,未被SAE J1939修改。
圖3 SAE J1939協(xié)議數(shù)據(jù)幀格式
3.1.2 CAN通信軟件設(shè)計
本設(shè)計中S3C6410通過SPI總線與CAN控制器MCP2510通信,CAN通信可分為各個獨立的程序模塊,包括SPI初始化、MCP2510的初始化和發(fā)送接收子程序等。在CAN總線工作開始時,首先需要對S3C6410微處理器的SPI進行初始化操作,設(shè)置相應(yīng)寄存器,然后對MCP2510進行初始化操作。在對MCP2510進行讀寫操作時,必須嚴格遵守SPI指令。SPI指令包括復位(11000000)、 讀 (00000011)、 寫 (00000010)、 發(fā) 送 請 求(10000000)、狀態(tài)讀(10100000)和位修改(00000101)。
MCP2510只有在配置模式下才能對器件進行正常的初始化。其中包括CAN通信的波特率、MCP2510的配置寄存器、濾波/屏蔽寄存器和中斷使能寄存器等。在進行完初始化之后,必須將MCP2510置為Normal模式。CAN控制器MCP2510初始化流程如圖4所示。
圖4 MCP2510初始化流程圖
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語句導入包含所有標準QML元素的Qt模塊,其中一些元素可以作為其他元素(children)的容器(parent)。 每個元素具有唯一的 id屬性,此id允許對象被其他的對象引用。屬性以name:value 形式指定。State、property、Animation、Transition、Timer和Connection等元素用于描述應(yīng)用程序的行為。在QML中常常用到的Anchors描述的是當前元素的位置和其他元素的相對關(guān)系。一個元素通過形式為Type.property的屬性附加到另一個元素當中,其中Type是附加property元素的類型。在QML中,狀態(tài)(States)用于管理有 id的元素,它由多個state元素構(gòu)成,每個元素都可以定義自己的不同狀態(tài),當元素進入某個狀態(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所示。
圖5 ListModel、Delegate和ListView 關(guān)系
3.2.2 QML與 C++交互
Qt Quick包含QtDeclarative C++模塊,并且被整合進Qt creator IDE當中。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組件進行全局配置。通過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)默認是以圖片中心為轉(zhuǎn)軸,但是可以通過transformOrigin屬性來設(shè)置轉(zhuǎn)軸。轉(zhuǎn)向燈使用State元素,State通過PropertyChanges修改屬性,當總線傳來開啟轉(zhuǎn)向燈信號時,圖片透明度從較低值變換到較高值,當接收到總線傳來的關(guān)閉轉(zhuǎn)向燈信號時,圖片透明度從較高值變換到較低值,從而實現(xiàn)了警示燈的亮與滅。警示燈狀態(tài)變化要迅速直觀,減少駕駛員對警示燈誤判,因此并沒有采用Transition元素為狀態(tài)轉(zhuǎn)換間提供動畫動態(tài)過渡,同理,其他警示燈也采用這種方法實現(xiàn)。狀態(tài)轉(zhuǎn)換同樣用于儀表中菜單欄圖標的顯示中,例如瀏覽器網(wǎng)頁縮略圖模式與瀏覽模式切換,代碼如下:
儀表各分界面菜單使用ListView顯示,例如定義一個菜單欄,代碼為:
基本的菜單欄都類似于上面的代碼。在儀表系統(tǒng)中,實現(xiàn)數(shù)字、英文字母與符號輸入使用Grid元素來布局,spacing屬性控制網(wǎng)格單元之間的距離。代碼例子如下:
Qt Creator是跨平臺的Qt IDE,提供了圖形化的調(diào)試窗口和qmake工具,Qt Creator代碼編輯窗口具有非常人性化的設(shè)計,具有對C++及QML語言表達式檢查,代碼語句整齊排列,代碼自動補全,對類與函數(shù)及變量作上下文關(guān)聯(lián)分析,告知函數(shù)聲明和調(diào)用的位置。Qt Demo提供大量的Qt實例并提供在Qt Linguist下的源代碼鏈接,通過Qt Demo可以快速學習Qt和QML編程。
要在ARM上運行Qt程序,需要移植ARM版本的Qt/E。進入到ARM版Qt/E目錄當中,執(zhí)行配置源碼命令 echo yes|./configure-opensource-embedded armxplatform qws/linux-arm-g++-webkit-qt-libtiff-qtlibmng-qt-mouse-tslib-no-mouse-linuxtp-declarative-noqt3support-nomake examples-nomake demos-nomake docs-importdir/usr/local/Trolltech/QtEmbedded-4.8.0-arm/qml–fast。
在上面的語句當中,最后的語句-importdir/usr/local/Trolltech/QtEmbedded-4.8.0-arm/qml是將qml相關(guān)庫添加到Qt/E庫當中,使用arm-linux交叉編譯器進行編譯,-xplatform qws/linux-arm-g++,-qt-mouse-tslib命令為使用tslib來驅(qū)動觸摸屏。編寫好配置命令后,使用make與make install命令進行編譯安裝,然后將文件打包下載到ARM板并解壓縮,這樣Qt/E的ARM環(huán)境就移植完畢。
儀表系統(tǒng)是駕駛過程中非常重要的系統(tǒng)之一,在此選用較深色背景作為LCD終端顯示背景,避免駕駛員出現(xiàn)視覺疲勞現(xiàn)象,背景也可以根據(jù)用戶喜好而改變。汽車車速表、轉(zhuǎn)速表、燃油表與溫度表都以圓盤式指針表顯示,這樣的設(shè)計比較符合駕駛員對傳統(tǒng)汽車儀表的使用習慣。菜單欄位于屏幕上部,便于乘員對儀表盤進行操作。
使用嵌入式Linux作為車載儀表系統(tǒng)是比較流行的解決方案之一,其中嵌入式GUI能給用戶提供良好的操作界面,而Qt Quick能迅速開發(fā)美觀易用的嵌入式GUI,在今后的實際應(yīng)用中有著巨大的潛力,有比較大的參考價值。
[1]饒運濤,鄒繼軍,鄭勇蕓.現(xiàn)場總線CAN原理與應(yīng)用技術(shù)(第2版)[M].北京:北京航空航天大學出版社,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.