风筝
发表于: 2019-8-6 13:11:25 | 显示全部楼层

今天大多数手机都带有手势控制功能,可以打开或关闭任何应用程序、启动音乐、拨打电话等。这是一个非常方便的功能,可以节省时间,并且看起来很酷,可以用手势控制任何设备。我们以前使用加速度计来构建手势控制的机器人和手势控制的Air鼠标。但今天我们将学习将手势传感器APDS9960与Arduino进行连接。该传感器还具有RGB传感器以检测颜色,本文也将使用该传感器。因此,您不需要使用单独的传感器进行手势和颜色检测,尽管可以使用专用的颜色检测传感器。


必需的组件

●    Arduino UNO开发板

●    APDS9960 RGB和手势传感器、

●    1602 LCD

●    DPDT开关

●    100K电位器和10K电阻


APDS-9960数字接近RGB和手势传感器简介

APDS9960是一款多功能传感器。它可以在光线下检测手势、环境光和RGB值。该传感器还可用作接近传感器,主要用于智能手机,以便在通话时禁用触摸屏。

APDS-9960-Digital-Proximity-RGB-and-Gesture-Sensor.jpg

该传感器由四个光电二极管组成。这些光电二极管检测由板载LED传输的反射IR能量。因此,无论何时执行任何手势,该IR能量都被阻挡并反射回传感器,现在传感器检测到关于手势的信息(方向、速度)并将其转换为数字信息。该传感器可用于通过检测反射的IR光来测量障碍物的距离。它具有用于检测RGB颜色的UV和IR阻挡滤光器,并为每种颜色生成16位数据。


APDS-9960传感器的引脚如下所示。该传感器适用于I2C通信协议。它消耗1μA电流并由3.3V供电,因此要小心,不要将其与5V引脚连接。这里的INT引脚是中断引脚,用于驱动I2C通信。如果没有连接PS跳线,VL引脚是板载LED的可选电源引脚。如果PS跳线关闭,那么您只需要为VCC引脚供电,它将为模块和IR LED提供电源。

APDS-9960-Digital-Proximity-RGB-and-Gesture-Sensor-Pinout.png


电路原理图

APDS960与Arduino的连接非常简单。我们将使用DPDT按钮在RGB Sensing和Gesture Sensing两种模式之间切换。首先,APDS9960的I2C通信引脚SDA和SCL分别连接到Arduino引脚A4和A5。如前所述,传感器的工作电压为3.3V,因此APDS9960的VCC和GND连接到Arduino的3.3V和GND。 APDS9960的中断引脚(INT)连接到Arduino的D2引脚。


对于LCD,数据引脚(D4-D7)连接到Arduino和RS的数字引脚D6-D3,EN引脚连接到Arduino的D6和D7。 LCD的V0连接到电位器,100K电位器用于控制LCD的亮度。对于DPDT按钮,我们只使用了3个引脚。第二个引脚连接到Arduino的D7引脚用于输入,另外两个连接到GND和VCC,接着是10K电阻。

Circuit-Diagram-for-APDS9960-RGB-and-Gesture-Sensor-with-Arduino.png


编程Arduino用于手势和颜色感应

编程部分简单易用,本文末尾给出了完整程序。


首先,我们需要安装Sparkfun制作的库。要安装此库,请导航到Sketch-> Include Library-> Manage Libraries。

Programming-Arduino-for-Gesture-and-Color-Sensing.png

现在在搜索栏中键入“Sparkfun APDS9960”并在看到库时单击安装按钮。 Installing-APDS-9960-Sensor-Library-in-Arduino.png

我们准备好了。让我们开始吧。


首先,我们要包含所有必需的头文件。第一个头文件LiquidCrystal.h用于LCD功能。第二个头文件Wire.h用于I2C通信,最后一个SparkFun_APDS996.h用于APDS9960传感器。

  1. #include <LiquidCrystal.h>
  2. #include <Wire.h>
  3. #include <SparkFun_APDS9960.h>
复制代码

接下来我们已经为按钮和LCD定义了引脚。

  1. const int buttonPin = 7;
  2. const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
  3. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
复制代码

在下一部分中,我们为中断引脚定义了一个宏,该宏连接在数字引脚2上,一个变量buttonState用于当前状态按钮,isr_flag用于中断服务程序。

  1. #define APDS9960_INT 2
  2. int buttonState;
  3. int isr_flag = 0;
复制代码

接下来,为SparkFun_APDS9960创建一个对象,以便我们可以访问手势移动并获取RGB值。

  1. SparkFun_APDS9960 apds = SparkFun_APDS9960();
  2. uint16_t ambient_light = 0;
  3. uint16_t red_light = 0;
  4. uint16_t green_light = 0;
  5. uint16_t blue_light = 0;
复制代码

在setup函数中,第一行是从按钮(低/高)获取值,第二行和第三行定义中断和按钮引脚作为输入。 apds.init()初始化APDS9960传感器,lcd.begin(16,2)初始化LCD。

  1. void setup()
  2. {
  3.   buttonState = digitalRead(buttonPin);
  4.   pinMode(APDS9960_INT, INPUT);
  5.   pinMode(buttonPin, INPUT);
  6.   apds.init();
  7.   lcd.begin(16, 2);
  8. }
