基于ARM7和VC平台的高分辨率红外触摸屏设计
扫描二维码
随时随地手机看文章
为此,本文采用ARM7和VC提出了一种高分辨率的红外触摸屏的实现方案。该方法通过ARM7对接收管和发射管的控制,来实时采集与发射管一一对应的接收管的光通量,然后计算鼠标位置,最后通过VC编程来实现在Windows下的鼠标驱动。
1硬件平台
1.1工作原理
红外触摸屏主要基于在屏幕四边放置红外发射管和红外接收管。本系统中的微处理器控制驱动电路依次接通红外发射管并检查相应的红外接收管,从而形成横竖交叉的红外线阵列,并得到定位的信息。本文通过ARM7对移位锁存器的控制来对红外发射管进行逐个扫描,同时,ARM7通过地址线和数据线来寻址每个相应的红外接收管,从而得到相应的光通量值。其控制原理如图1所示。
本系统中的移位锁存器具有移位和存储两个时钟。ARM7通过IO口控制移位锁存器的这两个时钟以及数据输入端。通过数据输入端将一个脉冲写入移位寄存器后,在移位时钟的上升沿即可将写入的数据移人寄存器,并在存储时钟的上升沿将数据置入锁存器中。利用移位锁存器的这一特点,可在移位时钟的上升沿将脉冲移至发射管,并在存储时钟的上升沿点亮发射管。写入的脉冲会随移位时钟上升沿的到来不断的移位,直到从输出端移出。将第一个移位锁存器的输出端与下一级的输入端相连,可将写入的脉冲移人下一级。因此,通过移位锁存器的级联可实现ARM7对更多的发射管的驱动。结合以上特点,即可将发射管逐个点亮。
在发射管被点亮的时刻,ARM7将通过地址线寻址与发射管位置上相对应的接收管,并将接收感应到的光通量通过放大器和AD转换器放大并转换成8位数据,再通过数据线传送给ARM7进行处理。通过这样处理可使发射管与接收管一一对应,从而为确定触摸位置奠定基础。红外触摸屏的具体工作流程如图2所示。
1.2高分辨率的实现
早期的红外触摸屏的分辨率直接由红外对管数决定,对于接收管来说,只有接收到和没有接收到信号两种情况,触摸分辨率就等于屏的物理分辨率。因此其触摸屏的分辨率比较低。
但如果将接收的信号强度进行量化分级,那么,对于接收的信号,不仅要判断是否被阻挡,还要判断出被阻挡的程度,触摸物的不同位置将决定是否有接收信号且接收信号的强度也有所不同,因此触摸物的位置与接收的红外信号强度有直接的对应关系,即使触摸物移动非常小的距离也会导致信号强度发生改变,从而可以得到极高的分辨率。该情况下的触摸屏分辨率主要由红外对管数和模数转换精度决定,其触摸屏分辨率为红外对管数与单对红外管能实现的分辨率的乘积。触摸屏坐标由红外管的物理坐标和触摸点在相应管中的坐标共同决定。基于以上原理,可以将每次采集到的红外接收管的光通量进行256级量化,这样,得到的最小分辨率就是接收管的宽度/256,从而大大提高了红外触摸屏的分辨率,该方法可以达到2046×768的精度。
1.3触摸位置的计算
为了得到准确的触摸位置,在计算触摸位置时必须排除周围环境光的干扰。为此,本文通过确定每对管子的域值来作为判断是否有手指触摸的依据。该域值的确定可通过对每对管子的“0”态和“1”态时的数据采样来实现。 “0”态,即将所有的发射管进行一次清零,此时的发射管都为熄灭状态,这样,采样得到的就是接收管接收到的周围光的光通量;“1”态,即将所有的发射管逐个点亮,此时的发射管在某一时刻只有一只被点亮,采样得到的是接收管接收对应发射管及周围光的光通量。
[!--empirenews.page--]本文中的红外触摸屏的触摸位置的计算主要是通过遮挡时与未遮挡时的光强比来得到的。在判断触摸位置时,可以先确定被遮挡的管子,计算得到被遮挡的大致位置。若被遮挡的管子为第N个管子,这个被遮挡的大致位置为Ld,则有:
Ld=(N-1)×管子的宽度
由于手指遮挡时有一定的区域,所以遮挡时有两种可能:其一是在被确定的管子的前面;其二是在被确定的管子处。图3所示为手指遮挡示意图。
为了精确计算,需要计算这两种情况下位置的偏移量△L1和△L2。则有:
其中,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事件门限值。其具体代码如下:
由于传统的鼠标是一种相对定位系统,它只和前一次鼠标的位置坐标有关。而触摸屏则是一种绝对坐标系,与相对定位系统有着本质的区别。因此,本文通过主机从串口接收到的触摸点坐标数据并进行转换来得到屏幕坐标,即触摸屏的坐标范围为(0,0)到(2048,768)。而ARM7只能通过串口发送字节,且只能发送小于256的数据,所以很难实现直接传输。因此,在数据发送时,应将采集得到的位置数据的每个位上的数分别进行传送。与此同时,主机端从串口接收缓冲区并取出数据,然后在驱动程序中将这些数据重新组合起来以得到触摸位置信息。另外,为了实现鼠标的不同动作,也应分别发送不同的控制字。每次串口通信的数据格式如下:
其中,X为触摸位置的横坐标,X1为X百位上的数,X2为X十位上的数,X3为X个位上的数;Y为触摸位置的纵坐标,Y1为Y百位上的数,Y2为Y十位上的数,Y3为Y个位上的数。
[!--empirenews.page--]由于刚接收的数据为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);
在模拟鼠标动作的同时,一个很重要的处理步骤是屏蔽采集数据时受到的干扰。另外,使鼠标运动平滑化也不容忽视。
图4是通过matlab软件对鼠标运动过程中的各坐标绘制的曲线图。通过曲线可以看到,硬件上的干扰会造成采集的坐标数据出现突变点,曲线上有很多毛刺。这也合理的解释了鼠标在运动过程会出现回跳和抖动,不能平滑运动的现象,因此必须屏蔽这些干扰。
针对突变点,本文采用了比较法来克服。所谓比较法,就是将后一次接收到的坐标数据与前一次接收到的坐标数据做比较,并设置一定的域值范围。当比较得到的绝对值在该域值范围内时,则认为所作的动作是有效的。与此同时,还需比较前后数据的变化趋势是否一致,只有当数据的变化趋势一致,才认为鼠标的移动是有效的。
针对毛刺,本文采用平均法和比较法来克服。所谓平均法,是将从第N组到第2N组的N组数据进行平均,然后将其作为第N组数据。这样可以有效的减少毛刺干扰。另外,也可以对前后两组数据进行比较,只有当比较得到的绝对值大于触摸屏的最小分辨率时,才认为鼠标发生移动,否则原地不动。通过这样的处理,可以解决鼠标抖动的问题。经过处理后的鼠标运动曲线如图5所示。
3结束语
本文介绍了基于ARM7控制器和VC实现的红外触摸屏设计方案,该方案以ARM7作为硬件的核心控制芯片,并通过其利用IO口对移位锁存器的控制来实现对发射管的驱动,利用地址线和数据线来实现对接收管的寻址和采样,以形成红外定位阵列,从而从硬件上完成了位置数据的采集。该方法可实现2046×768的高分辨率。而在软件上,通过VC++编程则可实现主机端的串口通信,模拟鼠标动作,并结合比较法和平均法对鼠标运动进行平滑化处理。