搜索代码

APDS-9960 手势传感器与 Arduino

APDS-9960 手势传感器与 Arduino

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

APDS-9960 gesture sensor module -1

硬件揭秘

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线路上使用上拉电阻以确保可靠通信。
  • 将传感器远离直射阳光,以确保准确的读数。
  • 确保在代码中正确初始化传感器。
  • 检查接线连接,以避免漂浮输入。

接线说明

Arduino wiring for APDS9960 Gesture sensor
Arduino wiring for APDS9960 Gesture sensor

要将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...
    }
  }
}

在此功能中,手势被读取,并根据检测到的方向采取相应的动作。这允许根据手部动作进行互动控制。 要完整理解代码,请参阅文章下方加载的完整程序。

APDS-9960 gesture sensor -3

演示 / 期待什么

设置完成后,您可以期待 Arduino 读取手势,并在串行监视器上显示检测到的方向。简单的测试包括在传感器前将手向上、向下、向左或向右移动。如果所有连接正确,您应该会在串行监视器上看到相应的输出,以确认手势识别。请注意浮动输入,因为它们可能导致不一致的读数(视频时间为 05:20)。

视频时间戳

  • 00:00- 引言
  • 01:15- 硬件概述
  • 03:00- 接线说明
  • 04:30- 代码演示
  • 06:15- 演示

图像

APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -1
APDS-9960 gesture sensor module -1
APDS-9960 gesture sensor -3
APDS-9960 gesture sensor -3
Arduino wiring for APDS9960 Gesture sensor
Arduino wiring for APDS9960 Gesture sensor
1-Code for an APDS-9960 gesture sensor for Arduino
语言: C++
/*
 * 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");
    }
  }
}
2-Source code for controlling a servo with your hand
语言: C++
/*
 * 由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");
    }
  }
}

资源与参考

尚无可用资源。

文件📁

其他文件