美文网首页ArduinoArduino动手做雕爷学编程
【雕爷学编程】Arduino动手做(95)---GY9960手势

【雕爷学编程】Arduino动手做(95)---GY9960手势

作者: 驴友花雕 | 来源:发表于2022-01-11 10:14 被阅读0次

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

    实验九十五:APDS-9960 GY-9960-3.3 RGB红外手势传感器 方向识别模块

    0.jpg

    APDS-9960
    具有先进的手势检测、接近检测和数字环境光感应功能,是一款采用单个 8 引脚封装的数字 RGB、环境光、近程和手势传感器装置。该装置具有与 I2C 兼容的接口,为红色、绿色、蓝色、透明 (RGBC),近程和手势感测配有红外 LED。RGB 和环境光感测功能可在多种光条件下以及通过多种减振材料包括深色玻璃的情况下,检测出光强度。此外,集成 UV-IR 遮光滤光片可实现精准的环境光和相关色温感测。

    01.jpg 02.jpg

    主要特征
    光学模块中的 RGBC 光传感器和带红外 LED 的近程和手势检测器
    微型封装尺寸:3.94(长)x 2.36(宽)x 1.35(高)毫米
    I2C 接口与专用中断引脚兼容
    深色玻璃后运作的高灵敏度
    RGBC 光感测,带有集成 UV-IR 遮光滤光片
    几何排列的 RGBC 二极管可提供统一的角度响应
    校准至 100 毫米检测距离,无需客户的最终产品校准
    四个独立的二极管可感应不同的方向
    配有可见光遮光滤光片的近程和手势感测
    受专利保护的屏蔽设计,将近程串扰将至最低
    集成光学透镜,校准红外 LED 光束并提升光电二极管的灵敏度。
    低功耗:睡眠模式功率为 1.0 微安典型值

    03.jpg

    手势检测
    APDS-9960是一款集成 ALS红外 LED 和接近检测器的光学模块和环境亮度感测 (ALS, Ambient Light Sensing)的环境亮度传感器,使用双光二极管来近似 0.01 lux 照度近似人眼的视觉反应,带有上限和下限阈值的可编程中断功能,高达16位分辨率,即使在深色玻璃后也能高灵活运作,接近传感器经过完全调校可进行100毫米物体检测,免除终端设备和次组件的工厂校准需求。环境光动态范围也从之前大10K lux增大到30K lux,太阳光校准大增至50K lux,大大提升了灵敏度并避免了强光干扰。可以在大1.0mm的Air Gap下精准工作,不用做外部隔离处理,极大的方便了客户的结构设计。其等待状态功耗 - 90µA 典型值,睡眠模式功率 - 2.2µA 典型值,更能节省能源;高达 400kHz (I²C 快速模式)专用中断引脚,提供 I²C 接口兼容,可以适应所有手机硬件平台和接口电压,全集成方案,方便结构和电路设计。

    04.jpg

    这是一个 RGB和手势传感器模块,小接口板具有内置APDS-9960芯片,提供环境光与颜色测量,接近检测和非接触手势检测。有了这个RGB和手势感应器,你就可以控制一台计算机,单片机,机器人,它比你的手一个简单的刷卡功能强大的多!实际上,该手势传感器APDS-9960在三星Galaxy S5中使用。该APDS-9960是一个极小的传感器,内置紫外线和红外线阻隔滤镜,四个单独的二极管不同方向的敏感,以及一个I2C兼容接口。为了使用方便,设计出了以下引脚:VL(可选功率IR LED),GND(地),VCC(电源,APDS-9960传感器),SDA(I2C数据),SCL(时钟I2C)和INT(中断)。每个APDS-9960还具有4至8英寸(10至20cm)的检测范围。

    04-.jpg

    模块电原理图


    4--.jpg

    APDS-9960手势检测模块参数与特点:
    工作电压:3.3V
    环境光及RGB色彩感应
    接近检测
    手势检测
    测量范围:4-8in(10-20CM)
    I2C接口(I2C地址:0x39)

    对于APDS
    SDA = A4
    SCL = A5
    GND = GND
    VCC = 3.3V

    05.jpg 06.jpg 06-.jpg 07.jpg 08.jpeg

    实验开源代码

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
    实验九十五:APDS-9960 GY-9960-3.3 RGB红外手势传感器 方向识别模块
    
    1、工具-管理库-搜索“SparkFun_APDS-9960”库-安装
    
    2、项目:串口显示测量的四组数据(未接入LCD)
    
    3、实验接脚
    
    SDA = A4
    
    SCL = A5
    
    GND = GND
    
    VCC = 3.3V
    
    */
    
    
    
    #include <Wire.h>
    
    #include <SparkFun_APDS9960.h>
    
    #include <LiquidCrystal.h>
    
    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;
    
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    
    
    
    void setup() {
    
     lcd.begin(16, 2);
    
     Serial.begin(9600);
    
     Serial.println();
    
     Serial.println(F("--------------------------------"));
    
     Serial.println(F("SparkFun APDS-9960 - ColorSensor"));
    
     Serial.println(F("--------------------------------"));
    
     if ( apds.init() ) {
    
      Serial.println(F("APDS-9960 initialization complete"));
    
     } else {
    
      Serial.println(F("Something went wrong during APDS-9960 init!"));
    
     }
    
     if ( apds.enableLightSensor(false) ) {
    
      Serial.println(F("Light sensor is now running"));
    
     } else {
    
      Serial.println(F("Something went wrong during light sensor init!"));
    
     }
    
     delay(500);
    
    }
    
    
    
    void loop() {
    
     if ( !apds.readAmbientLight(ambient_light) ||
    
        !apds.readRedLight(red_light) ||
    
        !apds.readGreenLight(green_light) ||
    
        !apds.readBlueLight(blue_light) ) {
    
      Serial.println("Error reading light values");
    
     } else {
    
      Serial.print("Ambient: ");
    
      Serial.print(ambient_light);
    
      lcd.setCursor(1, 0);
    
       lcd.print(red_light);
    
      Serial.print(" Red: ");
    
      Serial.print(red_light);
    
       lcd.setCursor(7, 0);
    
       lcd.print(green_light);
    
      Serial.print(" Green: ");
    
      Serial.print(green_light);
    
       lcd.setCursor(1, 1);
    
       lcd.print(blue_light);
    
      Serial.print(" Blue: ");
    
      Serial.println(blue_light);
    
     }
    
     delay(1000);
    
    }
    

    实验串口返回情况,不同手势,四组数据各不相同

    09.jpg

    实验开源代码之二

    
    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
    实验九十五:APDS-9960 GY-9960-3.3 RGB红外手势传感器 方向识别模块
    
    1、工具-管理库-搜索“SparkFun_APDS-9960”库-安装
    
    2、项目二:接入中断,串口显示7个不同的手势符号
    
    UP=向上
    
    DOWN=向下
    
    LEFT=向左
    
    RIGHT=向右
    
    NEAR=向近
    
    FAR=向远
    
    NONE=无动作
    
    3、实验接脚
    
    INT = D2
    
    SDA = A4
    
    SCL = A5
    
    GND = GND
    
    VCC = 3.3V
    
    */
    
    
    
    #include <Wire.h>
    
    #include <SparkFun_APDS9960.h>
    
    // Pins
    
    #define APDS9960_INT  2 // Needs to be an interrupt pin
    
    // Constants
    
    // Global Variables
    
    SparkFun_APDS9960 apds = SparkFun_APDS9960();
    
    int isr_flag = 0;
    
    
    
    void setup() {
    
     // Initialize Serial port
    
     Serial.begin(9600);
    
     Serial.println();
    
     Serial.println(F("--------------------------------"));
    
     Serial.println(F("SparkFun APDS-9960 - GestureTest"));
    
     Serial.println(F("--------------------------------"));
    
     // Initialize interrupt service routine
    
     attachInterrupt(0, interruptRoutine, FALLING);
    
     // Initialize APDS-9960 (configure I2C and initial values)
    
     if ( apds.init() ) {
    
      Serial.println(F("APDS-9960 initialization complete"));
    
     } else {
    
      Serial.println(F("Something went wrong during APDS-9960 init!"));
    
     }
    
     // Start running the APDS-9960 gesture sensor engine
    
     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");
    
      }
    
     }
    
    }
    

    实验串口返回情况


    12.jpg

    实验开源图形编程(Mind+、Mixly、编玩边学)


    13.jpg

    实验开源图形编程(Mind+、Mixly、编玩边学)之二

    14.jpg

    实验场景图


    12-.jpg

    相关文章

      网友评论

        本文标题:【雕爷学编程】Arduino动手做(95)---GY9960手势

        本文链接:https://www.haomeiwen.com/subject/wjcbcrtx.html