Gravity: 色温照度传感器

产品简介

这是一款可以在最远 3 米距离内跟踪人体头肩和检测 5 种手势的AI视觉传感器。

在一些有卫生需求、需要避免污染设备的环境下,需要非接触的来操作设备,例如需要在非接触的情况下开启消毒设备,或者需要在双手沾满面粉的情况下来开启抽油烟机。

或者需要在噪声较大的场景,来实现非接触的远程控制,例如在音响播放音乐的情况下来控制音量大小。

又或者需要设备能够跟踪人体的运动,判断人体是否存在,检测人体位置。例如让空调或风扇设备跟随人体,以节约能源。

该传感器具备检测 5 种手势的功能,可以非接触的情况下在最远 3 米的距离识别做出的手势,通过将传感器连接到您的主控器,实时读取到手势命令后,用于实现非接触操作设备的装置开发。

而该传感器的头肩跟踪,可以用于控制设备的自动启停,例如用于社区的宣传屏幕,当检测到围观人群时开启声音或视频,在围观群众离开时关闭声音或视频以减少噪声污染。

另外,在不携带任何遥控器的情况下,你只需要朝向设备,然后做出手势即可悄无声息的控制设备,的确是一件很酷的事情。

产品特性

  • 离线AI视觉识别方案,识别准确快速
  • 高灵敏度高速识别五种手势
  • 最远3米可准确识别
  • 支持头肩识别,并可输出头肩数量和坐标
  • I2C和UART两种数据通讯方式
  • 兼容3.3V/5V电平和供电电压
  • 支持makecode和Mind+图形化编程

应用场景

  • 无接触公共区域信息屏幕控制
  • 舞台表演
  • 家电控制
  • 音乐播放控制

规格参数

电源参数

  • 供电电压:3.3V-5V
  • 电平电压:3.3V
  • 工作电流:100mA

接口参数

  • 通讯接口:PH2.0-4P/2.54mm排针孔
  • 通讯方式:I2C/UART
  • I2C地址:0x72
  • 串口默认波特率:9600
  • 串口通讯协议:modbus
  • 中断接口:2.54mm排针孔

识别参数

  • 手势识别类型:5种手势
    • 竖大拇指
    • 伸出中指、无名指、小指
    • 手掌展开向外
    • 伸出食指和中指
    • 伸出大拇指和小指
  • 人脸头肩最多可识别数量:10个以内
  • 人脸头肩识别范围:人体肩部以上进入摄像头范围能被识别
  • 人脸识别得分:0-100
  • 人脸头肩位置坐标识别:支持
  • 中断输出:识别到任何手势输出低电平
  • 手势识别距离:0.5m-3m
  • 人脸头肩识别距离:0.5m-3m
  • 摄像头视场角:D=85°
  • 摄像头焦距:1.56mm

显示参数

  • 手势识别RGB灯
    • 显示蓝色:竖大拇指
    • 显示绿色:伸出中指、无名指、小指
    • 显示红色:手掌展开向外
    • 显示黄色:伸出食指和中指
    • 显示紫色:伸出大拇指和小指
  • 检测是否有人LED:LED灯(有人亮灯,无人灭灯)

物理尺寸

  • PCB尺寸:42mm*32mm
  • 安装孔间距:25mm*35mm
  • 安装孔直径:3.1mm

功能示意图

标号 名称 功能描述
D/T I2C数据线SDA或串口UART发送端TXD(3.3V电平)
C/R I2C时钟线SCL或串口UART接收端RXD(3.3V电平)
GND 电源负极
VCC 电源正极(3.3~5.5V)
INT 中断输出,识别到任何手势输出低电平
I2C/UART I2C/UART通信模式选择开关
头肩指示灯 当摄像头检测到头肩时常亮,当人员离开时熄灭
手势指示灯 点亮5种固定的手势对应的颜色

尺寸图

寄存器

