注册登录

别把电容屏想的那么难!3步自制电容触摸屏

在上手制作之前,先来科普一些触摸屏的知识。我们手机中的触摸屏类型,主要有两大类,电阻屏和电容屏。电阻屏主要用在手写(即需要用力的屏幕)上,基本已经被淘汰了,现在我们手机上的都是电容屏。而电容屏又分两种:表面式电容屏和投射式电容屏。表面式电容屏是在四周镀上狭长的电极来在整个屏幕内形成一个低压交流电场,当手指触摸屏幕时,手指与屏幕会形成一个耦合电容,这时屏幕里的电荷会被人体吸走。为了恢复这些电荷损失,电荷会从屏幕的四角补充进来,各方向补充的电荷量(即电流大小)和触摸点到屏幕四角的距离成正比,由此可以推算触摸点的位置。

投射电容屏采用多个行列交错的电极来形成感应矩阵,来检测每一个单元的电容变化,又可分为自电容屏互电容屏两种类型。本次分享的项目就是自电容屏。

微信图片_20200513102214.png

自电容屏是通过依次分别检测横向与纵向电极阵列,根据触摸前后电容的变化,分别确定横向坐标和纵向坐标,然后组合成平面的触摸坐标。

微信图片_20200513102217.png

当我们触摸到屏幕上时,由于人体皮肤具有导电性会导致对应单元的电容变化,通过对电容充放电来检测这种变化,便可以判断是否有触摸。

微信图片_20200513102221.png

自电容检测的是每个感应单元的电容(也就是寄生电容)的变化,有手指存在时寄生电容会增加,从而判断有触摸存在,但难以判断同时触摸时的坐标。而互电容是检测行列交叉处的互电容(也就是耦合电容Cm)的变化,如下图所示:

微信图片_20200513102225.png

检测互电容大小时,横向的电极依次发出激励信号,纵向的所有电极同时接收信号,这样可以得到所有横向和纵向电极交汇点的电容值大小,即整个触摸屏的二维平面的电容大小。根据触摸屏二维电容变化量数据,可以计算出每一个触摸点的坐标。因此,屏上即使有多个触摸点,也能计算出每个触摸点的真实坐标知道了基本的原理之后,现在动手打造一个自己的电容屏吧:首先是传感阵列,将铜皮切成12个均匀的铜条后贴在纸上,注意此时要确保单元格之间的距离均匀统一,将杜邦线焊接到每个铜条的边缘,并将其与MPR121连接。

微信图片_20200513102228.png

接下来是配置传感器驱动MPR121。传感器的配置也不复杂,每次MPR121感知到变化时,都会通过其IRQ引脚产生一个中断。调用中断来实现对一个二维数组的更新,这个二维数组的值是对应坐标的横纵坐标值之积。比如,检测到第四行的值是3000,第二列的值是1200,那么二维数组(4,2)的值就是3000*1200。通过检测这个二维数组的值的大小变化,就可以判断是否有触摸以及触摸位置。

微信图片_20200513102231.png

MPR121的检测时间间隔(即检测频率)可以在1ms到128ms之间,用户可以选择不同的检测频率来应对用户触摸的时间间隔,实现系统不同的抗噪能力以及功耗。而且MPR121也可以用来做接近检测,不一定非要触摸。MPR121通过I2C与Nano通信,因此SDA,SCL,VCC,GND和IRQ线如下图所示与Arduino连接。

微信图片_20200513102233.png

最后便是软件的工作,如何创造一个好的GUI来实时显示触摸的位置。Pygame是使用Python创建交互式GUI的绝佳框架,因此我们用它来显示触摸位置。之前所说的二维数组table是通串口打印出来的。即我们有6行数据,每个元素都由“|”符号分隔。首先去除空格,然后使用内置的split()方法将字符串转换为列表,来解析值。然后将该值映射到0255之间的数字,该数字用于为窗口中的每个正方形着色,范围从蓝色(无触摸)到红色(触摸)。这样我们便可以实时表示触摸与否以及位置了。

微信图片_20200513102237.png

软件代码非常简洁,可以在“达尔闻说”微信回复:电容屏,获取。

别看上面DIY的这么简单,可不要仅仅把它当做电容屏哦。我们可以用它来做更多事。比如可以做一个虚拟开关,或者交互按钮。在传感阵列上盖这白纸做个掩饰,别看看到的只是你在白纸上随意指点,而对应的LED灯或者电脑屏幕就会有变化,完全可以玩出魔术的感觉。

0条回复

作者
用户头像
文章 0关注 0粉丝 0
发私信
相关文章
联系客服