《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > 通過ADS7846在PDA上實(shí)現(xiàn)個(gè)性化書法輸入

通過ADS7846在PDA上實(shí)現(xiàn)個(gè)性化書法輸入

2008-09-05
作者:倪天龍1, 鄧洪波2, 金連文2

  摘 要: 目前,在嵌入式系統(tǒng)中通過觸摸屏寫出的文字,筆劃粗細(xì)都是相同的,字跡顯得僵硬,不如毛筆字或鋼筆字瀟灑大方且風(fēng)格多樣。提出了一種適用于PDA及其它嵌入式設(shè)備的低成本、高速度、簡(jiǎn)單可行的解決方法,使得在觸摸屏上書寫時(shí),LCD屏上能顯現(xiàn)出如同毛筆字或鋼筆字的傳統(tǒng)書法特色的文字,筆劃粗細(xì)疏密有致,字跡親切自然,同時(shí)也能顯現(xiàn)出書寫人筆跡的個(gè)性風(fēng)格。
  關(guān)鍵詞: ADS7846 書法 MC9328MX1 PDA 嵌入式系統(tǒng)


  書法藝術(shù)是中國(guó)傳統(tǒng)文化的瑰寶。如果用筆尖或指尖在觸摸屏上揮灑自如寫字,LCD上能顯示出猶如用毛筆或鋼筆書寫時(shí)的書法效果,并能顯現(xiàn)出書寫人獨(dú)特個(gè)性的雋秀筆跡,那么就會(huì)使人體會(huì)到淋漓盡致的書法藝術(shù)。但現(xiàn)有的PDA(Personal Digital Assistant)通過觸摸屏畫出線條,顯示屏上顯示出的線條粗細(xì)都是相同的,無(wú)法寫出筆劃粗細(xì)相間的文字,也就無(wú)法模擬出毛筆或鋼筆書寫時(shí)筆鋒的效果。為彌補(bǔ)以上不足,筆者采用能采樣觸點(diǎn)壓力的ADS7846觸摸屏控制器" title="觸摸屏控制器">觸摸屏控制器[1],編寫了采樣觸點(diǎn)坐標(biāo)值和壓力值的驅(qū)動(dòng)程序,實(shí)現(xiàn)了通過觸摸屏輸入,在液晶顯示器上顯示書法出良好的效果。就象手中拿著毛筆或鋼筆在觸摸屏上寫字一樣,無(wú)論是行書、草書、隸書還是楷書,都能顯示出令人滿意的效果,并且完全保留了書寫人的字跡特點(diǎn)。
