旋钮、按钮、手柄和触摸屏是人类与机器和嵌入式设备的常用交互方式。不过,传感器技术的最新进展开辟了一条全新的道路,使开发人员可为产品添加三维 (3D) 手势控制。
由于所采用的技术各不相同,购买和集成手势控制器可能成本高昂。然而,市面上手势传感器技术种类繁多,从使用红外 LED 和光电二极管来检测动作的经济型传感器,到昂贵的手势识别相机。红外手势传感器经济实惠,可以通过数字接口与低成本微控制器连接,只需辅以简单的软件,精度足以应对许多应用。
本文探讨了使用 Broadcom 的 APDS-9960 进行手势控制的方法。几乎所有嵌入式系统都可轻松集成这款红外 (IR) 手势控制传感器。
基于 IR 的手势传感器
基于 IR 的手势传感器原理十分简单。用于检测手势时,开发人员可能需要检测以下几种不同手势:
向上/向下
向左/向右
向前/向后
在上述每种情况下,传感器都需要检测运动方向,而这主要通过传感器的两大组件来实现:一个发光二极管 (LED) 和多个定向光电二极管。定向光电二极管由至少四个光电二极管组成,分别置于距 IR LED 预定义距离处。例如,Broadcom 的 APDS-9960 环境光、接近度和手势传感器将四个光电二极管布置为菱形,每个二极管用于指示一个方向,分别为上、下、左和右(图 1)。
图 1:Broadcom 的 APDS-9960 具有一个集成 IR LED 和四个定向光电二极管,可检测反射的 IR 能量以分析手势。(图片来源:Broadcom)
当 LED 发射红外能量时,除非遇到手等物体发生反射,否则能量就会发射至空气中。光电二极管将检测到不同强度的反射能量,具体取决于物体的位置。例如,相比位于手势后边缘的光电二极管,前边缘光电二极管最初接收的反射能量较少,从而导致一个光电二极管的计数值比另一个高。在手势动作过程中,连续测量将导致不同位置的光电二极管检测的反射能量强度不同,而分析该方向信息流即可确定手势。
例如,若用户用手从传感器的顶部轻扫至底部,则在手势动作之初,下方光电二极管检测的入射光比上方光电二极管更强;在手势动作期间,手逐渐移动到两个二极管接收能量相等的点;而在手势动作完成时,下方光电二极管接收的反射光较弱,而上方光电二极管接收的更强,此时两光电二极管的曲线和相位完全反转(图 2)。
图 2:Broadcom 的 APDS-9960 检测到向下手势将生成以上光电二极管曲线,其中主导曲线指示手势方向。(图片来源:Broadcom)
了解手势数据的生成原理后,下一步就来看看如何连接到 APDS-9960。
连接 Broadcom 的 APDS-9960 手势控制器
APDS-9960 采用 8 引脚表面贴装 (SMD-8) 封装,占用印刷电路板空间极小。传感器尺寸仅为 3.94 × 2.36 × 1.35 mm。该封装包含正常电源和接地引脚、用于连接微控制器的 I2C 数字接口,以及用于定制 LED 驱动电路的引脚。此外,该封装还包含中断引脚,可用于通知微控制器处理可用的手势数据。
构建原型并连接 APDS-9960 有几种不同选项可供选择。例如,SparkFun 的 APDS-9960 评估板提供了包括 LED 驱动电路在内的小型分线板,以便实现开箱即用。开发人员只需焊接针座以通过旁路绕过电源和接地,并将 I2C 总线和可选的中断引脚连接至微控制器,即可着手开发嵌入式软件了。此外,SparkFun 评估板还包含安装孔,若现有电路板有助于实现应用,则可直接运用到设计中。
或者,开发人员也可使用 Adafruit 的 APDS-9960 分线板,这也是一款一体化解决方案(图 5)。Adafruit 分线板很有意思,尽管外形小巧,却还包含 3 V 板载稳压器,可用于为电源 LED 甚至低功耗微控制器等附加电路供电。最重要的是,Adafruit 为开发人员提供了完善的 Adafruit APDS9960 分线板用户指南,以及若干软件库可用于连接 Arduino 板或运行 Python 的开发板。因此,使用 APDS-9960 可轻松实现开箱即用,从而大幅缩短开发人员着手使用手势传感器所花费的时间。
连接上述分线板的最简单方法是将 Molex 22-28-4255 分离式针座焊接至电路板上。最好将针座朝下焊接,可实现多种优势:首先,可将电路板直接插入某个试验板,如 Digilent 的 340-002-1 无焊试验板套件(图 6)。其次,不要在该电路板上表面接线,以免手势动作时意外触及挂在针座上的电线。
图 :Digilent 无焊试验板上焊接好的 Adafruit APDS-9960 分线板。(图片来源:Adafruit)
此时,需要连接电源和接地,并将 I2C 总线连接至所需的微控制器开发板。任何带微控制器的开发板都可使用。但最好选择 STMicroelectronics 用于物联网节点的 B-L475E-IOT01A2 STM32L475 开发套件(图 7)。该开发板具有 Arduino 针座,并且由 MicroPython 提供支持,可在该开发板上轻松编程。完成此操作后,即可使用 Python 脚本连接手势传感器,从而使手势控制不仅可行,而且轻而易举。
图 :STM32L475 物联网节点开发套件包含 Arduino 针座,可轻松连接到 APDS-9960 分线板。(图片来源:STMicroelectronics)
使用 Python 检测手势
从 APDS-9960 获取手势数据虽不复杂,却要求开发人员仔细阅读规格书。APDS-9960 具有多种不同功能,其中包括:
- 手势感应
- 环境光感应
- RGB 颜色感应
- 接近感应
上述功能均由状态机控制,而状态机的执行则基于应用的寄存器设置。例如,防止手势引擎一直执行的妙招是使用接近感应引擎来检测手的存在。一旦 IR 反射能量达到预设计数,则由接近引擎转换为手势引擎,手势引擎测量定向光电二极管并将测量值放入先进先出 (FIFO) 缓冲器。为了启用该功能,需要设置控制寄存器启用接近感应,并设置计数阈值。
开发人员可能需要编写算法以检测特定的手势,具体取决于应用所需的手势。然而,对于向上/向下和向左/向右等常见手势,开发人员可以使用 Adafruit 的 APDS-9960 CircuitPython 库。将该库复制到 Python 设备后,即可使用清单 1 所示代码导入。该代码可导入 APDS-9960 库以及支持 I2C 总线的多个库。
副本 import board import busio import adafruit_apds9960.apds9960 i2c = busio.I2C(board.SCL, board.SDA) sensor = adafruit_apds9960.apds9960.APDS9960(i2c)
清单 1:用于连接 APDS-9960 手势控制器的 CircuitPython 导入和库初始化代码。(图片来源:Adafruit)
传感器对象是 APDS-9960 库中一个实例。稍后,我们将看到其易用性。为了启用手势,开发人员只需使用以下代码启用手势功能:
副本 sensor.enable_gesture = True The main program loop setup to read the gesture is itself just a few lines of code (Listing 2).gesture = sensor.gesture() while gesture == 0: gesture = sensor.gesture() print(‘Saw gesture: {0}’.format(gesture))
清单 2:只需简单重复调用单个库即可检测手势。(图片来源:Adafruit)
阅读该代码后,您定会发现若感测到手势,则将在屏幕上打印检测的手势(图 )。
图 :Adafruit 的 APDS-9960 CircuitPython 库手势输出结果示例。(图片来源:Adafruit)
手势可以数字形式输出,使用以下键值即可轻松转换:
0 = 未检测到手势
1 = 检测到向上手势
2 = 检测到向下手势
3 = 检测到向左手势
4 = 检测到向右手势
如图所示,借助预先导入的库,只需几行代码即可轻松实现基本手势识别。识别更为复杂的手势则需要修改库以分析原始手势数据。
构建手势控制器的技巧与诀窍
构建手势控制传感器并将其集成于产品着实具有一定挑战性。使用基于红外线的手势控制器时,开发人员需要考虑使用以下几个“技巧与诀窍”:
使用手势传感器的内部接近检测器来触发手势控制引擎,从而最大限度地减少无效手势启动。
从现有手势库开始,在现有功能的基础上构建其他手势。
将光电二极管增益调整为适合最终手势应用的最佳值。
将 LED 输出驱动强度调整为适合应用的最佳值,或许需要稍作调整才能获得可重复使用的数值。
无论开发何种手势应用,开发人员都应从高级软件开发入手,待充分熟悉该传感器后再转而使用较低级别的代码。
遵循上述技巧有助于确保开发人员花费最短的时间来启动和运行 IR 手势控制器。
总结
人们不断追求以更自然、更直观的方式进行人机交互,而其中一种重要方式就是使用手势控制技术。尽管市面上手势控制技术种类繁多,但论及成本最低、使用最便捷的技术还属基于红外线的手势传感器。如上所述,如果开发人员利用现有的硬件和软件技术,则将手势传感器与微控制器集成在一起,亦可省时省力,简单易用。
评论
查看更多