摘要:目前,在嵌入式系统中通过触摸屏写出的文字,笔划粗细都是相同的,字迹显得僵硬,不如毛笔字或钢笔字潇洒大方且风格多样。提出了一种适用于PDA及其它嵌入式设备的低成本、高速度、简单可行的解决方法,使得在触摸屏上书写时,LCD屏上能显现出如同毛笔字或钢笔字的传统书法特色的文字,笔划粗细疏密有致,字迹亲切自然,同时也能显现出书写人笔迹的个性风格。
关键词:ADS7846 书法 MC9328MX1 PDA 嵌入式系统
书法艺术是中国传统文化的瑰宝。如果用笔尖或指尖在触摸屏上挥洒自如写字,LCD上能显示出犹如用毛笔或钢笔收写时的书法效果,并能显现出书写人独特个性的隽秀笔迹,那么就会使人体会到淋漓尽致的书法艺术。但现有的PDA(Personal Digital Assistant)通过触摸屏画出线条,显示屏上显示出的线条粗细都是相同的,无法写出笔划粗细相间的文字,也就无法模拟出毛笔或钢笔书写时笔锋的效果。为弥补以上不足,笔者采用能采样触点压力的ADS7846触摸屏控制器[1],编写了采样触点坐标值和压力值的驱动程序,实现了通过触摸屏输入,在液晶显示器上显示书法出良好的效果。就象手中拿着毛笔或钢笔在触摸屏上写字一样,无论是行书、草书、隶书还是楷书,都能显示出令人满意的效果,并且完全保留了书写人的字迹特点。
1 ADS7846触摸屏控制器原理和功能概述
基于四线电阻式触摸屏的输入系统由触摸屏、触摸屏控制器、微控制器及其相应软件构成。其中,触摸屏控制器相当于触摸屏与微控制器之间的接口。触摸屏体是一个四层的复合薄膜,,附着在显示器表面与显示器配合使用。复合薄膜的最下层是玻璃基层,最上层是光滑防刮的塑料层,中间为两层透明导电涂层。每一导电层为触摸屏的一个工作面,每个工作面的两端各涂有一条银胶,称为该工作面的一对电极,分别称为X“电极对”和Y“电极对”。当触摸屏控制器在X“电极对”上施加一确定的电压,而Y“电极对”上不加电压时,X“电极对"所在的工作面上就会形成均匀连续的平行电场。当用手指触及触摸屏表面时,触点处的电压反映了触点在X工作面上的位置,将该电压通过Y+(或Y-)电极引到触摸屏控制器,并经过A/D转换,便可得到触点电压的数字量,即X坐标。同理,在Y“电极对”上施加电压,以X+(或X-)电极为测量电极,便可测得Y坐标。微控制器根据触点坐标位置以及对应坐标位置上显示的内容,便可得知触摸者的意图。
ADS7846是Burr-Brown公司生产的一种四线式触摸屏控制器,在与触摸连用时,一旦笔尖或指尖点触在触摸屏上,便可迅速得到该点的位置信号,从而达到在触摸屏表面雪址的目的。ADS7846是典型的逐步逼近寄存器型A/D变换器,包含了取样/保持功能。ADS7846与其前代产品ADS7843相比,增加了片内温度测量、触摸压力测量、外模拟量测量和电池电压测量四个功能。
ADS7846的核心部件是一个具有采样和保持功能的12位逐次逼近式A/D转换器。内部的六选一模拟多路开关根据微控制器送来的命令字选择六个模拟量:X+、Y+、Y-、VBAT(电池电压)、TEMP(温度)和AUXIN(外模拟量)之一送入A/D转换器,转换后通过SPI接口将数字量送入微控制器。ADS7846还设置有触摸识别电路,当检测到有触摸时,该电路输出一个低电平信号,称为PENIRQ#(笔中断),ADS7846以这个信号向微控制器提出测量触点坐标的中断请求。触点坐标的公式如下:
式中,X和Y分别为触点在X工作面和Y工作面上产生的电压的数字量的测量值,可通过采样得到;(X,Y)反映了触点在触摸屏上的坐标的公式如下XMIX、YMIN、XMAX和YMAX分别为触摸屏上最小和最大坐标点在X工作面和Y工作面上产生的电压的数字量的实际测量值,它们是常量,可通过测量得到;(XMIN,YMIN)和(XMAX,YMAX)反映了触摸屏上最小、最大坐标点的坐标;w和H分别是LCD显示屏X轴和Y轴上的象素点总数;(X1,Y1)为触点映射到LCD显示屏上的像素点坐标。
触摸压力测量是指对指尖或笔尖触及触摸屏时产生的压力值进行测量。触摸压力不是直接测出来的,而是转换为测量触点处X工作面和Y工作面之间的接触电阻的大小来完成的。Rtouch的公式如下:
式中,Rtouch表示接触电阻;Rx是X+与X-两电极间的总电阻;Z1和Z2是触摸屏的内部参数,反映触点与X工作面和Y工作面间的关系。Z1和Z2两个参数及X的值可通过ADS7846提供的指令采样得到。而Rx并不需要去测量,因为各个触摸屏的这个参数并不一样,但在同一个触摸屏上它却是个定值,每个点的Rtouch都要乘以这个定值Rx,所以这个参数可以不考虑。所得到的Rtouch值的大小反应了测量触点压力的大小。Rtouch越大,压力越小,可以通过实验测出不同压力的Rtouch值。如果发现压力值分布范围太宽,可以给Rtouch除以一个合适的参数;如果发现压力值分布太窄,可以给Rtouch乘以一个合适的参数。笔者针对自己的触摸屏,通过试验发现用
比较合适,不同的压力与Rtouch的比值分布在80~170之间,这样就有足够的间隔来把压力划分为不同的等级。
2 设计原理与具体实现
2.1 设计思路
微处理器首先利用SPI总线通过ADS7846采样到笔尖在触摸屏上的触点坐标值及Z1值和Z2值;然后通过式(1)和式(2)计算出映射到LCD屏上的坐标值,用式(4)计算出Rtouch值;再利用GUI提供的API函数在LCD上画一条线段把前一个触点和当前触点连起来;最后在这条线段的两边扩展平行线,平行线的数量越多,这条线段越粗。平行线的数量由当前触点Rtouch的大小决定,即压力越大,线段越粗。这样就模拟出了用毛笔或钢笔书写时笔锋游转的效果。
2.2 电路设计
笔者以MOTOROLA公司的DRAGONBALL(龙珠)系列MC9328MX1(ARM92T)作为硬件平台[2],利用MC9328MX1提供的SPI总线对ADS7846进行控制和数据传输。接口示意图如图1所示。
由图1可以看出,ADS7846与其前代产品ADS7843的接口电路完全相同。如果需要在原来使用ADS7843的设备上增加片内温度测量、触摸压力测量、外模拟量测量和电池电压测量四个功能,只需将板上的ADS7843替换为ADS7846,然后改写驱动程序即可。因为ADS7846与ADS7843的引脚封装完全一致,所以不用改动电路,这使更换工作非常方便。
2.3 驱动程序
在应用中,采用差动参考电压方式测量坐标模拟量,测量命令字的设置和模拟量选择参见表1和表2。
表1 ADS7846的测量命令字
Bit7(MSB)
BIt6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
S
A2
A1
A0
MODE
SER/DFR
PD1
PD0
表2 差动参考电压方式下的模拟量选择
A[2:0]
参考电压(+REF,-REF)
模拟量输入
所测参数
001
Y+,Y-
X+
Y
011
Y+,X-
X-
Z1
100
Y+,X-
Y-
Z2
101
X+,X-
Y+
X
有关ADS7843驱动程序的资料很多,源代码也能很容易地找到。具有触摸压力测量功能的ADS7846的驱动程序,只需在原ADS7834驱动程序的合适位置加入采样Z1参数和Z2参数的代码就行了[4] .这部分的代码很简单,添加也很容易。笔者在MC9328MX1上实现的源代码如下:
spi_tx_data(0xB0); //输入采样Z1值的命令//
zl_upper = REG_SPI_RXDATA;
spi_tx_data(0x00);
zl_upper = REG_SPI_RXDATA;
spi_tx_data(0xc0); //输人采样Z2值的命令//
zl_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(0x00); //输入采样Y值的命令//
x_upper = REG_SPI_RXDATA;
spi_tx_data(0x00);
x_upper = REG_SPI_RXDATA;
spi_tx_data(0x90); //输入采样X值的命令//
x_lower = RE G_SPI_RXDATA;
spi_tx_data(0x00);
y_upper = REG_SPI_RXDATA;
spi_tx_data(0x00);
y_upper = REG_SPI_RXDATA;
然后,计算出X,Y,Z1和Z2的值:
X=(((x_upper<<5)%26;amp;0xFE0)| ((x_lower>>3) %26;amp; 0x1F));
Y=(((y_upper<<5)%26;amp;0xFE0)| ((y_lower>>3) %26;amp; 0x1F));
Z1=(((z1_upper<<5)%26;amp;0xFE0)| ((z1_lower>>3) %26;amp; 0x1F));
Z2=(((z2_upper<<5)%26;amp;0xFE0)| ((z2_lower>>3) %26;amp; 0x1F));
此外,还应注意触摸抖动和连击问题。可以采用延迟测量法来解决,即在接收到触摸屏笔中断时延迟一段时间(抖动时30ms)后再测量,可消除抖动;测量完后再次延迟一段时间(连击延时300ms)后打开笔中断,可避免连击现象的出现。驱动程序主要包括初始化SPI寄存器、可编程定时器中断和笔中断。在笔中断中主要完成关笔中断、设置笔中断标志和将定时计数值设置为抖动延时,在定时器中断程序中主要实现坐标值的测量、延时功能。
2.4 应用程序
一块触摸屏中并不一定每个点对压力的感应都很准确。另外笔尖在触摸屏上书写时,也会有秚动和干扰。这就造成了用同样的力在触摸屏上画一条线,显现时可能出现粗细不一样的现象。针对这个现象,在应用程序中适当做一些平滑处理。笔者采用算术平均法来平滑曲线,即如果发现采样点的压力值比前一个点大或小很多,则对该点和刚刚输入的前几个点压力值做算术平均,得到的值作为该点正确的压力值。但要注意,用来做平均的点不能取得太少,否则平滑作用不明显;也不能取得太多,否则线条粗细变化太慢,模拟不出书法效果。通过实验,发现取前三个点比较合适。做算术平均的源程序如下:
if(pressure-oldpressurel>50|| oldpressurel-pressure >50) //如果发现触点的采样压力值比前一个点大或小很多//
pressure =(pressure+oldpressurel+oldpressure2+oldpressure3)>>2; /则对该点和前三个触点的压力值做算术平均,并把结果作为该点正确的压力值//
3 实验结果
经过实验,在LCD上显示出的结果如图2所示。
图2(a)为使用ADS7843,未采样触点压力值在LCD上的显示效果;图2(b)为使用ADS7846,采样触点压力值后,根据压力大小在LCD上显示出不同粗细曲线的效果。
如果使用多灰度级的LCD显示屏,还可以利用触点的压力大小(Rtouch)和笔尖在屏上接触的时间这两个参数,使画出曲线的顔色呈出出不同深浅。即触点的压力越大、笔尖在屏上相关区域接触的时间越长,这个区域显现的顔色就越深。具体调节公式如下:
式中,graylever为LCD上该点将要显现出的灰度值,(X,Y)为该点坐标,(Xddtime,Yoldtime)为同一笔划中一定时间间隔前触点的坐标。笔者在开发过程中,取时间间隔为100ms。A和B都是用来调整graylever变化范围的常量,可以通过实验根据具体情况设定。
这样,用指尖在触摸屏上作画时,LCD上也会显现出素描和国画的效果。
如果使用彩色LDC,可以结合GUI在LCD上创建一个供用户选择不同色彩的窗口,用户就可以挑选合适的顔色在触摸屏上画图,显示屏上也将会呈现色彩缤纷的作品。因此,本文介绍的方法将会为PDA及相关行业开拓出全新的功能,带来更加明媚的春天。
本文提出的方法已在MOTOROLA公司的DRAGONBALL(龙珠)系列MX1(ARM920T)上实现。该设计使得在PDA的触摸屏上写字时,能显示出毛笔或钢笔写出的书法效果,同时也显现出了书写人笔迹的个性风格,并具有反应速度快、实现成本低、程序编写特简单等突出特点。相信此方法将会在周期入式领域中得到广泛的应用。
引用地址:通过ADS7846在PDA上实现个性化书法输入