1 ADS7846觸摸屏控制器原理和功能概述
  基于四線電阻式觸摸屏的輸入系統(tǒng)由觸摸屏、觸摸屏控制器、微控制器" title="微控制器">微控制器及其相應(yīng)軟件構(gòu)成。其中,觸摸屏控制器相當(dāng)于觸摸屏與微控制器之間的接口。觸摸屏體是一個(gè)四層的復(fù)合薄膜,附著在顯示器表面與顯示器配合使用。復(fù)合薄膜的最下層是玻璃基層,最上層是光滑防刮的塑料層,中間為兩層透明導(dǎo)電涂層。每一導(dǎo)電層為觸摸屏的一個(gè)工作面,每個(gè)工作面的兩端各涂有一條銀膠,稱為該工作面的一對(duì)電極,分別稱為X“電極對(duì)”和Y“電極對(duì)”。當(dāng)觸摸屏控制器在X“電極對(duì)”上施加一確定的電壓,而Y“電極對(duì)”上不加電壓時(shí),X“電極對(duì)”所在的工作面上就會(huì)形成均勻連續(xù)的平行電場(chǎng)。當(dāng)用手指觸及觸摸屏表面時(shí),觸點(diǎn)處的電壓反映了觸點(diǎn)在X 工作面上的位置,將該電壓通過Y+( 或Y-)電極引到觸摸屏控制器,并經(jīng)過A/D" title="A/D">A/D 轉(zhuǎn)換,便可得到觸點(diǎn)電壓的數(shù)字量" title="數(shù)字量">數(shù)字量,即X坐標(biāo)。同理,在Y“電極對(duì)”上施加電壓,以X+(或X-)電極為測(cè)量電極,便可測(cè)得Y坐標(biāo)。微控制器根據(jù)觸點(diǎn)坐標(biāo)位置以及對(duì)應(yīng)坐標(biāo)位置上顯示的內(nèi)容,便可得知觸摸者的意圖。
  ADS7846是Burr-Brown公司生產(chǎn)的一種四線式觸摸屏控制器,在與觸摸屏連用時(shí),一旦筆尖或指尖點(diǎn)觸在觸摸屏上,便可迅速得到該點(diǎn)的位置信號(hào),從而達(dá)到在觸摸屏表面尋址的目的。ADS7846是典型的逐步逼近寄存器型A/D變換器,包含了取樣/保持功能。ADS7846與其前代產(chǎn)品ADS7843相比,增加了片內(nèi)溫度測(cè)量、觸摸壓力測(cè)量" title="壓力測(cè)量">壓力測(cè)量、外模擬量測(cè)量和電池電壓測(cè)量四個(gè)功能。
  ADS7846的核心部件是一個(gè)具有采樣和保持功能的12位逐次逼近式A/D轉(zhuǎn)換器。內(nèi)部的六選一模擬多路開關(guān)根據(jù)微控制器送來(lái)的命令字選擇六個(gè)模擬量:X+、Y+、Y-、VBAT(電池電壓)、TEMP(溫度)和AUXIN(外模擬量)之一送入A/D轉(zhuǎn)換器,轉(zhuǎn)換后通過SPI接口將數(shù)字量送入微控制器。ADS7846 還設(shè)置有觸摸識(shí)別電路,當(dāng)檢測(cè)到有觸摸時(shí),該電路輸出一個(gè)低電平信號(hào),稱為PENIRQ#(筆中斷),ADS7846以這個(gè)信號(hào)向微控制器提出測(cè)量觸點(diǎn)坐標(biāo)的中斷請(qǐng)求。觸點(diǎn)坐標(biāo)的公式如下:
  
  式中,X和Y分別為觸點(diǎn)在X工作面和Y工作面上產(chǎn)生的電壓的數(shù)字量的測(cè)量值,可通過采樣得到;(X,Y)反映了觸點(diǎn)在觸摸屏上的坐標(biāo);XMIX、YMIN、XMAX和YMAX分別為觸摸屏上最小和最大坐標(biāo)點(diǎn)在X工作面和Y工作面上產(chǎn)生的電壓的數(shù)字量的實(shí)際測(cè)量值, 它們是常量,可通過測(cè)量得到;(XMIN,YMIN)和(XMAX,YMAX)反映了觸摸屏上最小、最大坐標(biāo)點(diǎn)的坐標(biāo);w和H分別是LCD顯示屏X軸和Y軸上的象素點(diǎn)總數(shù);(X1,Y1) 為觸點(diǎn)映射到LCD顯示屏上的像素點(diǎn)坐標(biāo)。
  觸摸壓力測(cè)量是指對(duì)指尖或筆尖觸及觸摸屏?xí)r產(chǎn)生的壓力值進(jìn)行測(cè)量。觸摸壓力不是直接測(cè)出來(lái)的,而是轉(zhuǎn)換為測(cè)量觸點(diǎn)處X工作面和Y工作面之間的接觸電阻的大小來(lái)完成的。Rtouch的公式如下:
  
  式中,Rtouch表示接觸電阻;Rx是X+與X-兩電極間的總電阻;Z1和Z2是觸摸屏的內(nèi)部參數(shù),反映觸點(diǎn)與X工作面和Y工作面間的關(guān)系。Z1和Z2兩個(gè)參數(shù)及X的值可通過ADS7846提供的指令采樣得到。而Rx并不需要去測(cè)量,因?yàn)楦鱾€(gè)觸摸屏的這個(gè)參數(shù)并不一樣,但在同一個(gè)觸摸屏上它卻是個(gè)定值,每個(gè)點(diǎn)的Rtouch都要乘以這個(gè)定值Rx,所以這個(gè)參數(shù)可以不考慮。所得到的Rtouch值的大小反應(yīng)了測(cè)量觸點(diǎn)壓力的大小。Rtouch越大,壓力越小,可以通過實(shí)驗(yàn)測(cè)出不同壓力的Rtouch值。如果發(fā)現(xiàn)壓力值分布范圍太寬,可以給Rtouch除以一個(gè)合適的參數(shù);如果發(fā)現(xiàn)壓力值分布太窄,可以給Rtouch乘以一個(gè)合適的參數(shù)。筆者針對(duì)自己的觸摸屏,通過試驗(yàn)發(fā)現(xiàn)用
  
  比較合適,不同的壓力與Rtouch的比值分布在80~170之間,這樣就有足夠的間隔來(lái)把壓力劃分為不同的等級(jí)。
