电容式接近传感器普遍用于检测传感器近距离处是否存在用户。通过检测,当感应到有用户存在后,我们即可选择背光发光来凸显特定按钮,或者将系统从低功耗运行模式下唤醒。具体就汽车应用而言,当电容式接近传感器感应到用户在车内时会打开车厢灯光,或激活无钥匙车门解锁系统。除了感应传感器附近是否存在用户之外,我们还能通过适当放置的多个接近传感器来识别空中的简单手势。所有传感器的数据能够结合在一起,从而映射出传感器邻近区域中用户的手势操作。这些手势可用来给系统提供输入信息,包括控制媒体播放机、进行地图导航或者浏览播放列表等。
我们可适当放置多个接近传感器,使其相互之间留出适当的距离。当手划过传感器时,每个传感器检测到手部动作的时间瞬间都不相同。不同传感器的相对检测顺序和检测时长可用来分析手部移动的方向和速度。手势可以很简单,例如在这些传感器上方从左到右画一条直线;也可以很复杂,包括用手在空中画圆圈之类的图案。在本文中,我们将分析如何使用多个传感器的不同模式进行简单的手势识别以及如何实现更加复杂的手势操作。
下面我们分析一下如图1所示的汽车信息娱乐系统四周放置的四个电容式接近传感器。
图1. 右图为汽车信息娱乐系统四周放置的电容式接近传感器,左图标注出其位置。
传感器的放置应恰到好处,要确保在传感器面板上方做手势时能按顺序触发传感器进行识别(不同顺序会产生不同效果)。我们会对传感器的触发顺序进行确认。如果顺序与某个预设序列相匹配,就会发出这个手势对应的操作指令。我们将采用图1所示的传感器放置模式作为参考,向您介绍本文中讨论的手势操作。
设想一下手从左到右在传感器上方画一条直线的简单手势操作,如图2(a)所示。手从左到右掠过传感器时,当手一靠近系统,左侧传感器就会首先被触发。“触发”这个词在这里是指传感器检测到有物体存在,而不能误解为启用接近传感器。因为系统一旦打开,接近传感器就已经在启用了,而且会对邻近区域的物体保持扫描感应。
图2. (a手在空中从左到右画一条直线;(b)手画直线时,每个传感器的信号图
手在控制台上方划过时,顶部、底部的两个传感器被触发,同时左侧传感器仍保持触发。当手继续向右划动时,右侧传感器被触发。而左侧传感器则在手离开其检测范围后停止感应。当手划过右侧传感器,顶部、底部的传感器则不会再检测到手的存在。手进一步远离后,右侧传感器也会停止感应。传感器触发的顺序将是以下其中一种,具体取决于手的位置和各个传感器的灵敏度:
右→顶→底→左
右→底→顶→左
右→底→左
右→顶→左
以上所有传感器激活序列都对应于(左→右)的手势。本例采用PSoC实现电容式接近传感器。PSoC中的电容至数字转换器(也就是Capsense Sigma Delta)可用来测量电容。CSD模块的输出为原始计数,原始计数越大,传感器感应到的电容也就越高。手离接近传感器越近,传感器的电容就越大。
当传感器的原始计数超过基础值的某个特定阈值时,传感器就会因为在其邻近区域检测到物体的存在而被触发。手从左到右画直线(如图2(a)所示)时,四个传感器的原始计数图则如图2(b)所示。该图确认了上述传感器的激活顺序。如果手反方向移动,也就是(右→左)的手势操作,那么传感器触发序列与上述左右两侧传感器的激活序列相反。也就是说,这时(右→左)手势对应的传感器激活序列为以下其中一种:
右→顶→底→左
右→底→顶→左
右→底→左
右→顶→左
以上所述的两种手势都是手在水平方向的移动。同样,手还可以垂直方向上画直线,也就是(顶→底)或(底→顶)的手势,具体取决于手移动的方向。
(上→下)或(下→上)的手势可关联于上下滚动菜单或曲目列表等简单操作,如图3所示。
图3.用手垂直方向上画直线的接近手势来滚动菜单
(左→右)和(右→左)的手势可关联于音乐播放器应用的换歌或换碟操作。通过放置接近传感器(如图4所示),同样的手势也可用来替代按压按钮来开关车舱内部的照明灯。
图4. 通过手画直线来控制车舱顶灯
(顶→底)手势类似于向上/下按钮按压动作。不过,在按住向上(向下)按钮不放时,屏幕会不断向上(下)滚动,直到松开按钮为止。换言之,只要按下按钮,这个动作就有“黏性”。要让手势操作彻底取代按钮操作,那么手势操作也应该能够支持这种“黏性”功能。我们将对手势进行如下修改来满足这一要求。手从顶部传感器向底部传感器移动时,只要手划过底部传感器,系统就将此解码为(顶→底)手势。我们更改一下手势,当手按手势顺序到达最后的传感器(这里指底部传感器)时,就发出向下滚动的命令。并且只要手保持在底部传感器上方不动,就会一直反复发出向下滚动的命令。等滚动到需要找的菜单项,手再继续向下移动并离开底部传感器感应范围,这时就会停止发出向下滚动的命令。也就是说,要让手势操作也有“黏性”,手不能一下子完成从上到下的划动,而是要在最后的传感器处先停顿一下,找到需要的项目之后再离开该传感器的感应范围。只要手停在传感器感应范围内不动,就会一直发出命令。
图5显示了(顶→底)黏性手势的顶、底部传感器的原始计数图。顶部传感器停止感应手势操作之后,底部传感器会保持更长时间的触发状态,这说明手在底部传感器的感应范围停下来了,而不是不停地直接划下。在发送黏性命令时,我们要检查顶部传感器是否先被触发,而后是否触发了底部传感器。这时顶部传感器已经不再感应到手势操作,而底部传感器仍能够持续感应到手在附近。当手在底部传感器范围内停留超过一定的时间阈值后,只要底部传感器感应到手在附近,就会一直发出黏性命令。同样,我们也能对其它手势操作进行修改,从而实现“黏性”特性,这就能让手势操作完全取代上下按钮功能了。
图5. (顶→底)黏性手势的顶、底部传感器信号图。底部传感器的信号持续停留,这说明在采取“黏性”手势操作。
下面,我们再看一个稍微复杂一点的手势。设想一下用手在传感器面板上方的空中画圈的情景,如图6所示。
图6. 画圈的手势操作
手可从任一传感器的感应位置开始在其它传感器上方画圈,既可以是顺时针方向,也可以是逆时针方向。手画圈回到起点传感器上时就完成了这个圆圈,手移开后即退出画圈过程。举例来说,手可以在右侧传感器上方开始顺时针画圈,顺序经过底部、左侧和顶部传感器,最后回到右侧传感器,然后退出画圈过程。图7同样给出了传感器的原始计数图。同理,手的移动方向反过来则能完成逆时针方向画圈。此外,传感器激发顺序也能对多次画圈操作进行计数。
图7. 顺时针画圈手势操作的传感器原始计数图
画圈手势类似于转动旋钮的动作,可关联于音乐播放器音量调节或者地图浏览缩放等操作命令。
在本文中,我们讨论了如何使用电容式接近传感器进行简单的接近手势操作检测。采用相同的原理,我们能构建出更复杂的手势操作,包括双手一起在空中画图案。不过,这种手势操作能否成功检测,仍要取决于我们选择的传感器模式布局够不够好。选择合适的模式布局非常重要,不仅要给各种手势操作的手部移动提供适当的容差,同时又要判断清楚传感器的触发顺序。