廈門工學院,福建廈門361021
汽車儀表是駕駛員獲取汽車狀態信息的關鍵設備,對汽車的安全行駛起著重要的作用。近年來,隨著計算機、微電子和各種現場總線通信技術的廣泛應用,汽車電子技術得到了迅猛的發展,汽車儀表盤上顯示的信息不斷增加,傳統的機械式、電氣式組合儀表越來越無法滿足使用的需求。
本文介紹的數字儀表盤是S3C2410開發板下基于Linux操作系統下設計的數字儀表,具有顯示直觀、讀識速度快、準確度高、適應環境亮度范圍寬、彩色視覺效果好、對比度高等優點。
本文重點闡述設計時主要解決的三個問題:圖形開發界面的選擇、儀表盤窗口的設計、儀表指針顯示設計。
設計數字儀表,需要選擇一個友好的圖形用戶界面支持系統GUI來進行顯示界面的開發。因為嵌入式設備的可用資源有限,所以選擇的GUI必須是可定制、占用資源少、高性能、高可靠性以及可配置。
Qt/Embedded具有平臺無關性、良好的GUI編程接口以及強大的開發工具支持[1],本文選用Qt/Embedded來進行儀表盤圖形顯示界面的開發。
圖1所示為Qt/Embedded應用程序開發流程圖。首先,安裝Qt/Embedded工具開發包,然后基于S3C2410開發板硬件特性,交叉編譯Qt/Embedded庫,確認可用的情況下再進行相關應用程序開發和聯調,最終發布應用程序。

儀表盤顯示結構圖如圖2所示,將LCD顯示界面劃分為不同的區域,分別顯示車速、發動機轉速、水溫、油量、時間、里程數、檔位標志和各種警告標志[2]。
首先建立一個640×480(和LCD等大小)的主窗體,然后在主窗體上分別添加各個子窗體,由各子窗體完成顯示任務。子窗體的建立是通過對Qt中的QWidget進行子類化來完成的。
例如,建立一個QWidget的派生類CarSpeed,用于動態顯示汽車的行駛速度。在主窗口中設置其顯示區域,將其顯示在儀表盤的左下角。
為CarSpeed類的對象carspeed設置顯示區域,以主窗口的坐標x=0,y=180為起點,分配一個長為400,高為300的矩形區域。Qt中默認的坐標系是以窗體的左上角為原點,向右為x軸的正半軸,向下為y軸的正半軸。
至此,一個用于顯示車速和總里程數的子類窗口已經建立,在此窗口中可完成圖形的繪制,其他各個子窗體的建立與此類似。
Qt中主要用以下兩個類來完成圖形的繪制功能:QPainte和QPaintDevice。QPainter類完成整個畫圖工具的定義, QPaintDevice類則定義畫圖的設備,即最終的圖像顯示設備[3]。
Qt下畫圖程序基本框架如下:

下面以車速顯示窗口繪制為例說明顯示程序的具體實現。
圖3所示為車速表示意圖。車速表畫成模擬表盤的形式,指針可隨車速的不同而動態旋轉,同時指針下方可顯示汽車速度和總里程數。

該顯示模塊,是定義了一個QWidget的派生類CarSpeed,由這個類來完成車速表的繪制。分析該類的組成,車速和里程數構成了兩個最重要的成員變量,車速表上模擬指針的擺動和數字顯示都是依靠這兩個值;其次還包括弧線半徑、起始角和終止角這三個參數,它們決定了表盤的外形[4]。而成員函數則包含有構造函數(初始化成員變量)、設置車速、設置里程數、繪制外圓弧、繪制刻度線、繪制文字(包扣刻度值和數字式車速、里程數)、繪制指針(隨車速的不同而不斷擺動)和畫圖事件(響應畫圖事件,調用上面的繪制函數,實現圖像更新)。類的定義代碼如下所示:



下面重點介紹表盤刻度線的繪制drawScaleLable()函數:
因刻度線較多,在繪制刻度線時,需要確定大量的線段端點坐標,該工作量較大且易出錯。因此我們采用圖4所示的方法來確定刻度線的每一個端點的坐標。
如圖4所示:刻度線a是由端點0和1組成,刻度線b是由端點2和3組成,而端點0是由直線a與半徑為rl的大圓相交而得,端點1是由直線a與半徑為rs的小圓相交而得;端點2是由直線b與半徑為rl的大圓相交所得,端點3是由直線b與半徑為rm的中圓相交而得。
若原點坐標為(x,y) ,直線a與x軸的角度為θ1,則端點0的橫坐標x0=x+rL*cosθ1,縱坐標y0=y-rL*sinθ1(因為Qt中y軸的方向以直角坐標系的y軸方向相反,所以y0是y-rL*sinθ1,而不是y+rL*sinθ1)。同理,端點 1 的橫坐標x1=x+rS*cosθ1,縱坐標y1=y-rS*sinθ1。
若直線b與x軸的角度為θ2,則端點2的橫坐標x2=x+rL*cosθ2,縱坐標y2=y-rL*sinθ2。端點 3 的橫坐標x3=x+rM*cosθ2,縱坐標y3=y-rM*sinθ2。
以上規律可以看出:
在 0、2、4、6、......、2n的 點 坐 標 都 為x2n=x+rL*cosθ,yn=y-rL*sinθ;
在1、5、9、13、......、4n+1的點坐標都為x4n+1=x+rS*cosθ,y4n+1=y-rS*sinθ;