2 設(shè)計(jì)原理與具體實(shí)現(xiàn)
2.1 設(shè)計(jì)思路

  微處理器首先利用SPI總線通過ADS7846采樣到筆尖在觸摸屏上的觸點(diǎn)坐標(biāo)值及Z1值和Z2值;然后通過式(1)和式(2)計(jì)算出映射到LCD屏上的坐標(biāo)值,用式(4)計(jì)算出Rtouch值;再利用GUI提供的API函數(shù)在LCD上畫一條線段把前一個(gè)觸點(diǎn)和當(dāng)前觸點(diǎn)連起來(lái);最后在這條線段的兩邊擴(kuò)展平行線,平行線的數(shù)量越多,這條線段越粗。平行線的數(shù)量由當(dāng)前觸點(diǎn)Rtouch的大小決定,即壓力越大,線段越粗。這樣就模擬出了用毛筆或鋼筆書寫時(shí)筆鋒游轉(zhuǎn)的效果。
2.2 電路設(shè)計(jì)
  筆者以MOTOROLA公司的DRAGONBALL(龍珠)系列MC9328MX1(ARM920T)作為硬件平臺(tái)[2],利用MC9328MX1提供的SPI總線對(duì)ADS7846進(jìn)行控制和數(shù)據(jù)傳輸。接口示意圖如圖1所示。


  由圖1可以看出,ADS7846與其前代產(chǎn)品ADS7843的接口電路完全相同。如果需要在原來(lái)使用ADS7843的設(shè)備上增加片內(nèi)溫度測(cè)量、觸摸壓力測(cè)量、外模擬量測(cè)量和電池電壓測(cè)量四個(gè)功能,只需將板上的ADS7843替換為ADS7846,然后改寫驅(qū)動(dòng)程序即可。因?yàn)锳DS7846與ADS7843的引腳封裝完全一致,所以不用改動(dòng)電路,這使更換工作非常方便。