寄存器类型 设备地址
(10进制)
Modbus地址偏移量(16进制) 名称 读写 数据范围 默认值 描述
输入寄存器 3001 0x0000 VID R 0x0000-0xFFFF 0x3343 VID厂商ID
输入寄存器 3002 0x0001 PID R 0x0000-0xFFFF 0x0272 PID产品ID
输入寄存器 3003 0x0002 硬件版本号 R 0x0000-0xFFFF 0x1000 硬件版本号:
0x1000代表V1.0.0.0
输入寄存器 3004 0x0003 软件版本号 R 0x0000-0xFFFF 0x1000 软件版本号:
0x1000代表V1.0.0.0
输入寄存器 3005 0x0004 人脸数量 R 0x0000-0x000A 0x0000 传感器检测到的人脸数量,最多可检测10
输入寄存器 3006 0x0005 人脸x坐标 R 0x0000-0x000A 0xFFFF 传感器检测到的人脸x坐标。
0xFFFF:无人脸检测到
输入寄存器 3007 0x0006 人脸y坐标 R 0x0000-0x000A 0xFFFF 传感器检测到的人脸y坐标。
0xFFFF:无人脸检测到
输入寄存器 3008 0x0007 人脸得分 R 0x0000-0x0064 0x0000 人脸得分。
0% ~100% 对应数值0-100
输入寄存器 3009 0x0008 手势类型 R 0x0000-0x0005 0x0000 手势类型:
0x0000:其他手势
0x0001:LIKE 👍
0x0002:OK👌
0x0003:STOP🤚
0x0004:YES ✌️
0x0005:SIX 🤙
输入寄存器 3010 0x0009 手势得分 R 0x0000-0x0064 0x0000 手势得分。0% ~100%对应数值0-100
保持寄存器 4001 0x0000 设备地址 R/W 0x0001-0x00F7 0x0072 模块的设备地址(1~247)[传感器地址未知时,可通过广播地址0x00做写入寄存器操作,此时传感器不会有数据输出]DFRobot 每种产品出厂时分配不同地址。
断电保存,立即生效
保持寄存器 4002 0x0001 串口参数控制寄存器1 R/W 0x0000-0xFFFF 0x0004 模块波特率:
0x0001---1200
0x0002---2400
0x0003---4800
0x0004---9600(默认)
0x0005---14400
0x0006---19200
0x0007---38400
0x0008---57600
0x0009---115200
0x000A---230400
0x000B---460800
0x000C---921600
Other----9600
修改成功会以当前波特率回复,回复后切换为新的波特率。
断电保持,重启后生效
设备建议工作在115200以下
保持寄存器 4003 0x0002 串口参数控制寄存器2 R/W 0x0000-0xFFFF 0x0003 高8位模块校验位:
0x00--None(默认)
0x01--Even
0x02--Odd
Other--None
低8位停止位:
0x00--0.5 bit
0x01--1 bit
0x02--1.5 bit
0x03--2 bit (默认)
Other--2 bit
断电保存,重启后生效
保持寄存器 4004 0x0003 设置目标人体头肩检测x坐标范围阈值 R/W 0x0000-0x0064 0x0064 取值范围:0-100,值越小检测范围越窄。100代表摄像头所有可视范围
保持寄存器 4005 0x0004 设置目标人体头肩检测分数阈值 R/W 0x003C-0x0064 0x003C 取值范围:60-100,代表60%-100%
默认值:60
保持寄存器 4006 0x0005 设置手势检测分数阈值 R/W 0x003C-0x0064 0x003C 取值范围:60-100,代表60%-100%
默认值:60

手势类型数值表

手势类型 手势指示灯颜色 程序对应数值
👍 蓝色 1
👌 绿色 2
🤚 红色 3
✌️ 黄色 4
🤙 紫色 5

Arduino使用教程

基础教程

软硬件准备

使用I2C读取数据

  • 接线图

  • 样例代码
    • 将模块与ESP32-E控制器按照上方的连线图相连,并将传感器上的通信模式选择开关拨到I2C一侧。
    • 打开Arduino IDE,将下面的代码上传到ESP32-E控制器。
    • 打开Arduino IDE的串口监控视器,把波特率调至115200,观察串口打印结果。
#include "DFRobot_GestureFaceDetection.h"
#define DEVICE_ID  0x72 

DFRobot_GestureFaceDetection_I2C gfd(DEVICE_ID);
char str[100];

void setup(){
    gfd.begin(&Wire);
    Serial.begin(115200);
    gfd.setFaceDetectThres(60);
    gfd.setGestureDetectThres(60);	
    gfd.setDetectThres(100);
}

void loop(){
    if(gfd.getFaceNumber() > 0){
        uint16_t faceScore = gfd.getFaceScore();
        uint16_t faceX = gfd.getFaceLocationX();
        uint16_t faceY = gfd.getFaceLocationY();
        sprintf(str, "detect face at (x = %d, y = %d, score = %d)\n", faceX, faceY, faceScore);
        Serial.print(str); 
        uint16_t gestureType = gfd.getGestureType();
        uint16_t gestureScore = gfd.getGestureScore();
        sprintf(str, "detect gesture %d, score = %d\n", gestureType, gestureScore);
        Serial.print(str);
    }
    delay(1500);
}

