快速设计您自己的低成本 3D 手势控制器

作者:Jacob Beningo

投稿人:DigiKey 北美编辑

旋钮、按钮、手柄和触摸屏是人类与机器和嵌入式设备的常用交互方式。不过,传感器技术的最新进展开辟了一条全新的道路,使开发人员可为产品添加三维 (3D) 手势控制。

由于所采用的技术各不相同,购买和集成手势控制器可能成本高昂。然而,市面上手势传感器技术种类繁多,从使用红外 LED 和光电二极管来检测动作的经济型传感器,到昂贵的手势识别相机。红外手势传感器经济实惠,可以通过数字接口与低成本微控制器连接,只需辅以简单的软件,精度足以应对许多应用。

本文探讨了使用 BroadcomAPDS-9960 进行手势控制的方法。几乎所有嵌入式系统都可轻松集成这款红外 (IR) 手势控制传感器。

基于 IR 的手势传感器

基于 IR 的手势传感器原理十分简单。用于检测手势时,开发人员可能需要检测以下几种不同手势:

  • 向上/向下
  • 向左/向右
  • 向前/向后

在上述每种情况下,传感器都需要检测运动方向,而这主要通过传感器的两大组件来实现:一个发光二极管 (LED) 和多个定向光电二极管。定向光电二极管由至少四个光电二极管组成,分别置于距 IR LED 预定义距离处。例如,Broadcom 的 APDS-9960 环境光、接近度和手势传感器将四个光电二极管布置为菱形,每个二极管用于指示一个方向,分别为上、下、左和右(图 1)。

Broadcom 的 APDS-9960 示意图图 1:Broadcom 的 APDS-9960 具有一个集成 IR LED 和四个定向光电二极管,可检测反射的 IR 能量以分析手势。(图片来源:Broadcom)

当 LED 发射红外能量时,除非遇到手等物体发生反射,否则能量就会发射至空气中。光电二极管将检测到不同强度的反射能量,具体取决于物体的位置。例如,相比位于手势后边缘的光电二极管,前边缘光电二极管最初接收的反射能量较少,从而导致一个光电二极管的计数值比另一个高。在手势动作过程中,连续测量将导致不同位置的光电二极管检测的反射能量强度不同,而分析该方向信息流即可确定手势。

例如,若用户用手从传感器的顶部轻扫至底部,则在手势动作之初,下方光电二极管检测的入射光比上方光电二极管更强;在手势动作期间,手逐渐移动到两个二极管接收能量相等的点;而在手势动作完成时,下方光电二极管接收的反射光较弱,而上方光电二极管接收的更强,此时两光电二极管的曲线和相位完全反转(图 2)。

Broadcom 的 APDS-9960 光电二极管曲线图图 2:Broadcom 的 APDS-9960 检测到向下手势将生成以上光电二极管曲线,其中主导曲线指示手势方向。(图片来源:Broadcom)

了解手势数据的生成原理后,下一步就来看看如何连接到 APDS-9960。

连接 Broadcom 的 APDS-9960 手势控制器

APDS-9960 采用 8 引脚表面贴装 (SMD-8) 封装,占用印刷电路板空间极小(图 3)。传感器尺寸仅为 3.94 × 2.36 × 1.35 mm。该封装包含正常电源和接地引脚、用于连接微控制器的 I2C 数字接口,以及用于定制 LED 驱动电路的引脚。此外,该封装还包含中断引脚,可用于通知微控制器处理可用的手势数据。

Broadcom 的 APDS-9960 采用紧凑型表面贴装 SMD-8 封装图片图 3:APDS-9960 采用紧凑型表面贴装 SMD-8 封装,可最大限度减少电路板空间。 (图片来源:Broadcom)

构建原型并连接 APDS-9960 有几种不同选项可供选择。例如,SparkFunAPDS-9960 评估板提供了包括 LED 驱动电路在内的小型分线板,以便实现开箱即用(图 4)。开发人员只需焊接针座以通过旁路绕过电源和接地,并将 I2C 总线和可选的中断引脚连接至微控制器,即可着手开发嵌入式软件了。此外,SparkFun 评估板还包含安装孔,若现有电路板有助于实现应用,则可直接运用到设计中。

SparkFun 的 APDS-9960 评估板图片图 4:SparkFun 的 APDS-9960 评估板包含着手开发手势控制所需的所有板载电路。(图片来源:DigiKey)

