廈門工學(xué)院,福建廈門361021
汽車儀表是駕駛員獲取汽車狀態(tài)信息的關(guān)鍵設(shè)備,對(duì)汽車的安全行駛起著重要的作用。近年來,隨著計(jì)算機(jī)、微電子和各種現(xiàn)場(chǎng)總線通信技術(shù)的廣泛應(yīng)用,汽車電子技術(shù)得到了迅猛的發(fā)展,汽車儀表盤上顯示的信息不斷增加,傳統(tǒng)的機(jī)械式、電氣式組合儀表越來越無法滿足使用的需求。
本文介紹的數(shù)字儀表盤是S3C2410開發(fā)板下基于Linux操作系統(tǒng)下設(shè)計(jì)的數(shù)字儀表,具有顯示直觀、讀識(shí)速度快、準(zhǔn)確度高、適應(yīng)環(huán)境亮度范圍寬、彩色視覺效果好、對(duì)比度高等優(yōu)點(diǎn)。
本文重點(diǎn)闡述設(shè)計(jì)時(shí)主要解決的三個(gè)問題:圖形開發(fā)界面的選擇、儀表盤窗口的設(shè)計(jì)、儀表指針顯示設(shè)計(jì)。
設(shè)計(jì)數(shù)字儀表,需要選擇一個(gè)友好的圖形用戶界面支持系統(tǒng)GUI來進(jìn)行顯示界面的開發(fā)。因?yàn)榍度胧皆O(shè)備的可用資源有限,所以選擇的GUI必須是可定制、占用資源少、高性能、高可靠性以及可配置。
Qt/Embedded具有平臺(tái)無關(guān)性、良好的GUI編程接口以及強(qiáng)大的開發(fā)工具支持[1],本文選用Qt/Embedded來進(jìn)行儀表盤圖形顯示界面的開發(fā)。
圖1所示為Qt/Embedded應(yīng)用程序開發(fā)流程圖。首先,安裝Qt/Embedded工具開發(fā)包,然后基于S3C2410開發(fā)板硬件特性,交叉編譯Qt/Embedded庫(kù),確認(rèn)可用的情況下再進(jìn)行相關(guān)應(yīng)用程序開發(fā)和聯(lián)調(diào),最終發(fā)布應(yīng)用程序。
儀表盤顯示結(jié)構(gòu)圖如圖2所示,將LCD顯示界面劃分為不同的區(qū)域,分別顯示車速、發(fā)動(dòng)機(jī)轉(zhuǎn)速、水溫、油量、時(shí)間、里程數(shù)、檔位標(biāo)志和各種警告標(biāo)志[2]。
首先建立一個(gè)640×480(和LCD等大小)的主窗體,然后在主窗體上分別添加各個(gè)子窗體,由各子窗體完成顯示任務(wù)。子窗體的建立是通過對(duì)Qt中的QWidget進(jìn)行子類化來完成的。
例如,建立一個(gè)QWidget的派生類CarSpeed,用于動(dòng)態(tài)顯示汽車的行駛速度。在主窗口中設(shè)置其顯示區(qū)域,將其顯示在儀表盤的左下角。
為CarSpeed類的對(duì)象carspeed設(shè)置顯示區(qū)域,以主窗口的坐標(biāo)x=0,y=180為起點(diǎn),分配一個(gè)長(zhǎng)為400,高為300的矩形區(qū)域。Qt中默認(rèn)的坐標(biāo)系是以窗體的左上角為原點(diǎn),向右為x軸的正半軸,向下為y軸的正半軸。
至此,一個(gè)用于顯示車速和總里程數(shù)的子類窗口已經(jīng)建立,在此窗口中可完成圖形的繪制,其他各個(gè)子窗體的建立與此類似。
Qt中主要用以下兩個(gè)類來完成圖形的繪制功能:QPainte和QPaintDevice。QPainter類完成整個(gè)畫圖工具的定義, QPaintDevice類則定義畫圖的設(shè)備,即最終的圖像顯示設(shè)備[3]。
Qt下畫圖程序基本框架如下:
下面以車速顯示窗口繪制為例說明顯示程序的具體實(shí)現(xiàn)。
圖3所示為車速表示意圖。車速表畫成模擬表盤的形式,指針可隨車速的不同而動(dòng)態(tài)旋轉(zhuǎn),同時(shí)指針下方可顯示汽車速度和總里程數(shù)。
該顯示模塊,是定義了一個(gè)QWidget的派生類CarSpeed,由這個(gè)類來完成車速表的繪制。分析該類的組成,車速和里程數(shù)構(gòu)成了兩個(gè)最重要的成員變量,車速表上模擬指針的擺動(dòng)和數(shù)字顯示都是依靠這兩個(gè)值;其次還包括弧線半徑、起始角和終止角這三個(gè)參數(shù),它們決定了表盤的外形[4]。而成員函數(shù)則包含有構(gòu)造函數(shù)(初始化成員變量)、設(shè)置車速、設(shè)置里程數(shù)、繪制外圓弧、繪制刻度線、繪制文字(包扣刻度值和數(shù)字式車速、里程數(shù))、繪制指針(隨車速的不同而不斷擺動(dòng))和畫圖事件(響應(yīng)畫圖事件,調(diào)用上面的繪制函數(shù),實(shí)現(xiàn)圖像更新)。類的定義代碼如下所示:
下面重點(diǎn)介紹表盤刻度線的繪制drawScaleLable()函數(shù):
因刻度線較多,在繪制刻度線時(shí),需要確定大量的線段端點(diǎn)坐標(biāo),該工作量較大且易出錯(cuò)。因此我們采用圖4所示的方法來確定刻度線的每一個(gè)端點(diǎn)的坐標(biāo)。
如圖4所示:刻度線a是由端點(diǎn)0和1組成,刻度線b是由端點(diǎn)2和3組成,而端點(diǎn)0是由直線a與半徑為rl的大圓相交而得,端點(diǎn)1是由直線a與半徑為rs的小圓相交而得;端點(diǎn)2是由直線b與半徑為rl的大圓相交所得,端點(diǎn)3是由直線b與半徑為rm的中圓相交而得。
若原點(diǎn)坐標(biāo)為(x,y) ,直線a與x軸的角度為θ1,則端點(diǎn)0的橫坐標(biāo)x0=x+rL*cosθ1,縱坐標(biāo)y0=y-rL*sinθ1(因?yàn)镼t中y軸的方向以直角坐標(biāo)系的y軸方向相反,所以y0是y-rL*sinθ1,而不是y+rL*sinθ1)。同理,端點(diǎn) 1 的橫坐標(biāo)x1=x+rS*cosθ1,縱坐標(biāo)y1=y-rS*sinθ1。
若直線b與x軸的角度為θ2,則端點(diǎn)2的橫坐標(biāo)x2=x+rL*cosθ2,縱坐標(biāo)y2=y-rL*sinθ2。端點(diǎn) 3 的橫坐標(biāo)x3=x+rM*cosθ2,縱坐標(biāo)y3=y-rM*sinθ2。
以上規(guī)律可以看出:
在 0、2、4、6、......、2n的 點(diǎn) 坐 標(biāo) 都 為x2n=x+rL*cosθ,yn=y-rL*sinθ;
在1、5、9、13、......、4n+1的點(diǎn)坐標(biāo)都為x4n+1=x+rS*cosθ,y4n+1=y-rS*sinθ;
在3、7、11、15、......、4n-1的點(diǎn)坐標(biāo)都為x4n-1=x+rM*cosθ,y4n-1=y-rM*sinθ。
算法如圖5所示:計(jì)算出所有的點(diǎn)坐標(biāo)之后,創(chuàng)建一個(gè)QPointArray類的對(duì)象parray,將各點(diǎn)坐標(biāo)按序列裝入parray中,調(diào)用QPainter::drawLineSegments(pa rray)則可以繪制出第0點(diǎn)到第1點(diǎn)的線段a,第2點(diǎn)到第3點(diǎn)的線段b。至此,表盤刻度線繪制完成。
中華門是南京明城墻的十三座明代京城城門之一,原名聚寶門,是中國(guó)現(xiàn)存規(guī)模最大的城門,也是世界上保存最完好、結(jié)構(gòu)最復(fù)雜的堡壘甕城,有“天下第一甕城”之稱。由于傳統(tǒng)地位和現(xiàn)代交通等因素的影響,中華門是南京眾多城墻當(dāng)中的明星。[5]
儀表盤上需要顯示一些小圖標(biāo)來提示車輛的運(yùn)行狀況,如水溫、油量、手剎車未松、車門未關(guān)好、前排乘客未系上安全帶、電池電量低等,這些小圖標(biāo)都有標(biāo)準(zhǔn)的形狀和畫法,從互聯(lián)網(wǎng)上下載標(biāo)準(zhǔn)圖標(biāo)后,通過Linux下的convert程序可以將其從某種外部模式轉(zhuǎn)換成一種可以顯示的模式,然后將其顯示在儀表盤上。但因網(wǎng)上獲得的圖標(biāo)背景色與儀表盤的背景色不同,如果將其直接顯示的話,視覺效果不好,所以我們需要將其背景色進(jìn)行轉(zhuǎn)化[5]。
在Qt中,有一個(gè)QImage的類可以訪問像素的值,它能夠?qū)蝹€(gè)像素信息進(jìn)行底層訪問。通過訪問每一個(gè)像素,獲得其顏色值并修改,可以對(duì)整個(gè)圖形的顏色進(jìn)行修改。具體實(shí)現(xiàn)步驟如下:
(1)將圖標(biāo)文件轉(zhuǎn)換成XPM的圖形模式,如fi le.jpg轉(zhuǎn)換成 fi le.xpm;
(2)基于file.xpm創(chuàng)建一個(gè)QPixmap的對(duì)象QPixmap fi le;
(3)調(diào)用QPixmap::convertToImage()將其轉(zhuǎn)換成QImage格式,
(4)訪問QImage中的每一個(gè)像素,對(duì)于背景色:白色(紅:255,藍(lán):255,綠:255)和黑色(紅:0,藍(lán):0,綠:0),都將其修改為儀表盤的背景色(紅:85,藍(lán):127,綠:0);
(5)調(diào)用QPixmap::convertFromImage()將修改后的圖形數(shù)據(jù)轉(zhuǎn)換成另一個(gè)QPixmap形式的像素映射;
(6)調(diào)用QPainter::drawPixmap()就可將轉(zhuǎn)換后的圖標(biāo)顯示出來。
處理后的圖形顯示效果如圖6所示。
儀表盤的顯示效果如圖7所示:表盤選用靚青色(紅:85,藍(lán):127,綠:0)為背景,指針、外圓弧、刻度線、時(shí)間和單次里程數(shù)用白色繪制,刻度值、車速值、轉(zhuǎn)速值和總里程表用紅色顯示,警告小圖標(biāo)用黃色顯示。上述顏色的搭配顯示,目的是使儀表盤顯示更加醒目,讓駕駛員對(duì)顯示信息一目了然。
儀表盤右下角顯示的是發(fā)動(dòng)機(jī)轉(zhuǎn)速,指針隨轉(zhuǎn)速的不同動(dòng)態(tài)偏轉(zhuǎn),同時(shí)也以數(shù)字顯示出具體的轉(zhuǎn)速值;
轉(zhuǎn)速表上方顯示的是一些安全警告,比如車門未關(guān)好、未系安全帶等,這些黃色小圖標(biāo)在汽車正常狀態(tài)時(shí)不會(huì)顯示出來,只有當(dāng)狀況發(fā)生時(shí),比如有人坐上座位又沒有系安全帶,這時(shí)未系安全帶的警告圖標(biāo)就會(huì)顯示[6];
右上角顯示的是油量,指針會(huì)隨油量的多少而偏轉(zhuǎn);
左上角顯示的是冷卻水溫度,指針隨水溫的變換而偏轉(zhuǎn);
中間方形模塊顯示的是汽車各種車燈的工作情況,包括遠(yuǎn)光燈、近光燈、霧燈和轉(zhuǎn)向燈等,各車燈點(diǎn)亮后會(huì)同時(shí)在儀表盤上顯示出來;
車燈右方顯示的是汽車擋位,紅色顯示的就是當(dāng)前汽車所運(yùn)行的擋位。
車燈左方顯示的是汽車的品牌名稱;
車燈下方顯示的是時(shí)間和單次里程表,以數(shù)字式的形式顯示當(dāng)前系統(tǒng)時(shí)間,單次里程表可以進(jìn)行清零操作。
本文設(shè)計(jì)的儀表盤是一種較新的汽車儀表概念,逐步向“綜合信息系統(tǒng)”方向發(fā)展,其特征是以液晶顯示為基礎(chǔ),趨向于計(jì)算機(jī)數(shù)據(jù)處理和綜合信息傳遞及顯示的主節(jié)點(diǎn)。即汽車儀表作為汽車綜合信息顯示中心,不再僅僅是一個(gè)顯示信息的工具,還是一個(gè)會(huì)分析、處理信息并控制執(zhí)行的系統(tǒng)。并在儀表系統(tǒng)中成功地應(yīng)用了S3C2410微處理器和嵌入式Linux系統(tǒng),ARM處理器的使用,使系統(tǒng)的整體性能有了質(zhì)的飛躍;嵌入式Linux系統(tǒng)的引入,對(duì)系統(tǒng)的軟件設(shè)計(jì)和功能模塊的添加/裁剪,提供了最大的方便。眼下開放式結(jié)構(gòu)正處于發(fā)展階段中,這種結(jié)構(gòu)在整個(gè)汽車壽命期內(nèi)都可以靈活地進(jìn)行功能組合,并方便進(jìn)行功能擴(kuò)展,完善系統(tǒng)。