APDS-9960 手势传感器与 Arduino
APDS-9960 手势传感器允许检测手势,例如滑动和接近。在本教程中,我们将演示如何将 APDS-9960 连接到 Arduino,并为其编程以识别手势。最终的结果将是一个简单的设置,可以检测运动并通过串口监视器报告这些运动。本指南将帮助您了解所需的接线和代码,以开始使用手势传感器。(视频中在 00:30)

硬件揭秘
APDS-9960 是一种多功能传感器,结合了 RGB 颜色感应、环境光感应、接近感应和手势检测能力。它通过 I2C 与 Arduino 进行通信,便于简单的集成,并且 wiring 最少。该传感器仅在 3.3V 下工作,因此必须确保适当的电压水平以避免损坏设备。 在这个构建中,我们将使用 Arduino 读取手势数据。传感器通过中断输出手势信息,这使得 Arduino 能够迅速响应手部动作。将 APDS-9960 与 Arduino 集成为互动项目提供了许多可能性,包括手势控制设备。
数据表详情
| 制造商 | 博通 |
|---|---|
| 零件编号 | APDS-9960 |
| 逻辑/输入输出电压 | 2.7 - 3.6 伏 |
| 供电电压 | 3.3 伏 |
| 输出电流(每通道) | 1 毫安 |
| 峰值电流(每通道) | 10 毫安 |
| PWM频率指导 | 100 赫兹 |
| 输入逻辑阈值 | 0.3 x VDD(低),0.7 x VDD(高) |
| 电压降 / RDS(on)/ 饱和度 | 0.5 V 最大 |
| 热限制 | -40到+85°C |
| 包裹 | 6针LGA |
| 备注 / 变体 | 支持I2C通信 |
- 确保供电电压不超过3.6 V,以防止损坏。
- 在I2C线路上使用上拉电阻以确保可靠通信。
- 将传感器远离直射阳光,以确保准确的读数。
- 确保在代码中正确初始化传感器。
- 检查接线连接,以避免漂浮输入。
接线说明

要将APDS-9960连接到Arduino,首先连接电源。使用红色电线将APDS-9960的VCC引脚连接到Arduino的3.3V引脚。接下来,使用黑色电线将传感器的GND引脚连接到Arduino的接地引脚。 现在,对于I2C通信,将APDS-9960的SDA引脚连接到Arduino的A4引脚。同样,将SCL引脚连接到Arduino的A5引脚。最后,将传感器的INT引脚连接到Arduino的2号引脚。这将使Arduino能够响应传感器生成的中断。
代码示例与演示
提供的代码初始化了 APDS-9960 传感器,并设置 Arduino 以读取手势。以下是设置函数的简要摘录:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
attachInterrupt(0, interruptRoutine, FALLING);
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
}
}在这个代码片段中,我们初始化串行监视器并设置中断引脚。传感器被初始化,并向控制台打印确认消息。 接下来,我们在循环函数中检查手势:
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}在这里,循环不断检查手势。当检测到手势时,中断被禁用,并调用 `handleGesture` 函数来处理手势。 最后,`handleGesture` 函数处理检测到的手势:
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
// Additional cases...
}
}
}在此功能中,手势被读取,并根据检测到的方向采取相应的动作。这允许根据手部动作进行互动控制。 要完整理解代码,请参阅文章下方加载的完整程序。

演示 / 期待什么
设置完成后,您可以期待 Arduino 读取手势,并在串行监视器上显示检测到的方向。简单的测试包括在传感器前将手向上、向下、向左或向右移动。如果所有连接正确,您应该会在串行监视器上看到相应的输出,以确认手势识别。请注意浮动输入,因为它们可能导致不一致的读数(视频时间为 05:20)。
视频时间戳
- 00:00- 引言
- 01:15- 硬件概述
- 03:00- 接线说明
- 04:30- 代码演示
- 06:15- 演示
/*
* APDS-9960手势传感器的Arduino代码
* 此代码用于检测您的手势,无论是向上、向下、向左或向右移动;其他手势也可以被检测并用于控制其他东西。
*
* 观看APDS-9960手势传感器视频 https://youtu.be/qzSgZV_fbxI
* 在 https://robojax.com 获取此代码
*
* 视频中使用的代码由Ahmad Shamshiri为Robojax.com编写
* 于2016年12月31日,上午6:53 在加拿大安大略省Ajax
* 授权分享此代码,前提是此备注与代码一起保留。
* 免责声明:此代码为“按原样”提供,仅用于教育目的。
*
* GestureTest.ino
* APDS-9960 RGB和手势传感器
* Shawn Hymel @ SparkFun Electronics
* 2014年5月30日
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* 测试APDS-9960的手势感应能力。通过I2C配置APDS-9960并等待手势事件。计算滑动方向(向上、向下、向左、向右)并在串口控制台上显示。
*
* 要执行近距离手势,保持您的手在传感器上方,并将其移动到离传感器2英寸内的地方。将手保持在该位置至少1秒钟,然后移开。
*
* 要执行远距离手势,将手保持在传感器2英寸内至少1秒钟,然后将其移开(超出范围)。
*
* 硬件连接:
*
* 重要:APDS-9960只能接受3.3V!
*
* Arduino引脚 APDS-9960板功能
*
* 3.3V VCC 电源
* GND GND 接地
* A4 SDA I2C 数据
* A5 SCL I2C 时钟
* 2 INT 中断
*
* 资源:
* 包含Wire.h和SparkFun_APDS-9960.h
*
* 开发环境细节:
* 在Arduino 1.0.5中编写
* 使用SparkFun Arduino Pro Mini 3.3V进行测试
*
* 此代码是啤酒软件;如果您在当地见到我(或任何其他SparkFun员工),并且您觉得我们的代码有帮助,请请我们喝一轮!
*
* 按原样分发;不提供任何保证。
*/
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // 创建伺服对象以控制伺服器。
// 针
#define APDS9960_INT 2 // 需要一个中断引脚
// 常量
// 全局变量
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
// 将中断引脚设置为输入
pinMode(APDS9960_INT, INPUT);
// 初始化串口
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// 初始化中断服务例程
attachInterrupt(0, interruptRoutine, FALLING);
// 初始化 APDS-9960(配置 I2C 和初始值)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// 开始运行 APDS-9960 手势传感器引擎
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}
}
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
break;
case DIR_RIGHT:
Serial.println("RIGHT");
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
/*
* 由A.B.S.于2017年5月9日在加拿大安大略省Ajax为RoboJax修改。 www.RoboJax.com
*
* 原始来源:
* APDS-9960 RGB和手势传感器
* Shawn Hymel @ SparkFun电子
* 2014年5月30日
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* 按原样分发;不提供任何保证。
*/
#include <Wire.h>
// 由RoboJax添加
#include <Servo.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // 创建伺服对象以控制伺服器 // RoboJax 添加
// 插针
#define APDS9960_INT 2 // 需要是一个中断引脚
// 常量
// 全局变量
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
myservo.attach(9); // 将第9脚上的伺服电机连接到伺服对象上
// 将中断引脚设置为输入
pinMode(APDS9960_INT, INPUT);
// 初始化串口
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// 初始化中断服务例程
attachInterrupt(0, interruptRoutine, FALLING);
// 初始化APDS-9960(配置I2C和初始值)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// 启动APDS-9960手势传感器引擎
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}
}
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
myservo.write(180); // 由RoboJax添加
break;
case DIR_RIGHT:
Serial.println("RIGHT");
myservo.write(0); // 由RoboJax添加
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
资源与参考
尚无可用资源。