结果

摄像头首先检查是否有人脸被识别。如果有,它会获取人脸的评分和位置,然后将这些信息格式化为一个字符串并通过串行端口输出。然后,它会获取识别到的手势类型和评分,同样将这些信息格式化为一个字符串并通过串行端口输出。

串行监视器会打印类似以下的信息:

detect face at (x = 123, y = 234, score = 78)
detect gesture 2, score = 88

其中,“x=123,y=234”表示识别到的人脸的位置,“ score = 78”表示人脸识别的评分。“gesture 2”表示识别到的手势类型,“score = 88”表示手势识别的评分。

**注意:**人脸和手势需要同时被摄像头识别才能输出手势类型等数据

使用UART读取数据

  • 接线图

  • 样例代码
    • 将模块与ESP32-E控制器按照上方的连线图相连,并将传感器上的通信模式选择开关拨到UART一侧。
    • 打开Arduino IDE,将下面的代码上传到ESP32-E控制器。
    • 打开Arduino IDE的串口监控视器,把波特率调至115200,观察串口打印结果。
#include "DFRobot_GestureFaceDetection.h"
#define DEVICE_ID  0x72 

DFRobot_GestureFaceDetection_UART gfd(&Serial1, DEVICE_ID);

void setup(){
    Serial1.begin(9600,SERIAL_8N1, D2, D3);
    Serial.begin(115200);
    delay(1500);
    Serial.print("Product ID: ");
    Serial.println(gfd.getPid());
    Serial.print("Vendor ID: ");
    Serial.println(gfd.getVid());
}

void loop(){
    Serial.print("Faces detected: ");
    Serial.println(gfd.getFaceNumber());
    delay(1500);
}

结果

在初始化时,串口监视器会打印出传感器的产品ID和供应商ID。然后,在主循环中,它会周期性地打印出检测到人的头肩数量。

以下是一个实例的串行输出:

Product ID: 626
Vendor ID: 13123
Faces detected: 1

其中,“Product ID: 626”表示产品ID,换算成十六进制是0x3343,“Vendor ID: 13123”表示供应商ID,换算成十六进制是0x0272,“Faces detected: 1”表示检测出1个头肩数量,当检测到的头肩数量≥1时,头肩指示灯常亮。

进阶教程

炫彩灯环

硬件准备

  • DFR0868 Beetle ESP32-C3 ×1
  • FIT0676 93灯/6环 WS2812B RGB ×1
  • SEN0626 AI视觉手势/人脸检测传感器 ×1

软件准备

接线图

样例代码

  • 将AI视觉手势/人脸检测传感器、WS2812B圆盘灯与ESP32-C3控制器按照上方的连线图相连。
  • 将人脸检测传感器的通讯模式选择开关拨到I2C一侧。
  • 打开Arduino IDE,将下面的代码上传到ESP32-C3控制器。
#include <Wire.h>
#include <FastLED.h>
#include "DFRobot_GestureFaceDetection.h"

#define LED_PIN     4
#define NUM_LEDS    93
#define DEVICE_ID   0x72

CRGB leds[NUM_LEDS];
DFRobot_GestureFaceDetection_I2C gfd(DEVICE_ID);

void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  Wire.begin(8, 9);  // SDA, SCL
  gfd.begin(&Wire);
  Serial.begin(115200);
  gfd.setFaceDetectThres(60);
  gfd.setGestureDetectThres(60);  
  gfd.setDetectThres(100);
}

void loop() {
  if(gfd.getFaceNumber() > 0) {
    uint16_t gestureType = gfd.getGestureType();
    switch(gestureType) {
      case 1:
        setAllLEDs(CRGB::Blue);
        break;
      case 2:
        setAllLEDs(CRGB::Green);
        break;
      case 3:
        setAllLEDs(CRGB::Red);
        break;
      case 4:
        setAllLEDs(CRGB::Yellow);
        break;
      case 5:
        setAllLEDs(CRGB::Purple);
        break;
      default:
        setAllLEDs(CRGB::Black);
        break;
    }
  }
  else {
    setAllLEDs(CRGB::Black);
  }
  delay(1500);
}

void setAllLEDs(CRGB color) {
  for(int i = 0; i < NUM_LEDS; i++) {
    leds[i] = color;
  }
  FastLED.show();
}

结果

通过不同的手势来切换灯环的显示颜色,当人体离开时,灯环熄灭

人体跟踪风扇

