1硬件平臺
1.1工作原理
紅外觸摸屏主要基于在屏幕四邊放置紅外發(fā)射管和紅外接收管,。本系統(tǒng)中的微處理器控制驅(qū)動電路依次接通紅外發(fā)射管并檢查相應(yīng)的紅外接收管,從而形成橫豎交叉的紅外線陣列,,并得到定位的信息,。本文通過ARM7對移位鎖存器的控制來對紅外發(fā)射管進(jìn)行逐個掃描,同時,,ARM7通過地址線和數(shù)據(jù)線來尋址每個相應(yīng)的紅外接收管,,從而得到相應(yīng)的光通量值。其控制原理如圖1所示,。
本系統(tǒng)中的移位鎖存器具有移位和存儲兩個時鐘,。ARM7通過IO口控制移位鎖存器的這兩個時鐘以及數(shù)據(jù)輸入端。通過數(shù)據(jù)輸入端將一個脈沖寫入移位寄存器后,,在移位時鐘的上升沿即可將寫入的數(shù)據(jù)移人寄存器,,并在存儲時鐘的上升沿將數(shù)據(jù)置入鎖存器中。利用移位鎖存器的這一特點,,可在移位時鐘的上升沿將脈沖移至發(fā)射管,,并在存儲時鐘的上升沿點亮發(fā)射管,。寫入的脈沖會隨移位時鐘上升沿的到來不斷的移位,直到從輸出端移出,。將第一個移位鎖存器的輸出端與下一級的輸入端相連,,可將寫入的脈沖移人下一級。因此,,通過移位鎖存器的級聯(lián)可實現(xiàn)ARM7對更多的發(fā)射管的驅(qū)動。結(jié)合以上特點,,即可將發(fā)射管逐個點亮,。
在發(fā)射管被點亮的時刻,ARM7將通過地址線尋址與發(fā)射管位置上相對應(yīng)的接收管,,并將接收感應(yīng)到的光通量通過放大器和AD轉(zhuǎn)換器放大并轉(zhuǎn)換成8位數(shù)據(jù),,再通過數(shù)據(jù)線傳送給ARM7進(jìn)行處理。通過這樣處理可使發(fā)射管與接收管一一對應(yīng),,從而為確定觸摸位置奠定基礎(chǔ),。紅外觸摸屏的具體工作流程如圖2所示。
1.2高分辨率的實現(xiàn)
早期的紅外觸摸屏的分辨率直接由紅外對管數(shù)決定,,對于接收管來說,,只有接收到和沒有接收到信號兩種情況,觸摸分辨率就等于屏的物理分辨率,。因此其觸摸屏的分辨率比較低,。
但如果將接收的信號強(qiáng)度進(jìn)行量化分級,那么,,對于接收的信號,,不僅要判斷是否被阻擋,還要判斷出被阻擋的程度,,觸摸物的不同位置將決定是否有接收信號且接收信號的強(qiáng)度也有所不同,,因此觸摸物的位置與接收的紅外信號強(qiáng)度有直接的對應(yīng)關(guān)系,即使觸摸物移動非常小的距離也會導(dǎo)致信號強(qiáng)度發(fā)生改變,,從而可以得到極高的分辨率,。該情況下的觸摸屏分辨率主要由紅外對管數(shù)和模數(shù)轉(zhuǎn)換精度決定,其觸摸屏分辨率為紅外對管數(shù)與單對紅外管能實現(xiàn)的分辨率的乘積,。觸摸屏坐標(biāo)由紅外管的物理坐標(biāo)和觸摸點在相應(yīng)管中的坐標(biāo)共同決定,。基于以上原理,,可以將每次采集到的紅外接收管的光通量進(jìn)行256級量化,,這樣,得到的最小分辨率就是接收管的寬度/256,,從而大大提高了紅外觸摸屏的分辨率,,該方法可以達(dá)到2046×768的精度,。
1.3觸摸位置的計算
為了得到準(zhǔn)確的觸摸位置,在計算觸摸位置時必須排除周圍環(huán)境光的干擾,。為此,,本文通過確定每對管子的域值來作為判斷是否有手指觸摸的依據(jù)。該域值的確定可通過對每對管子的“0”態(tài)和“1”態(tài)時的數(shù)據(jù)采樣來實現(xiàn),。 “0”態(tài),即將所有的發(fā)射管進(jìn)行一次清零,,此時的發(fā)射管都為熄滅狀態(tài),,這樣,采樣得到的就是接收管接收到的周圍光的光通量,;“1”態(tài),,即將所有的發(fā)射管逐個點亮,此時的發(fā)射管在某一時刻只有一只被點亮,,采樣得到的是接收管接收對應(yīng)發(fā)射管及周圍光的光通量,。
本文中的紅外觸摸屏的觸摸位置的計算主要是通過遮擋時與未遮擋時的光強(qiáng)比來得到的。在判斷觸摸位置時,,可以先確定被遮擋的管子,,計算得到被遮擋的大致位置。若被遮擋的管子為第N個管子,,這個被遮擋的大致位置為Ld,,則有:
Ld=(N-1)×管子的寬度
由于手指遮擋時有一定的區(qū)域,所以遮擋時有兩種可能:其一是在被確定的管子的前面,;其二是在被確定的管子處,。圖3所示為手指遮擋示意圖。
為了精確計算,,需要計算這兩種情況下位置的偏移量△L1和△L2,。則有:
其中,L為第N個管子被遮擋時的位置,?!鱈1為手指在被確定的管子的前面時的偏移量?!鱈2為手指在被確定的管子處時的偏移量,,XN為掃描時采樣第N個管子接收到的數(shù)據(jù),XNmax為“1”態(tài)時采樣第N個管子接收到的數(shù)據(jù).XNmin為“0”態(tài)時采樣第N個管子接收到的數(shù)據(jù),。
2鼠標(biāo)驅(qū)動
ARM7作為硬件上的核心控制芯片,,只能進(jìn)行采集以得到觸摸位置信息,而無法實現(xiàn)相應(yīng)的鼠標(biāo)動作,。所以,,必須通過主機(jī)端的驅(qū)動程序來實現(xiàn),。本文中的驅(qū)動程序可通過VC++編程來實現(xiàn)串口通信和鼠標(biāo)動作,從而完成軟件結(jié)合硬件對鼠標(biāo)的驅(qū)動,。
2.1 串口通信
為了使主機(jī)能夠接收ARM7通過串口傳送的觸摸位置,,可利用Microsoft公司提供的ActiveX控件Microsoft Communications Control,并通過VC++編程來實現(xiàn)串口通信,。通過在該控件中的設(shè)置可指定通信串口號,,同時可設(shè)置波特率、校驗位,、停止位,、數(shù)據(jù)位等通信參數(shù),以及接收OnComm事件門限值,。其具體代碼如下:
由于傳統(tǒng)的鼠標(biāo)是一種相對定位系統(tǒng),它只和前一次鼠標(biāo)的位置坐標(biāo)有關(guān),。而觸摸屏則是一種絕對坐標(biāo)系,,與相對定位系統(tǒng)有著本質(zhì)的區(qū)別。因此,,本文通過主機(jī)從串口接收到的觸摸點坐標(biāo)數(shù)據(jù)并進(jìn)行轉(zhuǎn)換來得到屏幕坐標(biāo),,即觸摸屏的坐標(biāo)范圍為(0,0)到(2048,,768),。而ARM7只能通過串口發(fā)送字節(jié),且只能發(fā)送小于256的數(shù)據(jù),,所以很難實現(xiàn)直接傳輸,。因此,在數(shù)據(jù)發(fā)送時,,應(yīng)將采集得到的位置數(shù)據(jù)的每個位上的數(shù)分別進(jìn)行傳送,。與此同時,主機(jī)端從串口接收緩沖區(qū)并取出數(shù)據(jù),,然后在驅(qū)動程序中將這些數(shù)據(jù)重新組合起來以得到觸摸位置信息,。另外,為了實現(xiàn)鼠標(biāo)的不同動作,,也應(yīng)分別發(fā)送不同的控制字,。每次串口通信的數(shù)據(jù)格式如下:
其中,X為觸摸位置的橫坐標(biāo),,X1為X百位上的數(shù),,X2為X十位上的數(shù),X3為X個位上的數(shù),;Y為觸摸位置的縱坐標(biāo),,Y1為Y百位上的數(shù),,Y2為Y十位上的數(shù),Y3為Y個位上的數(shù),。
由于剛接收的數(shù)據(jù)為VARIANT類型,,故需將其轉(zhuǎn)化為int型變量來進(jìn)行以上坐標(biāo)的組合。該轉(zhuǎn)換過程是先將VARIANT類型變量賦值COle-SafeArray類,,再利用COleSafeArray類中的成員函數(shù)將數(shù)據(jù)寫入BYTE型數(shù)組中,,最后將BYTE型數(shù)據(jù)轉(zhuǎn)化為int型。
2.2鼠標(biāo)動作
鼠標(biāo)動作在觸摸屏的應(yīng)用中甚為重要,。它主要包括鼠標(biāo)的定位,,鼠標(biāo)的移動,鼠標(biāo)的左鍵單擊和雙擊,,以及鼠標(biāo)的右鍵單擊,。在VC++編程中,可通過使用API函數(shù)中的mouse_event來模擬鼠標(biāo)事件,,以實現(xiàn)以上的鼠標(biāo)動作,。其實現(xiàn)代碼如下:
定位:SetCursorPos(X,Y),;
左鍵單擊:mouse_event((MOUSEEVENTF_LEFYDOWN,,0,0,,0,,0);
mouse_event(MOUSEEVENTF_LEFTUP,,0,,0,0,,0),;
在模擬鼠標(biāo)動作的同時,一個很重要的處理步驟是屏蔽采集數(shù)據(jù)時受到的干擾,。另外,,使鼠標(biāo)運(yùn)動平滑化也不容忽視。
圖4是通過matlab軟件對鼠標(biāo)運(yùn)動過程中的各坐標(biāo)繪制的曲線圖,。通過曲線可以看到,,硬件上的干擾會造成采集的坐標(biāo)數(shù)據(jù)出現(xiàn)突變點,曲線上有很多毛刺,。這也合理的解釋了鼠標(biāo)在運(yùn)動過程會出現(xiàn)回跳和抖動,,不能平滑運(yùn)動的現(xiàn)象,因此必須屏蔽這些干擾,。
針對突變點,,本文采用了比較法來克服,。所謂比較法,就是將后一次接收到的坐標(biāo)數(shù)據(jù)與前一次接收到的坐標(biāo)數(shù)據(jù)做比較,,并設(shè)置一定的域值范圍,。當(dāng)比較得到的絕對值在該域值范圍內(nèi)時,則認(rèn)為所作的動作是有效的,。與此同時,,還需比較前后數(shù)據(jù)的變化趨勢是否一致,只有當(dāng)數(shù)據(jù)的變化趨勢一致,,才認(rèn)為鼠標(biāo)的移動是有效的,。
針對毛刺,本文采用平均法和比較法來克服,。所謂平均法,,是將從第N組到第2N組的N組數(shù)據(jù)進(jìn)行平均,然后將其作為第N組數(shù)據(jù),。這樣可以有效的減少毛刺干擾,。另外,也可以對前后兩組數(shù)據(jù)進(jìn)行比較,,只有當(dāng)比較得到的絕對值大于觸摸屏的最小分辨率時,才認(rèn)為鼠標(biāo)發(fā)生移動,,否則原地不動,。通過這樣的處理,可以解決鼠標(biāo)抖動的問題,。經(jīng)過處理后的鼠標(biāo)運(yùn)動曲線如圖5所示,。
3結(jié)束語
本文介紹了基于ARM7控制器和VC實現(xiàn)的紅外觸摸屏設(shè)計方案,該方案以ARM7作為硬件的核心控制芯片,,并通過其利用IO口對移位鎖存器的控制來實現(xiàn)對發(fā)射管的驅(qū)動,,利用地址線和數(shù)據(jù)線來實現(xiàn)對接收管的尋址和采樣,以形成紅外定位陣列,,從而從硬件上完成了位置數(shù)據(jù)的采集,。該方法可實現(xiàn)2046×768的高分辨率。而在軟件上,,通過VC++編程則可實現(xiàn)主機(jī)端的串口通信,,模擬鼠標(biāo)動作,并結(jié)合比較法和平均法對鼠標(biāo)運(yùn)動進(jìn)行平滑化處理,。