DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 155|回复: 0
打印 上一主题 下一主题

基于ARM7和VC平台的高分辨率红外触摸屏设计

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-16 18:47:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                      0? 引言
  触摸屏是结合显示器使用的一种透明的绝对定位系统,透明和优良的定位原理是它的技术特征。目前应用在各场合的触摸屏主要有四种:电阻式触摸屏、电容式触摸屏、表面声波触摸屏和红外触摸屏。其中红外触摸屏的视觉效果和定位原理都优于其它触摸屏技术,而且不受电流、电压和静电干扰,可以适宜恶劣的环境条件。但是,与其它三种触摸屏相比,红外触摸屏也存在分辨率低的问题,这一点严重影响了红外触摸屏的实际应用。
  为此,本文采用ARM7和VC提出了一种高分辨率的红外触摸屏的实现方案。该方法通过ARM7对接收管和发射管的控制,来实时采集与发射管一一对应的接收管的光通量,然后计算鼠标位置,最后通过VC编程来实现在Windows下的鼠标驱动。
  1硬件平台
  1.1工作原理
  红外触摸屏主要基于在屏幕四边放置红外发射管和红外接收管。本系统中的微处理器控制驱动电路依次接通红外发射管并检查相应的红外接收管,从而形成横竖交叉的红外线阵列,并得到定位的信息。本文通过ARM7对移位锁存器的控制来对红外发射管进行逐个扫描,同时,ARM7通过地址线和数据线来寻址每个相应的红外接收管,从而得到相应的光通量值。其控制原理如图1所示。






  1.2高分辨率的实现
  早期的红外触摸屏的分辨率直接由红外对管数决定,对于接收管来说,只有接收到和没有接收到信号两种情况,触摸分辨率就等于屏的物理分辨率。因此其触摸屏的分辨率比较低。
  但如果将接收的信号强度进行量化分级,那么,对于接收的信号,不仅要判断是否被阻挡,还要判断出被阻挡的程度,触摸物的不同位置将决定是否有接收信号且接收信号的强度也有所不同,因此触摸物的位置与接收的红外信号强度有直接的对应关系,即使触摸物移动非常小的距离也会导致信号强度发生改变,从而可以得到极高的分辨率。该情况下的触摸屏分辨率主要由红外对管数和模数转换精度决定,其触摸屏分辨率为红外对管数与单对红外管能实现的分辨率的乘积。触摸屏坐标由红外管的物理坐标和触摸点在相应管中的坐标共同决定。基于以上原理,可以将每次采集到的红外接收管的光通量进行256级量化,这样,得到的最小分辨率就是接收管的宽度/256,从而大大提高了红外触摸屏的分辨率,该方法可以达到2046×768的精度。
  1.3触摸位置的计算
  为了得到准确的触摸位置,在计算触摸位置时必须排除周围环境光的干扰。为此,本文通过确定每对管子的域值来作为判断是否有手指触摸的依据。该域值的确定可通过对每对管子的“0”态和“1”态时的数据采样来实现。 “0”态,即将所有的发射管进行一次清零,此时的发射管都为熄灭状态,这样,采样得到的就是接收管接收到的周围光的光通量;“1”态,即将所有的发射管逐个点亮,此时的发射管在某一时刻只有一只被点亮,采样得到的是接收管接收对应发射管及周围光的光通量。
  本文中的红外触摸屏的触摸位置的计算主要是通过遮挡时与未遮挡时的光强比来得到的。在判断触摸位置时,可以先确定被遮挡的管子,计算得到被遮挡的大致位置。若被遮挡的管子为第N个管子,这个被遮挡的大致位置为Ld,则有:
  Ld=(N-1)×管子的宽度
  由于手指遮挡时有一定的区域,所以遮挡时有两种可能:其一是在被确定的管子的前面;其二是在被确定的管子处。图3所示为手指遮挡示意图。






  其中,L为第N个管子被遮挡时的位置。△L1为手指在被确定的管子的前面时的偏移量。△L2为手指在被确定的管子处时的偏移量,XN为扫描时采样第N个管子接收到的数据,XNmax为“1”态时采样第N个管子接收到的数据.XNmin为“0”态时采样第N个管子接收到的数据。
  2鼠标驱动
  ARM7作为硬件上的核心控制芯片,只能进行采集以得到触摸位置信息,而无法实现相应的鼠标动作。所以,必须通过主机端的驱动程序来实现。本文中的驱动程序可通过VC++编程来实现串口通信和鼠标动作,从而完成软件结合硬件对鼠标的驱动。
  2.1? 串口通信
  为了使主机能够接收ARM7通过串口传送的触摸位置,可利用Microsoft公司提供的ActiveX控件Microsoft CommunicatiONs Control,并通过VC++编程来实现串口通信。通过在该控件中的设置可指定通信串口号,同时可设置波特率、校验位、停止位、数据位等通信参数,以及接收OnComm事件门限值。其具体代码如下:






  其中,X为触摸位置的横坐标,X1为X百位上的数,X2为X十位上的数,X3为X个位上的数;Y为触摸位置的纵坐标,Y1为Y百位上的数,Y2为Y十位上的数,Y3为Y个位上的数。
  由于刚接收的数据为VARIANT类型,故需将其转化为int型变量来进行以上坐标的组合。该转换过程是先将VARIANT类型变量赋值COle-SafeArray类,再利用COleSafeArray类中的成员函数将数据写入BYte型数组中,最后将BYTE型数据转化为int型。
  2.2鼠标动作
  鼠标动作在触摸屏的应用中甚为重要。它主要包括鼠标的定位,鼠标的移动,鼠标的左键单击和双击,以及鼠标的右键单击。在VC++编程中,可通过使用API函数中的mouse_event来模拟鼠标事件,以实现以上的鼠标动作。其实现代码如下:
  定位:SetCursorPos(X,Y);
  左键单击:mouse_event((MOUSEEVENTF_LEFYDOWN,0,0,0,0);
  mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
  在模拟鼠标动作的同时,一个很重要的处理步骤是屏蔽采集数据时受到的干扰。另外,使鼠标运动平滑化也不容忽视。






  3结束语
  本文介绍了基于ARM7控制器和VC实现的红外触摸屏设计方案,该方案以ARM7作为硬件的核心控制芯片,并通过其利用IO口对移位锁存器的控制来实现对发射管的驱动,利用地址线和数据线来实现对接收管的寻址和采样,以形成红外定位阵列,从而从硬件上完成了位置数据的采集。该方法可实现2046×768的高分辨率。而在软件上,通过VC++编程则可实现主机端的串口通信,模拟鼠标动作,并结合比较法和平均法对鼠标运动进行平滑化处理。
            
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-7-20 18:40 , 耗时 0.089143 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表