首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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



由于传统的鼠标是一种相对定位系统,它只和前一次鼠标的位置坐标有关。而触摸屏则是一种绝对坐标系,与相对定位系统有着本质的区别。因此,本文通过主机从串口接收到的触摸点坐标数据并进行转换来得到屏幕坐标,即触摸屏的坐标范围为(0,0)到(2048,768)。而ARM7只能通过串口发送字节,且只能发送小于256的数据,所以很难实现直接传输。因此,在数据发送时,应将采集得到的位置数据的每个位上的数分别进行传送。与此同时,主机端从串口接收缓冲区并取出数据,然后在驱动程序中将这些数据重新组合起来以得到触摸位置信息。另外,为了实现鼠标的不同动作,也应分别发送不同的控制字。每次串口通信的数据格式如下:

其中,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);
在模拟鼠标动作的同时,一个很重要的处理步骤是屏蔽采集数据时受到的干扰。另外,使鼠标运动平滑化也不容忽视。
图4是通过matlab软件对鼠标运动过程中的各坐标绘制的曲线图。通过曲线可以看到,硬件上的干扰会造成采集的坐标数据出现突变点,曲线上有很多毛刺。这也合理的解释了鼠标在运动过程会出现回跳和抖动,不能平滑运动的现象,因此必须屏蔽这些干扰。

针对突变点,本文采用了比较法来克服。所谓比较法,就是将后一次接收到的坐标数据与前一次接收到的坐标数据做比较,并设置一定的域值范围。当比较得到的绝对值在该域值范围内时,则认为所作的动作是有效的。与此同时,还需比较前后数据的变化趋势是否一致,只有当数据的变化趋势一致,才认为鼠标的移动是有效的。
针对毛刺,本文采用平均法和比较法来克服。所谓平均法,是将从第N组到第2N组的N组数据进行平均,然后将其作为第N组数据。这样可以有效的减少毛刺干扰。另外,也可以对前后两组数据进行比较,只有当比较得到的绝对值大于触摸屏的最小分辨率时,才认为鼠标发生移动,否则原地不动。通过这样的处理,可以解决鼠标抖动的问题。经过处理后的鼠标运动曲线如图5所示。

3结束语
本文介绍了基于ARM7控制器和VC实现的红外触摸屏设计方案,该方案以ARM7作为硬件的核心控制芯片,并通过其利用IO口对移位锁存器的控制来实现对发射管的驱动,利用地址线和数据线来实现对接收管的寻址和采样,以形成红外定位阵列,从而从硬件上完成了位置数据的采集。该方法可实现2046×768 的高分辨率。而在软件上,通过VC++编程则可实现主机端的串口通信,模拟鼠标动作,并结合比较法和平均法对鼠标运动进行平滑化处理。
返回列表