|
今天大多数手机都带有手势控制功能,可以打开或关闭任何应用程序、启动音乐、拨打电话等。这是一个非常方便的功能,可以节省时间,并且看起来很酷,可以用手势控制任何设备。我们以前使用加速度计来构建手势控制的机器人和手势控制的Air鼠标。但今天我们将学习将手势传感器APDS9960与Arduino进行连接。该传感器还具有RGB传感器以检测颜色,本文也将使用该传感器。因此,您不需要使用单独的传感器进行手势和颜色检测,尽管可以使用专用的颜色检测传感器。
必需的组件 ● Arduino UNO开发板 ● APDS9960 RGB和手势传感器、 ● 1602 LCD ● DPDT开关 ● 100K电位器和10K电阻
APDS-9960数字接近RGB和手势传感器简介 APDS9960是一款多功能传感器。它可以在光线下检测手势、环境光和RGB值。该传感器还可用作接近传感器,主要用于智能手机,以便在通话时禁用触摸屏。
该传感器由四个光电二极管组成。这些光电二极管检测由板载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提供电源。
电路原理图 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电阻。
编程Arduino用于手势和颜色感应 编程部分简单易用,本文末尾给出了完整程序。
首先,我们需要安装Sparkfun制作的库。要安装此库,请导航到Sketch-> Include Library-> Manage Libraries。
现在在搜索栏中键入“Sparkfun APDS9960”并在看到库时单击安装按钮。
我们准备好了。让我们开始吧。
首先,我们要包含所有必需的头文件。第一个头文件LiquidCrystal.h用于LCD功能。第二个头文件Wire.h用于I2C通信,最后一个SparkFun_APDS996.h用于APDS9960传感器。 - #include <LiquidCrystal.h>
- #include <Wire.h>
- #include <SparkFun_APDS9960.h>
复制代码
接下来我们已经为按钮和LCD定义了引脚。 - const int buttonPin = 7;
- const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
- LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
复制代码在下一部分中,我们为中断引脚定义了一个宏,该宏连接在数字引脚2上,一个变量buttonState用于当前状态按钮,isr_flag用于中断服务程序。 - #define APDS9960_INT 2
- int buttonState;
- int isr_flag = 0;
复制代码接下来,为SparkFun_APDS9960创建一个对象,以便我们可以访问手势移动并获取RGB值。 - SparkFun_APDS9960 apds = SparkFun_APDS9960();
- uint16_t ambient_light = 0;
- uint16_t red_light = 0;
- uint16_t green_light = 0;
- uint16_t blue_light = 0;
复制代码
在setup函数中,第一行是从按钮(低/高)获取值,第二行和第三行定义中断和按钮引脚作为输入。 apds.init()初始化APDS9960传感器,lcd.begin(16,2)初始化LCD。 - void setup()
- {
- buttonState = digitalRead(buttonPin);
- pinMode(APDS9960_INT, INPUT);
- pinMode(buttonPin, INPUT);
- apds.init();
- lcd.begin(16, 2);
- }
复制代码
在loop函数中,第一行从button获取值并将其存储在之前定义的buttonState变量中。现在接下来的行我们正在检查按钮的值,如果它是高,那么我们启用光传感器,如果它是低,则初始化手势传感器。
attachInterrupt()是一个用于外部中断的函数,在这种情况下是传感器的中断。该函数的第一个参数是中断号。在Arduino UNO中,有两个中断引脚数字引脚--2和3表示为INT.0和INT.1。我们已经将它连接到引脚2,所以我们在那里写了0。第二个参数调用稍后定义的函数interruptRoutine()。最后一个参数是FALLING,以便在引脚从高电平变为低电平时触发中断。在此处了解有关Arduino Interrupts的更多信息。 - void loop()
- {
- buttonState = digitalRead(buttonPin);
- if (buttonState == HIGH)
- {
- apds.enableLightSensor(true);
- }
复制代码
接下来中,我们检查按钮引脚。如果它为高电平,则启动RGB传感器的处理。然后检查光传感器是否正在读取值。如果无法读取值,那么在这种情况下,打印“读取灯值错误”。如果它可以读取值,则比较三种颜色的值和最高的值,将该颜色打印到LCD上。 - if (buttonState == HIGH)
- {
- if ( !apds.readAmbientLight(ambient_light) ||
- !apds.readRedLight(red_light) ||
- !apds.readGreenLight(green_light) ||
- !apds.readBlueLight(blue_light) ) {
- lcd.print("Error reading light values");
- } else {
- if (red_light > green_light)
- {
- if (red_light > blue_light)
- {
- lcd.print("Red");
- delay (1000);
- lcd.clear();
- }
- …….
- ………..
复制代码
在下一行再次检查按钮引脚,如果它是低电平,则处理手势传感器。然后检查isr_flag,如果是1则调用函数detachInterrupt()。该函数用于关闭中断。下一行调用handleGesture(),它是稍后定义的函数。在接下来的行中,将isr_flag定义为零并附加中断。 - else if (buttonState == LOW)
- {
- if ( isr_flag == 1 )
- {
- detachInterrupt(0);
- handleGesture();
- isr_flag = 0;
- attachInterrupt(0, interruptRoutine, FALLING);
- }
- }
复制代码
接下来是interruptRoutine()函数。此函数用于转换isr_flag变量1,以便可以初始化中断服务。 - void interruptRoutine().
- {
- isr_flag = 1;
- }
复制代码
在下一部分中定义handleGesture()函数。该函数首先检查手势传感器的可用性。如果它可用,则它会读取手势值并检查手势值(UP,DOWN,RIGHT,LEFT,FAR,NEAR)并将相应的值打印到LCD。 - void handleGesture()
- {
- if ( apds.isGestureAvailable() )
- {
- switch ( apds.readGesture() )
- {
- case DIR_UP:
- lcd.print("UP");
- delay (1000);
- lcd.clear();
- break;
- case DIR_DOWN:
- lcd.print("DOWN");
- delay (1000);
- lcd.clear();
- break;
- case DIR_LEFT:
- lcd.print("LEFT");
- delay (1000);
- lcd.clear();
- break;
- case DIR_RIGHT:
- lcd.print("RIGHT");
- delay (1000);
- lcd.clear();
- break;
- case DIR_NEAR:
- lcd.print("NEAR");
- delay (1000);
- lcd.clear();
- break;
- case DIR_FAR:
- lcd.print("FAR");
- delay (1000);
- lcd.clear();
- break;
- default:
- lcd.print("NONE");
- delay (1000);
- lcd.clear();
- }
- }
- }
复制代码
最后,将代码上传到Arduino并等待传感器初始化。 现在,当按钮关闭时意味着它处于手势模式。 因此,请尝试向左、向右、向上、向下移动您的手。 对于远处的手势,将手放在离传感器2-4英寸的距离处2-3秒并将其移除。 并且为了接近手势,请将手远离传感器,然后将其靠近并将其移除。
现在打开按钮使其进入颜色感应模式,并将红色、蓝色和绿色物体逐个靠近传感器。 它将打印对象的颜色。
代码 本文使用的完整代码如下所示:
main.rar
(855 Bytes, 下载次数: 98)
|