在3、7、11、15、......、4n-1的點坐標都為x4n-1=x+rM*cosθ,y4n-1=y-rM*sinθ。
算法如圖5所示:計算出所有的點坐標之后,創建一個QPointArray類的對象parray,將各點坐標按序列裝入parray中,調用QPainter::drawLineSegments(pa rray)則可以繪制出第0點到第1點的線段a,第2點到第3點的線段b。至此,表盤刻度線繪制完成。
中華門是南京明城墻的十三座明代京城城門之一,原名聚寶門,是中國現存規模最大的城門,也是世界上保存最完好、結構最復雜的堡壘甕城,有“天下第一甕城”之稱。由于傳統地位和現代交通等因素的影響,中華門是南京眾多城墻當中的明星。[5]
儀表盤上需要顯示一些小圖標來提示車輛的運行狀況,如水溫、油量、手剎車未松、車門未關好、前排乘客未系上安全帶、電池電量低等,這些小圖標都有標準的形狀和畫法,從互聯網上下載標準圖標后,通過Linux下的convert程序可以將其從某種外部模式轉換成一種可以顯示的模式,然后將其顯示在儀表盤上。但因網上獲得的圖標背景色與儀表盤的背景色不同,如果將其直接顯示的話,視覺效果不好,所以我們需要將其背景色進行轉化[5]。
在Qt中,有一個QImage的類可以訪問像素的值,它能夠對單個像素信息進行底層訪問。通過訪問每一個像素,獲得其顏色值并修改,可以對整個圖形的顏色進行修改。具體實現步驟如下:
(1)將圖標文件轉換成XPM的圖形模式,如fi le.jpg轉換成 fi le.xpm;
(2)基于file.xpm創建一個QPixmap的對象QPixmap fi le;
(3)調用QPixmap::convertToImage()將其轉換成QImage格式,
(4)訪問QImage中的每一個像素,對于背景色:白色(紅:255,藍:255,綠:255)和黑色(紅:0,藍:0,綠:0),都將其修改為儀表盤的背景色(紅:85,藍:127,綠:0);
(5)調用QPixmap::convertFromImage()將修改后的圖形數據轉換成另一個QPixmap形式的像素映射;
(6)調用QPainter::drawPixmap()就可將轉換后的圖標顯示出來。
處理后的圖形顯示效果如圖6所示。


儀表盤的顯示效果如圖7所示:表盤選用靚青色(紅:85,藍:127,綠:0)為背景,指針、外圓弧、刻度線、時間和單次里程數用白色繪制,刻度值、車速值、轉速值和總里程表用紅色顯示,警告小圖標用黃色顯示。上述顏色的搭配顯示,目的是使儀表盤顯示更加醒目,讓駕駛員對顯示信息一目了然。
儀表盤右下角顯示的是發動機轉速,指針隨轉速的不同動態偏轉,同時也以數字顯示出具體的轉速值;
轉速表上方顯示的是一些安全警告,比如車門未關好、未系安全帶等,這些黃色小圖標在汽車正常狀態時不會顯示出來,只有當狀況發生時,比如有人坐上座位又沒有系安全帶,這時未系安全帶的警告圖標就會顯示[6];
右上角顯示的是油量,指針會隨油量的多少而偏轉;
左上角顯示的是冷卻水溫度,指針隨水溫的變換而偏轉;
中間方形模塊顯示的是汽車各種車燈的工作情況,包括遠光燈、近光燈、霧燈和轉向燈等,各車燈點亮后會同時在儀表盤上顯示出來;
車燈右方顯示的是汽車擋位,紅色顯示的就是當前汽車所運行的擋位。
車燈左方顯示的是汽車的品牌名稱;
車燈下方顯示的是時間和單次里程表,以數字式的形式顯示當前系統時間,單次里程表可以進行清零操作。
本文設計的儀表盤是一種較新的汽車儀表概念,逐步向“綜合信息系統”方向發展,其特征是以液晶顯示為基礎,趨向于計算機數據處理和綜合信息傳遞及顯示的主節點。即汽車儀表作為汽車綜合信息顯示中心,不再僅僅是一個顯示信息的工具,還是一個會分析、處理信息并控制執行的系統。并在儀表系統中成功地應用了S3C2410微處理器和嵌入式Linux系統,ARM處理器的使用,使系統的整體性能有了質的飛躍;嵌入式Linux系統的引入,對系統的軟件設計和功能模塊的添加/裁剪,提供了最大的方便。眼下開放式結構正處于發展階段中,這種結構在整個汽車壽命期內都可以靈活地進行功能組合,并方便進行功能擴展,完善系統。