或者,开发人员也可使用 AdafruitAPDS-9960 分线板,这也是一款一体化解决方案(图 5)。Adafruit 分线板很有意思,尽管外形小巧,却还包含 3 V 板载稳压器,可用于为电源 LED 甚至低功耗微控制器等附加电路供电。最重要的是,Adafruit 为开发人员提供了完善的 Adafruit APDS9960 分线板用户指南,以及若干软件库可用于连接 Arduino 板或运行 Python 的开发板。因此,使用 APDS-9960 可轻松实现开箱即用,从而大幅缩短开发人员着手使用手势传感器所花费的时间。

Adafruit 的 APDS-9960 分线板图片图 5:Adafruit 的 APDS-9960 分线板包括 APDS-9960、3 V 板载稳压器和 I2C 电压转换电路以支持 3 V 或 5 V 总线。(图片来源:DigiKey)

连接上述分线板的最简单方法是将 Molex 22-28-4255 分离式针座焊接至电路板上。最好将针座朝下焊接,可实现多种优势:首先,可将电路板直接插入某个试验板,如 Digilent340-002-1 无焊试验板套件(图 6)。其次,不要在该电路板上表面接线,以免手势动作时意外触及挂在针座上的电线。

Adafruit 的 APDS-9960 分线板图片图 6:Digilent 无焊试验板上焊接好的 Adafruit APDS-9960 分线板。(图片来源:Adafruit)

此时,需要连接电源和接地,并将 I2C 总线连接至所需的微控制器开发板。任何带微控制器的开发板都可使用。但最好选择 STMicroelectronics 用于物联网节点的 B-L475E-IOT01A2 STM32L475 开发套件(图 7)。该开发板具有 Arduino 针座,并且由 MicroPython 提供支持,可在该开发板上轻松编程。完成此操作后,即可使用 Python 脚本连接手势传感器,从而使手势控制不仅可行,而且轻而易举。

STMicroelectronics 的 STM32L475 物联网节点开发套件图片图 7: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)

阅读该代码后,您定会发现若感测到手势,则将在屏幕上打印检测的手势(图 8)。

Adafruit 的 APDS-9960 CircuitPython 库手势输出结果示例图图 8:Adafruit 的 APDS-9960 CircuitPython 库手势输出结果示例。(图片来源:Adafruit)

手势可以数字形式输出,使用以下键值即可轻松转换:

0 = 未检测到手势

1 = 检测到向上手势

2 = 检测到向下手势

3 = 检测到向左手势

4 = 检测到向右手势

如图所示,借助预先导入的库,只需几行代码即可轻松实现基本手势识别。识别更为复杂的手势则需要修改库以分析原始手势数据。

构建手势控制器的技巧与诀窍

构建手势控制传感器并将其集成于产品着实具有一定挑战性。使用基于红外线的手势控制器时,开发人员需要考虑使用以下几个“技巧与诀窍”:

  • 使用手势传感器的内部接近检测器来触发手势控制引擎,从而最大限度地减少无效手势启动。
  • 从现有手势库开始,在现有功能的基础上构建其他手势。
  • 将光电二极管增益调整为适合最终手势应用的最佳值。
  • 将 LED 输出驱动强度调整为适合应用的最佳值,或许需要稍作调整才能获得可重复使用的数值。
  • 无论开发何种手势应用,开发人员都应从高级软件开发入手,待充分熟悉该传感器后再转而使用较低级别的代码。

遵循上述技巧有助于确保开发人员花费最短的时间来启动和运行 IR 手势控制器。

总结

人们不断追求以更自然、更直观的方式进行人机交互,而其中一种重要方式就是使用手势控制技术。尽管市面上手势控制技术种类繁多,但论及成本最低、使用最便捷的技术还属基于红外线的手势传感器。如上所述,如果开发人员利用现有的硬件和软件技术,则将手势传感器与微控制器集成在一起,亦可省时省力,简单易用。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Jacob Beningo

Jacob Beningo 是一位嵌入式软件顾问,目前与十几个国家的客户保持合作,通过帮助客户改善产品质量、降低成本和加快上市时间来大幅改变他们的业务。Jacob 先后发表了 200 多篇关于嵌入式软件开发技术的文章,是一位广受欢迎的演讲者和技术培训师。他拥有三个学位,其中包括密歇根大学的工程硕士学位。如有需要,欢迎随时通过 jacob@beningo.com 与其联系,也可访问其网站 www.beningo.com,并订阅其月度 Embedded Bytes Newsletter

关于此出版商

DigiKey 北美编辑