如今,大多数电话都具有手势控制功能,可以打开或关闭任何应用程序,开始音乐,参加通话等。这是一个非常方便的功能,可以节省时间,并且用手势控制任何设备看起来也很酷。我们以前使用加速度计来构建手势控制的机器人和手势控制的Air鼠标。但是今天,我们学习了将手势传感器APDS9960与Arduino接口的方法 。该传感器还具有用于检测颜色的RGB传感器,本教程中还将使用该传感器。因此,尽管可以使用专用传感器进行颜色检测,但您无需为手势和颜色检测使用单独的传感器-TCS3200颜色传感器,我们已经将其与Arduino一起使用来构建颜色分选机。
所需组件
- Arduino UNO
- APDS9960 RGB和手势传感器
- 16x2 LCD
- DPDT开关
- 100K电位器和10K电阻
- 跨接电缆
APDS-9960数字接近RGB和手势传感器简介
APDS9960是多功能传感器。它可以检测手势,环境光和光线中的RGB值。该传感器还可以用作接近传感器,并且主要用于智能手机中,以在通话时禁用触摸屏。
该传感器包括四个光电二极管。这些光电二极管检测板载LED传输的反射IR能量。因此,无论何时执行任何手势,IR能量都将被阻塞并反射回传感器,现在传感器会检测到有关手势的信息(方向,速度)并将其转换为数字信息。该传感器可通过检测反射的红外光来测量障碍物的距离。它具有用于感测RGB颜色的UV和IR阻挡滤镜,并且为每种颜色生成16位数据。
APDS-9960传感器的引脚排列如下所示。该传感器适用于I 2 C通信协议。它消耗1µA的电流并由3.3V供电,因此请注意不要将其与5V引脚连接。此处的INT引脚为中断引脚,用于驱动I 2 C通信。如果未连接PS跳线,则VL引脚是板载LED的可选电源引脚。如果PS跳线关闭,则只需为VCC引脚供电,它将为模块和IR LED两者供电。
电路原理图
APDS960与Arduino的连接非常简单。我们将使用DPDT按钮在RGB感应和手势感应这两种模式之间切换。首先,APDS9960的I2C通信引脚SDA和SCL分别连接到Arduino引脚A4和A5。如前所述,传感器的工作电压为3.3v,因此,APDS9960的VCC和GND连接到Arduino的3.3V和GND。 APDS9960的中断引脚(INT)连接到Arduino的D2引脚。
对于LCD,数据引脚(D4-D7)连接到Arduino的数字引脚D6-D3,RS和EN引脚连接到Arduino的D6和D7。LCD的V0连接到电位器,一个100K电位器用于控制LCD的亮度。对于DPDT按钮,我们仅使用了3个引脚。第二个引脚连接到Arduino的D7引脚进行输入,另外两个连接到GND和VCC,然后连接一个10K电阻。
编程Arduino进行手势和色彩感应
编程部分非常简单,并且在本教程的结尾给出了带有演示视频的完整程序。
首先,我们需要安装由Sparkfun制造的库。要安装此库,请导航至“ 草图”->“包含库”->“管理库”。
现在,在搜索栏中键入“ Sparkfun APDS9960”,然后在看到库时单击安装按钮。
我们已经准备好出发了。让我们开始吧。
因此,首先我们必须包括所有必需的头文件。第一个头文件 LiquidCrystal.h 用于LCD功能。第二个头文件 Wire.h 用于I 2 C通信,最后一个 SparkFun_APDS996.h 用于APDS9960传感器。
#包括
现在,在接下来的几行中,我们定义了按钮和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 environmental_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
在 设置 功能中,第一行从按钮(低/高)获取值,第二行和第三行将中断和按钮引脚定义为输入。 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); }
在 循环 函数中,第一行从button获取值并将其存储在先前定义的 buttonState 变量中。现在,在接下来的几行中,我们正在检查按钮的值,如果该值较高,则启用光传感器,如果该值较低,则初始化手势传感器。
所述 attachInterrupt() 是用于外部中断的功能在这种情况下是传感器的中断。该函数的第一个参数是中断号。在Arduino UNO中,有两个中断引脚数字引脚-INT.0和INT.1表示为数字引脚2和3。并且我们已经将其连接到引脚2,因此我们在此处写入了0。第二个参数调用稍后定义的函数 interruptRoutine() 。最后一个参数是 FALLING, 因此当引脚从高电平变为低电平时,它将触发中断。在此处了解有关Arduino中断的更多信息。
无效循环() { buttonState = digitalRead(buttonPin); 如果(buttonState == HIGH) { apds.enableLightSensor(true); }
在下一部分中,我们检查按钮销。如果过高,则开始RGB传感器的处理。然后检查光传感器是否正在读取值。如果无法读取该值,则在这种情况下,打印“ 错误读取光值”。 然后,如果它可以读取值,则比较这三种颜色的值,并比较两者中的最大值,然后将该颜色打印到LCD上。
如果(buttonState == HIGH) { 如果(apds.readAmbientLight(ambient_light) - !apds.readRedLight(red_light) - !apds.readGreenLight(green_light) - !apds.readBlueLight(blue_light)){ lcd.print( “读取光值时出错”); } else { if(red_light> green_light) { if(red_light> blue_light) { lcd.print(“ Red”); 延迟(1000); lcd.clear(); } ……。 …………..
在下几行中,再次检查按钮销,如果销低,则处理手势传感器。然后检查 isr_flag 是否为1,然后调用函数 detachInterrupt() 。该功能用于关闭中断。下一行调用 handleGesture() ,稍后将对其进行定义。在接下来的 几 行中,将 isr_flag 定义为零并附加中断。
否则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() 函数是在接下来的部分限定。此功能首先检查手势传感器的可用性。如果可用,则它将读取手势值并检查它是哪个手势(上,下,右,左,远,近)并将相应的值打印到LCD。
void handleGesture() { if(apds.isGestureAvailable()) { switch(apds.readGesture()) { case DIR_UP: lcd.print(“ UP”); 延迟(1000); lcd.clear(); 打破; 情况DIR_DOWN: lcd.print(“ DOWN”); 延迟(1000); lcd.clear(); 打破; 情况DIR_LEFT: lcd.print(“ LEFT”); 延迟(1000); lcd.clear(); 打破; 大小写DIR_RIGHT: lcd.print(“ RIGHT”); 延迟(1000); lcd.clear(); 打破; 情况DIR_NEAR: lcd.print(“ NEAR”); 延迟(1000); lcd.clear(); 打破; 情况DIR_FAR: lcd.print(“ FAR”); 延迟(1000); lcd.clear(); 打破; 默认值: lcd.print(“ NONE”); 延迟(1000); lcd.clear(); } } }
最后,将代码上传到Arduino,然后等待传感器初始化。现在,当按钮关闭时,表示它处于手势模式。因此,请尝试沿左,右,上,下方向移动手。要获得 较远的 手势,请将手与传感器保持2-4英寸的距离2-3秒,然后将其移开。对于 近距离 手势,请将手远离传感器,然后将其靠近并移开。
现在,打开按钮,使其进入色彩感应模式,并将红色,蓝色和绿色的物体一一靠近传感器。它将打印对象的颜色。