2.3 驅(qū)動(dòng)程序
  在應(yīng)用中,采用差動(dòng)參考電壓方式測(cè)量坐標(biāo)模擬量,測(cè)量命令字的設(shè)置和模擬量選擇參見表1 和表2。


  有關(guān)ADS7843驅(qū)動(dòng)程序的資料很多,源代碼也能很容易地找到。具有觸摸壓力測(cè)量功能的ADS7846的驅(qū)動(dòng)程序,只需在原ADS7843驅(qū)動(dòng)程序的合適位置加入采樣Z1參數(shù)和Z2參數(shù)的代碼就行了[4]。這部分的代碼很簡(jiǎn)單,添加也很容易。筆者在MC9328MX1上實(shí)現(xiàn)的源代碼如下:
  spi_tx_data(0xB0); //輸入采樣Z1值的命令//
  z1_upper = REG_SPI_RXDATA;
  spi_tx_data(0x00);
  z1_upper = REG_SPI_RXDATA;
  spi_tx_data(0xc0); //輸入采樣Z2值的命令//
  z1_lower = REG_SPI_RXDATA;
  spi_tx_data(0x00);
  z2_upper = REG_SPI_RXDATA;
  spi_tx_data(0x00);
  z2_lower = REG_SPI_RXDATA;
  spi_tx_data(0xD0); //輸入采樣Y值的命令//
  x_upper = REG_SPI_RXDATA;
  spi_tx_data(0x00);
  x_upper = REG_SPI_RXDATA;
  spi_tx_data(0x90); //輸入采樣X值的命令//
  x_lower = REG_SPI_RXDATA;
  spi_tx_data(0x00);
  y_upper = REG_SPI_RXDATA;
  spi_tx_data(0x00);
  y_lower = REG_SPI_RXDATA;
  然后,計(jì)算出X,Y,Z1和Z2的值:
  X=(((x_upper<<5) & 0xFE0) | ((x_lower>>3) & 0x1F));
  Y=(((y_upper<<5) & 0xFE0) | ((y_lower>>3) & 0x1F));
  Z1=(((z1_upper<<5) & 0xFE0) | ((z1_lower>>3) & 0x1F));
  Z2=(((z2_upper<<5) & 0xFE0) | ((z2_lower>>3) & 0x1F));
  此外,還應(yīng)注意觸摸抖動(dòng)和連擊問題??梢圆捎醚舆t測(cè)量法來(lái)解決,即在接收到觸摸屏筆中斷時(shí)延遲一段時(shí)間(抖動(dòng)延時(shí)30ms)后再測(cè)量,可消除抖動(dòng);測(cè)量完后再次延遲一段時(shí)間(連擊延時(shí)300ms)后打開筆中斷,可避免連擊現(xiàn)象的出現(xiàn)。驅(qū)動(dòng)程序主要包括初始化SPI寄存器、可編程定時(shí)器中斷和筆中斷。在筆中斷中主要完成關(guān)筆中斷、設(shè)置筆中斷標(biāo)志和將定時(shí)計(jì)數(shù)值設(shè)置為抖動(dòng)延時(shí),在定時(shí)器中斷程序中主要實(shí)現(xiàn)坐標(biāo)值的測(cè)量、延時(shí)功能。
2.4 應(yīng)用程序
  一塊觸摸屏中并不一定每個(gè)點(diǎn)對(duì)壓力的感應(yīng)都很準(zhǔn)確。另外筆尖在觸摸屏上書寫時(shí),也會(huì)有抖動(dòng)和干擾。這就造成了用同樣的力在觸摸屏上畫一條線,顯現(xiàn)時(shí)可能出現(xiàn)粗細(xì)不一樣的現(xiàn)象。針對(duì)這個(gè)現(xiàn)象,在應(yīng)用程序中適當(dāng)做一些平滑處理。筆者采用算術(shù)平均法來(lái)平滑曲線,即如果發(fā)現(xiàn)采樣點(diǎn)的壓力值比前一個(gè)點(diǎn)大或小很多,則對(duì)該點(diǎn)和剛剛輸入的前幾個(gè)點(diǎn)壓力值做算術(shù)平均,得到的值作為該點(diǎn)正確的壓力值。但要注意,用來(lái)做平均的點(diǎn)不能取得太少,否則平滑作用不明顯;也不能取得太多,否則線條粗細(xì)變化太慢,模擬不出書法效果。通過實(shí)驗(yàn),發(fā)現(xiàn)取前三個(gè)點(diǎn)比較合適。做算術(shù)平均的源程序如下:
  if(pressure-oldpressure1>50|| oldpressure1-pressure >50)  //如果發(fā)現(xiàn)觸點(diǎn)的采樣壓力值比前一個(gè)點(diǎn)大或小很多//
  pressure= (pressure+ oldpressure1+ oldpressure2+ oldpressure3)>>2;   //則對(duì)該點(diǎn)和前三個(gè)觸點(diǎn)的壓力值做算術(shù)平均,并把結(jié)果作為該點(diǎn)正確的壓力值//