硬件准备

  • DFR0216 DFRduino UNO R3 ×1

  • DFR0265 Gravity: IO 传感器扩展板 V7.1 ×1

  • DFR0332 Gravity: 风扇模块 ×1

  • SER0056 2Kg 300°离合舵机 ×1

  • SEN0626 AI视觉手势/人脸检测传感器 ×1

软件准备

接线图

样例代码

  • 将AI视觉手势/人脸检测传感器、与DFRduino UNO R3控制器按照上方的连线图相连。
  • 将人脸检测传感器的通讯模式选择开关拨到I2C一侧。
  • 打开Arduino IDE,将下面的代码上传到DFRduino UNO R3控制器。
#include <Wire.h>
#include <Servo.h>
#include "DFRobot_GestureFaceDetection.h"

#define DEVICE_ID  0x72
#define FAN_PIN 3
#define SERVO_PIN 5

Servo myservo;
DFRobot_GestureFaceDetection_I2C gfd(DEVICE_ID);

void setup(){
    myservo.attach(SERVO_PIN);
    myservo.write(0);
    gfd.begin(&Wire);
    Serial.begin(115200);
    gfd.setFaceDetectThres(60);
    gfd.setGestureDetectThres(60);
    gfd.setDetectThres(100);
    pinMode(FAN_PIN, OUTPUT);
}

void loop(){
    if(gfd.getFaceNumber() > 0){
        uint16_t gestureType = gfd.getGestureType();
        if(gestureType == 2){ 
            analogWrite(FAN_PIN, 255); 
        }
        else if(gestureType == 3){ 
            analogWrite(FAN_PIN, 0); 
        }

        uint16_t x = gfd.getFaceLocationX();
        Serial.println(x);
        if(x >= 280 && x <= 400){
            myservo.write(45); 
            delay(2000);
            myservo.write(90); 
        }
        else if(x >= 500 && x <= 620){
            myservo.write(135); 
            delay(2000);
            myservo.write(90); 
        }
    }
    delay(1500);
}

结果

这个程序的主要目标是通过手势和人脸位置来控制一个舵机和风扇的动作。

首先,程序会检查是否有人脸被传感器检测到。如果有人脸被检测到,程序会继续检查手势类型和人脸的X坐标。

对于手势类型,如果检测到OK手势(对应数值为2),风扇会自动开启。如果检测到STOP手势(对应数值为3),风扇会自动关闭。

对于人脸的X坐标,如果X坐标在180-390的范围内,舵机会逆时针旋转45°,然后暂停2秒返回到中点。如果X坐标在500-610的范围内,舵机会顺时针旋转45°,然后暂停2秒返回到中点。

注意:X坐标要根据实际情况来设置。

