• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于S3C2410的觸摸屏手寫應(yīng)用程序設(shè)計

      2014-09-07 03:32:36劉作棟
      湖北理工學院學報 2014年1期
      關(guān)鍵詞:內(nèi)核顯示屏觸摸屏

      高 芹,劉作棟

      (湖北理工學院 計算機學院,湖北 黃石 435003)

      基于S3C2410的觸摸屏手寫應(yīng)用程序設(shè)計

      高 芹,劉作棟

      (湖北理工學院 計算機學院,湖北 黃石 435003)

      觸摸屏作為一種重要的電子輸入設(shè)備,在各個領(lǐng)域都備受青睞。觸摸屏以其簡單、自然的人機交互方式,已廣泛應(yīng)用于工業(yè)過程控制、公共信息咨詢、金融證券交易市場、家用電器等眾多領(lǐng)域。基于S3C2410的電阻式觸摸屏應(yīng)用,介紹了觸摸屏的原理及結(jié)構(gòu)以及在嵌入式系統(tǒng)中的應(yīng)用、嵌入式文件系統(tǒng)的配置、LCD和觸摸屏的配置;采用了觸摸屏3點校準方法,并利用Linux中的Framebuffer設(shè)備實現(xiàn)了在觸摸屏上追隨手指顯示軌跡的具體算法。

      嵌入式;LCD;觸摸屏;幀緩沖;手寫

      由于觸摸屏技術(shù)的不斷改進與革新,越來越多的電子產(chǎn)品采用觸摸屏作為輸入設(shè)備,用戶的交互性有了質(zhì)的飛躍。目前國內(nèi)外的觸摸屏控制方式越來越趨向于智能化,觸摸屏觸摸實現(xiàn)技術(shù)多樣,主要有矢量壓力傳感器技術(shù)觸摸屏、電阻感應(yīng)觸摸屏、紅外線觸摸屏、電容感應(yīng)觸摸屏和表面聲波觸摸屏。對于產(chǎn)品的設(shè)計者來說,設(shè)計產(chǎn)品更加靈活,更容易推出富有個性的產(chǎn)品。

      本設(shè)計采用嵌入式Linux操作系統(tǒng),將基于S3C2410處理器觸摸屏作為硬件設(shè)計平臺。觸摸屏選用4線電阻式觸摸屏,當觸摸點接觸到屏幕時,它在X、Y方向產(chǎn)生模擬信號,通過S3C2410的A/D轉(zhuǎn)換器轉(zhuǎn)化成數(shù)字信號送至CPU處理,從而實現(xiàn)觸摸屏功能[1-2]。

      本設(shè)計軟件平臺主要由Bootloader、操作系統(tǒng)、文件系統(tǒng)、應(yīng)用程序、驅(qū)動程序等組成。在觸摸屏驅(qū)動設(shè)計上,設(shè)計基于Linux S3C2410平臺的觸摸屏驅(qū)動管理,針對觸摸屏的點擊獲得脈沖電壓值并通過A/D轉(zhuǎn)化后讀取該值,根據(jù)相關(guān)校準算法將該值轉(zhuǎn)換成顯示屏較為精確的坐標。利用Linux的Framebuffer原理在觸摸屏獲得其精確坐標后實現(xiàn)了追隨手指軌跡的幾何圖形的描繪。

      1 設(shè)計平臺構(gòu)建

      1.1軟件平臺

      1)Ramdisk文件系統(tǒng)的配置。

      在實現(xiàn)觸摸屏手指追隨的Linux操作系統(tǒng)移植中,使用的Ramdisk 是一個最小的Linux 根文件系統(tǒng)。它是一種基于內(nèi)存的虛擬磁盤技術(shù),采用ext2文件格式,包含了所有Linux 系統(tǒng)在引導(dǎo)和管理時需要的工具。ramdisk.gz是ramdisk文件進行壓縮后的格式。掛載該文件系統(tǒng)的具體操作方法如下[3-4]。

      假設(shè)將ramdisk.gz存放在/home/cvtech/jx2410/root/下面,則操作如下:

      $cd /home/cvtech/jx2410/root/

      $mkdir rd

      $gunzip ramdisk.gz

      經(jīng)過上述操作后,已將ramdisk.gz解壓成ramdisk系統(tǒng)映像文件。

      $mount -o loop ramdisk rd/

      $cd rd/

      其中命令mount的-o參數(shù)loop表示將文件當作硬盤的掛接方式。這樣,rd下面的就是Linux的文件系統(tǒng),此時就可以加入自己的應(yīng)用程序,或者對其中的文件進行修改,修改完成后,使用如下命令重新生成文件系統(tǒng)映像文件:

      $umount rd

      $gzip ramdisk ramdisk.gz

      這樣再用tftp下載到JXARM9-2410實驗箱上,然后運行Linux系統(tǒng)就可以看到程序了。

      2)Linux 2.6.14內(nèi)核的移植。

      獲取Linux源碼后解壓,解壓完成后安裝編譯器;通過修改Makefile,添加對ARM的支持以及編譯器的制定;用make menuconfig命令進入系統(tǒng)配置菜單,下載配置文件s3c2410_defconfig,保存退出后,進行編譯。編譯通過后,在目錄arch/arm/boot/下,得到一個新的內(nèi)核文件zImage,將內(nèi)核下載到ARM9S3C2410實驗箱中[5-6]。

      1.2硬件平臺

      1) 觸摸屏的配置。

      S3C2410帶有1個電阻式觸摸屏面板、4個外部晶體管和1個外部電壓源。將觸摸屏接口控制和選擇控制信號(nYPON、YMON、nXPON和XMON)以及模擬pad(AIN[7],AIN[5])都連接到觸摸屏面板和X、Y坐標轉(zhuǎn)換外部晶體管。觸摸屏接口包括一個外部晶體控制邏輯和一個帶有中斷發(fā)生器的A/D轉(zhuǎn)換邏輯[7-10]。

      在Linux操作系統(tǒng)中,S3C2410微控制器對應(yīng)的字符型驅(qū)動源文件為s3c2410_ts.c。將該驅(qū)動編譯為模塊后,生成驅(qū)動模塊s3c2410.ko,將該驅(qū)動模塊用insmod插入到內(nèi)核后,自動在Linux的/dev/目錄下創(chuàng)建節(jié)點touchscreen。

      編寫應(yīng)用程序讀取觸摸屏的觸點坐標值及動作信息時,只需利用觸摸屏驅(qū)動程序就可以實現(xiàn),利用open函數(shù)打開觸摸屏設(shè)備,然后用讀函數(shù)read()函數(shù)讀取觸摸屏的按壓信息和對應(yīng)的觸摸屏坐標x,y即可。

      此外,如果要正常使用ARM9 S3C2410實驗箱上的LCD,還需完成如下操作:

      $ cd/home/cvtech/jx2410/linux-2.6.14

      $ make menuconfig

      在Linux配置菜單中,添加Frame buff支持,添加后,保存退出。觸摸屏Framebuffer內(nèi)核加載如圖1所示。

      圖1 觸摸屏Framebuffer內(nèi)核加載

      在程序中,通過下面一段代碼打開觸摸屏:

      if((fd = open("/dev/fb0", O_RDWR)) < 0)

      {perror("fail to open");

      return 0; }

      2)LCD內(nèi)核驅(qū)動配置。

      如果要正常使用ARM9 S3C2410實驗箱上的LCD,還需完成如下操作:

      $cd/home/cvtech/jx2410/linux-2.6.14

      $ make menuconfig

      在Linux配置菜單中,添加LCD支持,Device Drivers->Graphics support->添加后,保存退出。添加LCD Framebuffer支持選項如圖2所示。

      圖2 添加LCD Framebuffer支持選項

      2 詳細設(shè)計

      2.1電阻式觸摸屏取點的實現(xiàn)

      對于4線電阻式觸摸屏,當觸摸點接觸到屏幕時,它在X、Y方向產(chǎn)生模擬信號,通過S3C2410的A/D轉(zhuǎn)化成數(shù)字信號。對觸摸屏的操作除了打開、關(guān)閉設(shè)備外,一般只有讀操作。讀操作將在觸摸屏上讀取到的信息保存在一個結(jié)構(gòu)體變量中。這個結(jié)構(gòu)體定義在Linux源碼的include/asm-arm/linuette_ioctl.h文件中,定義如下:

      //觸摸屏觸點坐標值及動作信息

      typedef struct

      {

      unsigned short pressure; //觸摸筆動作unsigned short x; //觸點x坐標值

      unsigned short y; //觸點y坐標值

      unsigned short pad;

      }TS_EVENT;

      從而獲得其對應(yīng)的數(shù)字信號x和y,關(guān)鍵算法如下:

      while(1)

      { flag=1;

      for(i=0;flag!=0;i++)

      { read (ts, &ts_event, sizeof (TS_EVENT));

      if (ts_event.pressure > 0)

      { x[i]= ts_event.x;

      y[i]= ts_event.y;

      printf("x[%d] =%d, y[%d] = %d ", i,x[i],i,y[i]);

      }}

      else flag=0; }

      但通過以上算法獲得的坐標點是觸摸屏上的坐標點,并不是與LCD完全匹配的坐標點。觸摸屏常和LCD疊加在一起配套使用,構(gòu)成一個矩形的實際物理平面; 而由用戶觸摸的觸摸點集合經(jīng)過 A/D 轉(zhuǎn)換器,得到具體顯示坐標的集合,這個集合構(gòu)成了一個邏輯平面,由于存在誤差,這2個平面并不重合。觸摸屏部分坐標點值如圖3所示。

      圖3 觸摸屏部分坐標點值

      2.2 3點觸摸屏校準算法

      當觸摸屏和LCD的角度存在較小的偏差時,可采用3點校準法對觸摸屏進行校準。校準算法選取3個采樣點來收集校準信息。

      假設(shè)LCD顯示器上的對應(yīng)點可以通過觸摸屏上的點轉(zhuǎn)換得到,只需3個采樣點就可得到校準數(shù)據(jù)。從圖3中這3個采樣點可獲得足夠的信息來建立并求解這一聯(lián)立方程組。

      2.3采用3點校準法校準屏幕坐標

      由于電阻式觸摸屏的電壓成線性均勻分布,因此A/D 轉(zhuǎn)換后的坐標也成線性,基于此原理,下面給出3點校準法的基本思想。

      如果已知觸摸屏上一點A,其觸摸屏坐標為(X,Y),希望相應(yīng)的顯示坐標為(XD,YD),根據(jù)假定的線性關(guān)系,得到:

      XD=AX+BY+C

      YD=DX+EY+F

      為了求得對應(yīng)的6個常數(shù)A、B、C、D、E、F, 需要選取3個采樣點來收集校準信息。取LCD坐標分別為(20,20),(620,20),(620,460)的3個點,可列出以下非冗余方程式:

      XD0=AX0+BY0+C

      XD1=AX1+BY1+C

      XD2=AX2+BY2+C

      YD0=DX0+EY0+F

      YD1=DX1+EY1+F

      YD2=DX2+EY2+F

      通過以上方程式,即可求解出對應(yīng)的6個常數(shù)。

      校準步驟為:

      1)在坐標(XD0,YD0)中畫出第1個目標。

      2)收集從觸摸屏中返回的數(shù)據(jù),并存儲在坐標(X0,Y0)中。

      3)在坐標(XD1,YD1)中畫出第2個目標。

      4)收集從觸摸屏中返回的數(shù)據(jù),并存儲在坐標(X1,Y1)中。

      5)在坐標(XD2,YD2)中畫出第3個目標。

      6)收集從觸摸屏中返回的數(shù)據(jù),并存儲在坐標(X2,Y2)中。

      上述聯(lián)立方程組的未知量已求解出,此處不再推導(dǎo)。直接跳過中間步驟得出最后結(jié)論,將K作為各方程式的公分母,便可得出未知量:

      k=(x0-x2)*(y1-y2)-(x1-x2)*(y0-y2);

      A=((XD0-XD2)*(y1-y2)-(XD1-XD2)*(y0-y2))/k;

      B=((x0-x2)*(XD1-XD2)- (XD1-XD2)*(y0-y2))/k;

      C=(y0*(x2*XD1-x1*XD2)+y1*(x0*XD2-x2*XD0)+y2*(x1*XD0-x0*XD1))/k;

      D=((YD0-YD2)*(y1-y2)-(YD1-YD2)*(y0-y2))/k;

      E=((x0-x2)*(YD1-YD2)-(YD0-YD2)*(x1-x2))/k;

      F=(y0*(x2*YD1-x1*YD2)+y1*(x0*YD2-x2*YD0)+y2*(x1*YD0-x0*YD0))/k;

      根據(jù)概算法思路,可較準確地求出觸摸屏任意點的LCD坐標值。

      2.4鼠標追隨算法實現(xiàn)

      1)Framebuffer原理。

      Framebuffer (幀緩沖)是Linux內(nèi)核的一種圖形設(shè)備驅(qū)動接口,提供了LCD控制器的抽象性描述。它將LCD控制器上的顯存抽象成一種字符設(shè)備,應(yīng)用程序通過定義好的接口可以訪問LCD控制器的顯存,直接對顯示緩沖區(qū)進行read/write操作,而不需要知道底層的任何細節(jié)。

      事實上,幀緩沖只是一塊顯示緩沖區(qū),向這個顯示緩沖區(qū)中寫入特定格式的數(shù)據(jù)就意味著更新顯示屏的輸出。幀緩沖與顯示屏上的點存在著映射關(guān)系,顯示屏上的每個點都與緩沖區(qū)某個特定的位置相關(guān)聯(lián),向幀緩沖設(shè)備寫入數(shù)據(jù)就相當于改變顯示屏顯示的相關(guān)信息[11-13]。

      2)Framebuffer實現(xiàn)畫線。

      在計算映射緩沖區(qū)之前,需要知道固定顯示屏信息和可變顯示屏信息。其中,固定顯示屏信息由硬件和驅(qū)動決定;可變顯示屏信息由硬件的當前狀態(tài)決定。通常在程序中使用ioctl()函數(shù)來查詢幀緩沖設(shè)備信息。需要用到的數(shù)據(jù)結(jié)構(gòu)主要分為以下2種:

      struct fb_var_screeninfo vinfo; //存儲可變顯示屏信息。

      struct fb_fix_screeninfo finfo; //存儲固定顯示屏信息。

      其中,可變顯示屏信息使用FBIOGET_VSCREENINFO通過ioctl()函數(shù)獲得。得到顯示屏相關(guān)信息后,使用內(nèi)存映射(mmap)將幀緩沖設(shè)備中的顯示緩存區(qū)映射到進程中的一段虛擬地址空間,然后通過讀寫這一塊虛擬地址來訪問顯示緩沖區(qū),實現(xiàn)在顯示屏上繪圖畫線等操作。

      幀緩沖基本使用步驟如下:

      1) 計算需要映射的內(nèi)存大小。

      2) 映射內(nèi)存。

      3) 獲取手指觸摸坐標。

      4) 根據(jù)觸摸坐標利用Framebuffer顯示軌跡。

      3 調(diào)試運行

      加載Linux系統(tǒng)完成后,可以執(zhí)行Linux系統(tǒng)命令,驅(qū)動觸摸屏設(shè)備用手指在觸摸屏上劃線并在LCD顯示屏上顯示。

      文件系統(tǒng)加載完成后,掛載nfs文件系統(tǒng),調(diào)試過程如下:

      # mount 192.168.1.180:/tftpboot /mnt/nfs

      # cd /mnt/nfs

      # ./3

      即可在實驗箱上看到實驗結(jié)果。

      在觸摸屏上劃線時,應(yīng)盡量用大一點的力量來畫線,因為本次設(shè)計使用的實驗箱配置的是電阻式觸摸屏,必須用足夠的力量點擊觸摸,才能使電阻式觸摸屏2層導(dǎo)電層完全接觸,從而減小實際畫線位置和LCD顯示畫線位置的誤差。程序執(zhí)行效果圖如圖4所示。

      圖4 程序執(zhí)行效果圖

      4 結(jié)束語

      觸摸屏手指追隨的設(shè)計完成以后,還完成了觸摸屏的校準,但仍然存在一些邊緣誤差,即取得的觸摸屏坐標和LCD的坐標仍然存在較小的偏差。如果采用Ts_lib包自帶的Ts_calibrate來校準觸摸屏,則可進一步準確校準。

      [1] 馬忠梅,祝烈煌,李善平,等.ARM & Linux嵌入式系統(tǒng)教程[M].北京:北京航空航天大學出版社,2008:8-238.

      [2] 潘巨龍,黃寧,姚伏天,等.ARM9嵌入式Linux系統(tǒng)構(gòu)建與應(yīng)用[M].北京:北京航空航天大學出版社,2006:8-156.

      [3] 馬忠梅,徐英慧.ARM嵌入式處理器結(jié)構(gòu)應(yīng)用基礎(chǔ)[M].北京:清華大學出版社,2003:5-182.

      [4] 王丁,閆瑤,張廷宇.觸摸屏校準的一種通用算法[J].自動化技術(shù)與應(yīng)用,2008,27(2):116-118.

      [5] 徐楊,喬衛(wèi)民,趙中.基于AT91RM9200 的觸摸屏驅(qū)動及三點校正算法[J].微計算機信息,2007,2(2):73-74.

      [6] 陸啟帥.基于嵌入式LINUX車載多媒體控制終端設(shè)計[D].宜昌:三峽大學,2007.

      [7] 譚翀.電阻式觸摸屏校準算法的研究與設(shè)計[J].嵌入式系統(tǒng)應(yīng)用,2010,6(2):35-37.

      [8] 吳凌云.基于ARM9的Windows Embedded CE 6.0應(yīng)用開發(fā)[D].云南:云南大學,2011.

      [9] 王永利.基于Android平臺的電阻式觸摸屏校準算法的研究與實現(xiàn)[D].北京:北京交通大學,2012.

      [10] 羅勇剛,夏定純.電阻式觸摸屏的校準與應(yīng)用研究[J].武漢科技學院學報,2007,25(12):47-49.

      [11] 許榮斌,謝瑩,朱永紅.觸摸屏校準常用算法分析[J].工業(yè)控制計算機,2006,19(4):77-79.

      [12] 楊偉鈞,戴青云,張輝,等.基于STC單片機的觸摸屏五點校準算法設(shè)計與實現(xiàn)[J].儀器儀表用戶,2008,15(3):79-81.

      [13] 李玉波,朱自強,郭軍.Linux C編程[M].北京:清華大學出版社,2005:78-79.

      (責任編輯桂堤)

      Design of Application Programming of Touch-screen Handwriting Based on S3C2410

      GaoQin,LiuZuodong

      (School of Computer Science, Hubei Polytechnic University,Huangshi Hubei 435003)

      As a new electronic input device,the touch screen technology has been gained popularity in various fields.Touch screen with its simple,natural human-computer interaction,has been widely used in industrial process control,public information consultation,finance and securities trading market,household appliances and many other fields.This paper describes the application of touchscreen based on S3C2410,introduces the principles and structure of touchscreen,its application in the embedded system and configuration in the embedded file system configuration,LCD and touch screen.Three-point calibration method is expounded and the algorithm is implemented by using framebuffer to realize touchscreen's finger follow based on S3C2410.

      embedded;LCD;touchscreen;framebuffer;finger follow

      2013-09-09

      湖北理工學院校級科研項目(項目編號12xjz41Q);湖北省大學生創(chuàng)新創(chuàng)業(yè)訓練計劃項目(項目編號20130920019)。

      高芹(1980— ),女,講師,碩士。

      10.3969/j.issn.2095-4565.2014.01.010

      TP368.1

      A

      2095-4565(2014)01-0039-05

      猜你喜歡
      內(nèi)核顯示屏觸摸屏
      萬物皆可IP的時代,我們當夯實的IP內(nèi)核是什么?
      一塊布就是一個顯示屏?
      軍事文摘(2022年10期)2022-06-15 02:29:30
      強化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
      PLC和觸摸屏在衛(wèi)生間控制系統(tǒng)的應(yīng)用
      蒼蠅迷戀顯示屏
      基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計
      Linux內(nèi)核mmap保護機制研究
      皮膚“長”出觸摸屏
      未來五年LED顯示屏出貨將保持16%增長
      中國照明(2016年6期)2016-06-15 20:30:14
      基于AT89S52的手勢可控LED滾動顯示屏設(shè)計
      永平县| 手游| 周至县| 霍山县| 乌拉特中旗| 呼图壁县| 天柱县| 高唐县| 大理市| 高雄县| 广州市| 宕昌县| 漠河县| 清远市| 论坛| 乌海市| 诏安县| 丰城市| 阳朔县| 海南省| 武城县| 丰都县| 轮台县| 永修县| 丰都县| 新乡县| 伊吾县| 玉田县| 普兰店市| 疏附县| 佳木斯市| 馆陶县| 甘洛县| 云梦县| 古浪县| 罗定市| 荥经县| 广丰县| 广安市| 西华县| 庆城县|