3 實(shí)驗(yàn)結(jié)果
  經(jīng)過實(shí)驗(yàn),在LCD上顯示出的結(jié)果如圖2所示。


  圖2(a)為使用ADS7843,未采樣觸點(diǎn)壓力值在LCD上的顯示效果;圖2(b)為使用ADS7846,采樣觸點(diǎn)壓力值后,根據(jù)壓力大小在LCD上顯示出不同粗細(xì)曲線的效果。
  如果使用多灰度級(jí)的LCD顯示屏,還可以利用觸點(diǎn)的壓力大小(Rtouch)和筆尖在屏上接觸的時(shí)間這兩個(gè)參數(shù),使畫出曲線的顏色呈現(xiàn)出不同深淺。即觸點(diǎn)的壓力越大、筆尖在屏上相關(guān)區(qū)域接觸的時(shí)間越長(zhǎng),這個(gè)區(qū)域顯現(xiàn)的顏色就越深。具體調(diào)節(jié)公式如下:
  
  式中,graylever為L(zhǎng)CD上該點(diǎn)將要顯現(xiàn)出的灰度值,(X,Y)為該點(diǎn)坐標(biāo),(Xoldtime,Yoldtime)為同一筆劃中一定時(shí)間間隔前觸點(diǎn)的坐標(biāo)。筆者在開發(fā)過程中,取時(shí)間間隔為100ms。A和B都是用來(lái)調(diào)整graylever變化范圍的常量,可以通過實(shí)驗(yàn)根據(jù)具體情況設(shè)定。
  這樣,用指尖在觸摸屏上作畫時(shí),LCD上也會(huì)顯現(xiàn)出素描和國(guó)畫的效果。
  如果使用彩色LCD,可以結(jié)合GUI在LCD上創(chuàng)建一個(gè)供用戶選擇不同色彩的窗口,用戶就可以挑選合適的顏色在觸摸屏上畫圖,顯示屏上也將會(huì)呈現(xiàn)色彩繽紛的作品。因此,本文介紹的方法將會(huì)為PDA及相關(guān)行業(yè)開拓出全新的功能,帶來(lái)更加明媚的春天。
  本文提出的方法已在MOTOROLA公司的DRAGONBALL(龍珠)系列MX1(ARM920T)上實(shí)現(xiàn)。該設(shè)計(jì)使得在PDA的觸摸屏上寫字時(shí),能顯示出毛筆或鋼筆寫出的書法效果,同時(shí)也顯現(xiàn)出了書寫人筆跡的個(gè)性風(fēng)格,并具有反應(yīng)速度快、實(shí)現(xiàn)成本低、程序編寫特別簡(jiǎn)單等突出特點(diǎn)。相信此方法將會(huì)在嵌入式領(lǐng)域中得到廣泛的應(yīng)用。
參考文獻(xiàn)
1 王 暉,馬鳴錦.基于觸摸屏控制器ADS7846的觸點(diǎn)坐標(biāo)和壓力的測(cè)量與計(jì)算.電子設(shè)計(jì)與應(yīng)用,2003;(9):78~81
2 王祖林.新一代嵌入式微處理器龍珠i.MX結(jié)構(gòu)及應(yīng)用基礎(chǔ).北京:北京航空航天大學(xué)出版社,2004
3 劉燕英. 嵌入式Linux的實(shí)現(xiàn)及應(yīng)用. 2001嵌入式系統(tǒng)及單片機(jī)國(guó)際學(xué)術(shù)流會(huì)論文集(沈緒榜主編).北京:航空航天大學(xué)出版社,2001:230~233
4 ALESSANDRO RUBINI等著,魏永明等譯.LINUX設(shè)備驅(qū)動(dòng)程序. 北京:中國(guó)電力出版社, 2002:65~110

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。