API函数

 /**
     * @fn getPid
     * @brief 获取设备的PID。
     * @return 设备的PID。
     */
    uint16_t getPid();
    
    /**
     * @fn getVid
     * @brief 获取设备的VID。
     * @return 设备的VID。
     */
    uint16_t getVid();
    
    /**
     * @fn setDeviceAddr
     * @brief 设置设备地址。
     * @param addr 设备地址。
     * @return 如果成功设置地址,则返回真;否则返回假。
     */
    bool setDeviceAddr(uint16_t addr);
    
    /**
     * @fn configUart
     * @brief 配置UART设置。
     * 
     * 此方法用于设置设备的UART通信参数,包括波特率、校验位和停止位。
     * 用户可以根据需求选择适当的参数,以确保与设备的稳定有效通信。
     *
     * @param baud 波特率配置,类型为`eBaudConfig_t`,可能的值包括:
     *              - `eBaud_1200`  - 1200波特
     *              - `eBaud_2400`  - 2400波特
     *              - `eBaud_4800`  - 4800波特
     *              - `eBaud_9600`  - 9600波特
     *              - `eBaud_14400` - 14400波特
     *              - `eBaud_19200` - 19200波特
     *              - `eBaud_38400` - 38400波特
     *              - `eBaud_57600` - 57600波特
     *              - `eBaud_115200`- 115200波特
     *              - `eBaud_230400`- 230400波特
     *              - `eBaud_460800`- 460800波特
     *              - `eBaud_921600`- 921600波特
     *
     * @param parity 校验位配置,类型为`eParityConfig_t`,可能的值包括:
     *              - `UART_CFG_PARITY_NONE`  - 无校验
     *              - `UART_CFG_PARITY_ODD`   - 奇校验
     *              - `UART_CFG_PARITY_EVEN`  - 偶校验
     *              - `UART_CFG_PARITY_MARK`  - 标记校验
     *              - `UART_CFG_PARITY_SPACE` - 空格校验
     *
     * @param stopBit 停止位配置,类型为`eStopbits_t`,可能的值包括:
     *                - `UART_CFG_STOP_BITS_0_5` - 0.5停止位
     *                - `UART_CFG_STOP_BITS_1`   - 1停止位
     *                - `UART_CFG_STOP_BITS_1_5` - 1.5停止位
     *                - `UART_CFG_STOP_BITS_2`   - 2停止位
     *
     * @return 配置状态,如果配置成功返回状态码;否则返回错误码。
     */
    uint16_t configUart(eBaudConfig_t baud, eParityConfig_t parity, eStopbits_t stopBit);
    
    /**
     * @fn setFaceDetectThres
     * @brief 设置人脸检测阈值。
     * 
     * 设置人脸检测的阈值(0-100)。默认值为60%。
     *
     * @param score 阈值。
     * @return 如果成功,返回真;否则返回假。
     */
    bool setFaceDetectThres(uint16_t score);
    
    /**
     * @fn setDetectThres
     * @brief 设置X坐标的检测阈值。
     * 
     * 设置检测X坐标的阈值(0-100)。默认值为60%。
     *
     * @param x 阈值。
     * @return 如果成功,返回真;否则返回假。
     */
    bool setDetectThres(uint16_t x);
    
    /**
     * @fn setGestureDetectThres
     * @brief 设置手势检测阈值。
     * 
     * 设置手势检测的阈值(0-100)。默认值为60%。
     *
     * @param score 阈值。
     * @return 如果成功,返回真;否则返回假。
     */
    bool setGestureDetectThres(uint16_t score);
    
    /**
     * @fn getFaceNumber
     * @brief 获取设备检测到的人脸数量。
     * @return 检测到的人脸数量。
     */
    uint16_t getFaceNumber();
    
    /**
     * @fn getFaceLocationX
     * @brief 获取检测到的人脸的X坐标。
     * @return 人脸的X坐标。
     */
    uint16_t getFaceLocationX();
    
    /**
     * @fn getFaceLocationY
     * @brief 获取检测到的人脸的Y坐标。
     * @return 人脸的Y坐标。
     */
    uint16_t getFaceLocationY();
    
    /**
     * @fn getFaceScore
     * @brief 获取检测到的人脸的得分。
     * @return 人脸的得分。
     */
    uint16_t getFaceScore();
    
    /**
     * @fn getGestureType
     * @brief 获取检测到的手势类型。
     * 
     * 此方法检索当前检测到的手势类型。手势识别功能可以用于各种应用,如人机交互或控制系统。
     * 返回的手势类型对应以下值:
     * - 1: LIKE (👍) - 蓝色
     * - 2: OK (👌) - 绿色
     * - 3: STOP (🤚) - 红色
     * - 4: YES (✌️) - 黄色
     * - 5: SIX (🤙) - 紫色
     * 
     * 如果没有检测到手势,返回值可能是特定的无效值(例如,0)。
     *
     * @return 检测到的手势类型。
     */
    uint16_t getGestureType();
    
    /**
     * @fn getGestureScore
     * @brief 获取检测到的手势得分。
     * @return 手势得分。
     */
    uint16_t getGestureScore();

Mind+(基于Scratch3.0)图形化编程

  • 下载Mind+编程软件。 点击下载Mind+

  • 详细安装教程:Mind+基础wiki教程-软件下载安装

  • 打开Mind+软件,选择上传模式,“扩展”中选择“主控板”中的“Arduino Uno”,然后点击用户库。

  • 复制以下链接:https://gitee.com/zhangtang6677/ext-gestureFaceDetectionSensor,在用户库搜索栏中粘贴,然后进行搜索,添加手势人脸检测传感器

  • 进行编程,程序如下图:

注意:在Mind+及Makecode环境下,只能使用手势传感器的I2C通信,无法使用UART进行通信。

Makecode使用教程

  • 在浏览器输入网址打开MakeCode编程平台:https://makecode.microbit.org/
  • 新建项目并为项目命名。
  • 载入紫外线传感器的程序库:依次点击 “设置”、“扩展”,然后在搜索框中粘贴链接:https://github.com/DFRobot/pxt-DFRobotGestureFaceDetection
  • 进行编程,程序如下图:

  • 点击下载,程序上传完毕后,打开“Show data设备”即可看到数据输出。

注意:在Mind+及Makecode环境下,只能使用手势传感器的I2C通信,无法使用UART进行通信。

更多资料下载

常见问题(FAQ)

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

DFshopping_car1.png [DFRobot商城购买链接](