复制代码

在loop函数中,第一行从button获取值并将其存储在之前定义的buttonState变量中。现在接下来的行我们正在检查按钮的值,如果它是高,那么我们启用光传感器,如果它是低,则初始化手势传感器。


attachInterrupt()是一个用于外部中断的函数,在这种情况下是传感器的中断。该函数的第一个参数是中断号。在Arduino UNO中,有两个中断引脚数字引脚--2和3表示为INT.0和INT.1。我们已经将它连接到引脚2,所以我们在那里写了0。第二个参数调用稍后定义的函数interruptRoutine()。最后一个参数是FALLING,以便在引脚从高电平变为低电平时触发中断。在此处了解有关Arduino Interrupts的更多信息。

  1. void loop()
  2. {
  3.   buttonState = digitalRead(buttonPin);
  4.   if (buttonState == HIGH)
  5.   {
  6.    apds.enableLightSensor(true);
  7.   }
复制代码

接下来中,我们检查按钮引脚。如果它为高电平,则启动RGB传感器的处理。然后检查光传感器是否正在读取值。如果无法读取值,那么在这种情况下,打印“读取灯值错误”。如果它可以读取值,则比较三种颜色的值和最高的值,将该颜色打印到LCD上。

  1. if (buttonState == HIGH)
  2.   {
  3.     if (  !apds.readAmbientLight(ambient_light) ||
  4.           !apds.readRedLight(red_light) ||
  5.           !apds.readGreenLight(green_light) ||
  6.           !apds.readBlueLight(blue_light) ) {
  7.       lcd.print("Error reading light values");
  8.     } else {
  9.       if (red_light > green_light)
  10.       {
  11.         if (red_light > blue_light)
  12.         {
  13.           lcd.print("Red");
  14.           delay (1000);
  15.           lcd.clear();
  16.         }
  17. …….
  18. ………..
复制代码

在下一行再次检查按钮引脚,如果它是低电平,则处理手势传感器。然后检查isr_flag,如果是1则调用函数detachInterrupt()。该函数用于关闭中断。下一行调用handleGesture(),它是稍后定义的函数。在接下来的行中,将isr_flag定义为零并附加中断。

  1.   else if (buttonState == LOW)
  2.   {
  3.     if ( isr_flag == 1 )
  4.     {
  5.       detachInterrupt(0);
  6.       handleGesture();
  7.       isr_flag = 0;
  8.       attachInterrupt(0, interruptRoutine, FALLING);
  9.     }
  10.   }
复制代码

接下来是interruptRoutine()函数。此函数用于转换isr_flag变量1,以便可以初始化中断服务。

  1. void interruptRoutine().
  2. {
  3.   isr_flag = 1;
  4. }
复制代码

在下一部分中定义handleGesture()函数。该函数首先检查手势传感器的可用性。如果它可用,则它会读取手势值并检查手势值(UP,DOWN,RIGHT,LEFT,FAR,NEAR)并将相应的值打印到LCD。

  1. void handleGesture()
  2. {
  3.   if ( apds.isGestureAvailable() )
  4.   {
  5.     switch ( apds.readGesture() )
  6.     {
  7.       case DIR_UP:
  8.         lcd.print("UP");
  9.         delay (1000);
  10.         lcd.clear();
  11.         break;
  12.       case DIR_DOWN:
  13.         lcd.print("DOWN");
  14.         delay (1000);
  15.         lcd.clear();
  16.         break;
  17.       case DIR_LEFT:
  18.         lcd.print("LEFT");
  19.         delay (1000);
  20.         lcd.clear();
  21.         break;
  22.       case DIR_RIGHT:
  23.         lcd.print("RIGHT");
  24.         delay (1000);
  25.         lcd.clear();
  26.         break;
  27.       case DIR_NEAR:
  28.         lcd.print("NEAR");
  29.         delay (1000);
  30.         lcd.clear();
  31.         break;
  32.       case DIR_FAR:
  33.         lcd.print("FAR");
  34.         delay (1000);
  35.         lcd.clear();
  36.         break;
  37.       default:
  38.         lcd.print("NONE");
  39.         delay (1000);
  40.         lcd.clear();
  41.     }
  42.   }
  43. }
复制代码

最后,将代码上传到Arduino并等待传感器初始化。 现在,当按钮关闭时意味着它处于手势模式。 因此,请尝试向左、向右、向上、向下移动您的手。 对于远处的手势,将手放在离传感器2-4英寸的距离处2-3秒并将其移除。 并且为了接近手势,请将手远离传感器,然后将其靠近并将其移除。

Interfacing-APDS9960-RGB-and-Gesture-Sensor-with-Arduino.jpg

现在打开按钮使其进入颜色感应模式,并将红色、蓝色和绿色物体逐个靠近传感器。 它将打印对象的颜色。

Circuit-Hardware-for-APDS9960-RGB-and-Gesture-Sensor-with-Arduino.jpg


代码

本文使用的完整代码如下所示: main.rar (855 Bytes, 下载次数: 96)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-24 23:44 , Processed in 0.053900 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表