1. 产品简介
Gravity:AI 姿势&手势传感器是一款支持离线 AI 推理的视觉交互传感器,集成手部关键点识别、人体骨架识别能力,可实现手势识别、姿势识别和自定义动作学习。
传感器可通过配套上位机软件进行手势和姿势学习。用户连接电脑后,即可按照软件提示完成动作采样,并将学习结果保存到传感器本地。学习完成后,设备可脱离电脑,通过 I2C/UART 与 Arduino、ESP32、micro:bit 等主控通信,实现个性化体感交互。
设备的 AI 推理在本地离线完成,无需联网,识别数据无需上传云端,可有效降低隐私泄漏风险。37×37mm 的紧凑尺寸、Gravity 接口、Type-C 调试配置接口以及低功耗设计,让它适合快速原型开发、教学演示和嵌入式交互项目。
三种识别模式,灵活覆盖不同场景
传感器提供三种识别模式,可通过上位机软件或通信指令进行切换。
- 手部关键点识别模式:追踪手部 21 个关键点,识别帧率约 5 FPS,建议识别距离 0.1~1m(建议 0.5m),适合近距离手势交互。
- 人体骨架识别模式:追踪人体 17 个关键点,支持多人同时识别,帧率约 10 FPS,建议识别距离 2~4m(建议 2m),适合全身姿态识别。
- 固定手势分类模式:内置 13 种常用固定手势,上电即可识别,适合快速项目验证。
一键学习,所想即所得
搭配上位机软件,可完成静态手势和姿势的学习、命名、管理和删除。学习结果可删除和重新学习,记录保存在本地闪存中,掉电不丢失。注:仅支持静态姿势学习,不支持动态动作(如挥手轨迹)识别。
用户可将举手、站立等特定静态姿势,或自定义手势设置为触发条件,用于控制灯光、机器人、音乐、互动装置或其他创意项目。
低功耗,小体积,部署更自由
传感器工作电流典型值约 40mA@3.3V,睡眠电流低至 37μA@3.3V,并提供 WAKEUP 引脚用于低功耗唤醒,适合间歇工作型电池供电项目。37×37mm 的紧凑 PCB 尺寸,便于嵌入小型机器人、桌面设备和互动装置。
接口丰富,兼容主流生态
硬件支持 I2C/UART 通信,并集成标准 Gravity 接口,可方便接入 DFRobot Gravity 生态。供电电压支持 3.3V~5V,通信电平为 3.3V,适用于 Arduino UNO、micro:bit、ESP32 等常见主控平台。Type-C 接口用于供电、调试、参数配置和连接上位机软件。
软件支持,低门槛上手
配套上位机软件提供可视化操作界面,可查看识别状态、关键点信息、当前工作模式和已学习动作,支持模式切换、自定义动作学习、动作命名与删除。
产品提供 Arduino IDE 用户库,可通过 API 读取识别结果、关键点数据和自定义动作 ID。目前也支持MakeCode库。
2. 产品特性
- 支持人体骨架识别、手部关键点识别和固定手势分类。
- 支持自定义姿势/手势学习,可同时存储 8 个姿势和8个手势。
- 支持低功耗模式,睡眠电流仅37μA,可通过 WAKEUP 引脚唤醒。
- 支持 I2C/UART 通信,兼容 Arduino、ESP32、micro:bit 等主控。
- 支持 Type-C 调试和上位机软件配置。
- 本地离线 AI 推理,无需联网。
- 通过CE-EMC/RoHS认证。
3. 应用场景
- 智能家居非接触控制
- 机器人交互
- 互动艺术装置
- 手势音乐盒
- 光影互动控制
- 虚拟角色简易动作触发
- STEAM 教育与创客项目
4. 技术规格
电源参数
| 参数项 | 规格值 |
|---|---|
| 供电电压 | 3.3V-5V |
| 通信电平 | 3.3V |
| 工作电流 | 典型 40mA@3.3V |
| 睡眠电流 | 典型 37μA@3.3V,需进入低功耗模式 |
| 唤醒方式 | WAKEUP 引脚唤醒 |
接口参数
| 参数项 | 规格值 |
|---|---|
| 通讯方式 | I2C/UART |
| 通讯接口 | PH2.0-4P/2.54mm排针孔 |
| 调试配置接口 | USB Type-C 插座 |
| I2C地址 | 0x3A |
| 串口默认波特率 | 921600bps |
识别参数
| 参数项 | 规格值 |
|---|---|
| 手部关键点 | 21个关键点 |
| 人体骨架关键点 | 17个关键点 |
| 固定手势识别类型 | 13个固定手势 |
| 自定义手势学习数量 | 最多 8 个,可删除和重新学习 |
| 自定义姿势学习数量 | 最多 8 个,可删除和重新学习 |
| 手势有效识别距离 | 良好光照条件下 0.1-1m,建议0.5m |
| 姿势有效识别距离 | 良好光照条件下 2m-4m,建议2m |
| 手势识别帧率 | 约 5 FPS |
| 骨架识别帧率 | 约 10 FPS |
| 手势识别限制 | 仅支持单手识别,且自定义手势同一时间仅识别一只手,即使多只手做出相同手势 |
| 姿势识别限制 | 支持多人同时识别,且自定义姿势同一时间仅识别一个人,即使多人做出相同姿势 |
| 动作识别类型 | 静态动作识别,不支持动态动作识别 |
| 摄像头分辨率 | 640 × 480(VGA) |
| 摄像头视场角(FOV) | 对角线 89° |
| 摄像头有效焦距(EFL) | 3.01mm |
物理尺寸
| 参数项 | 规格值 |
|---|---|
| PCB尺寸 | 37mm×37mm |
| 安装孔间距 | 30mm |
| 安装孔直径 | 3.2mm |
5. 功能示意图

| 标号 | 名称 | 功能描述 |
|---|---|---|
| ① | VCC | 电源正极(3.3~5.5V) |
| ② | GND | 电源负极 |
| ③ | C/R | I2C时钟线SCL或串口UART接收端RXD(3.3V电平) |
| ④ | D/T | I2C数据线SDA或串口UART发送端TXD(3.3V电平) |
| ⑤ | WAKEUP | WAKEUP唤醒引脚:拉高唤醒传感器,拉低进入低功耗。用于按需控制工作状态,节省电量。 |
| ⑥ | USB Type-C 接口 |
1. 连接配置软件,查看传感器识别画面及识别数据。 2. 连接配置软件,设置自定义学习手势和姿势。 |
| ⑦ | I2C/UART通讯模式选择开关 | 出厂默认为I2C通讯方式,地址为0x3A。若更换通讯方式,需给传感器重新上电。 |
6. 产品尺寸图
单位:mm

7. 核心功能简介
传感器支持 3 种识别模式 + 一键学习功能,如下,这里简单介绍下每种模式的功能及注意事项。
7.1. 自定义姿势识别
基于 17 个人体关键点(头部、肩部、肘部、手腕、髋部、膝盖、脚踝等),支持单人全身的静态姿势识别。可学习专属趣味姿势,例如伸懒腰、金鸡独立、举手等自定义姿态,适用于互动游戏、非接触式控制、智能交互等场景。
注意事项:
- 最佳识别距离:2 米,尽量保证人体完整出现在摄像头画面中,关键点数据越多识别越准确。
- 同一时间仅支持学习一个人的姿势,但可以识别多个人的骨架数据。
- 复杂姿势建议多次学习取最优结果,可通过调节相似度提升识别准确率。
- 传感器可输出 17 个关键点的实时坐标,您也可以基于坐标自行计算关节角度实现更复杂的姿势判断。
7.2. 自定义手势识别
基于21个人体手势关键点来识别,支持用户学习并保存最多 8 个专属自定义手势,数据存储在板载 Flash 中,掉电不丢失。可自由调节手势识别相似度阈值,支持随时删除、重新学习手势,满足个性化交互需求。
注意事项:
- 单手势学习时间建议保持 3~5 秒,学习时保持手势清晰、无遮挡
- 识别相似度阈值建议设置在 70%-80%,过低易误识别,过高难触发
- 同一时间仅支持识别和学习一只手的手势。
- 复杂手势建议多次学习取最优结果,可通过调节相似度提升识别准确率。
- 传感器可输出 21 个关键点的实时坐标,您也可以基于坐标自行计算关节角度实现更复杂的手势判断。
7.3. 固定手势识别
传感器内置 13 种通用固定手势,无需提前训练,上电即可直接调用识别,适合快速搭建基础手势交互项目。支持识别喜欢、不喜欢、OK、数字 1-5、停止等常用手势。
注意事项:
- 该功能仍处于测试阶段,识别精度有待提高。我们正在持续优化AI模型中。
- 该功能识别时对背景环境要求较高,白色干净背景下识别效果较好,复杂背景环境下识别效果较差。
7.4. 学习功能
传感器的学习功能是实现自定义手势、自定义姿势识别的核心底层能力,所有训练过程均在传感器本地离线完成,无需联网或云端计算,零基础也能快速上手。
注意事项:
- 环境要求:学习需在光线充足均匀的环境下进行,避免逆光、强光直射或昏暗环境,背景尽量简洁,减少无关物体和人员干扰
- 动作要求:学习时保持动作稳定标准,不要晃动或有多余小动作,确保传感器能完整捕捉手势 / 姿势的核心特征
- 区分度原则:不同自定义手势 / 姿势之间的差异要足够明显,避免特征相似导致交叉误识别
- 存储限制:最多同时保存 8 个自定义姿势和8个自定义手势,数量受板载 Flash 容量限制,建议按需保存
- 状态提示:学习过程中传感器有学习失败提示,请按照提示进行相关操作。
8. 上位机使用教程
本教程旨在使用户了解传感器功能之后,可通过配套的上位机软件来快速体验传感器的核心功能。
8.1 硬件准备
- Gravity: AI 姿势和手势传感器 (SKU: SEN0670) ×1
- USB Type-C 线 ×1
- PC ×1
8.2 软件准备
- 下载 SEN0670 上位机软件: SEN0670_上位机软件.zip
- 下载 CH343 驱动: CH343 驱动.zip
8.3 硬件连接

8.4 操作步骤
-
下载SEN0670_上位机软件,保存至本地文件夹,并解压,如下图所示找到 .exe文件。

-
双击.exe文件,运行上位机,可以看到下图中的上位机界面。可修改显示语言为中文。

-
连接好传感器设备之后,上位机端口会自动识别设备端口号。因此只需点击打开按钮。即可看到传感器摄像头识别画面和数据,如下图所示。

上位机核心功能如下:① 摄像头显示区 查看摄像头画面。 ② 实时数据区 输出传感器推理数据:手势识别数据("hand_keypoints": [])或姿势识别数据("pose_keypoints": []),可一键复制。 ③ 模式选择 可切换姿势识别、手势识别或手势分类识别功能。 ④ 学习按键 学习摄像头画面中识别到的手势或姿势,可自定义命名,最多同时可学习自定义8个手势和8姿势。 ⑤ 清除按键 清除学习的全部手势或姿势。 ⑥ 学习内容区 显示已学手势或姿势的ID和名称等信息,并支持重命名或删除指定的学习内容。 -
上位机默认为手势识别模式。如下图所示,任意摆出一个手势,传感器将会进行识别,输出对应姿势的ID为0,置信度为93,并且输出该手势的21个关键点实时数据。

-
接下来选择姿势识别模式,传感器无需断电,即时生效。如下图所示,任意摆出一个姿势,传感器将会进行识别,输出对应姿势的ID为0,置信度为90,并且输出该姿势的17个关键点实时数据。

-
最后体验固定手势识别模式。如下图所示,根据右侧图片中的手势类型,摆出任意一个手势,传感器会识别对应手势的ID和名称。

注意:该模式仍处于测试阶段,识别精度目前有限。尤其是在复杂背景下识别效果较差,例如白色干净背景识别效果较好。 -
学习操作:以手势识别为例,姿势识别操作相同。切换到手势识别模式。
当摄像头画面识别到自定义的手势,点击学习按键,此次手势保持静止3~4秒,直到完成学习,此时手势的颜色有变化。

手势 / 姿态识别 ID 规则
- 初始状态 ID=0,代表系统识别到未录入、未训练的手势或姿态动作。
- 手势训练完成后,已录入动作会展示在训练列表中,并自动分配独立 ID:初始训练 ID 默认从 1 开始顺序递增,系统最多支持录入 8 组手势/姿势,ID 取值范围为 1~8。
- 系统识别到已训练完成的动作时,会同步回传该动作对应的 ID 与自定义名称。
- 手势默认命名格式为 Gesture_1、Gesture_2……;支持用户自定义修改名称(仅允许字符格式),修改保存后立即生效。
例如重命名为like,保存之后再次做出相同的手势,如下图所示。该手势识别信息为 ID:1 like, 与定义的手势相似度为88。则此手势学习成功。

重复以上操作可让传感器学习更多自定义手势或姿势。而已学习手势或姿势的ID号或ID名称可用于主机端进行获取并写对应的执行程序。上位机使用需注意:
- 清除按键请慎重操作,按下则会清除手势的或姿势的全部学习内容。
- 手势识别最佳距离为50~60cm;姿势识别最近距离为2m。
-
上位机其他功能介绍,点击设置按钮。

支持以下功能- 固件升级:更新固件
- UART 波特率:设置UART接口的通讯波特率
- 关于:查看产品相关信息
9. Arudino使用教程
9.1 硬件准备
- Gravity: AI 姿势和手势传感器 (SKU: SEN0670) ×1
- Firebeetle 2 ESP32-E(SKU: DFR0654)
- USB Type-C 线 ×1
- PC ×1
9.2 软件准备
- 编程环境:点击下载Arduino IDE
- 下载并安装传感器库:DFRobot_HumanPose
- 请点击此处查看:如何安装库?
9.3 接线图
- I2C连接方式(后续示例均采用I2C通信)

连接说明:
| 传感器引脚:VCC | 连接 | 主控板引脚:5V |
|---|---|---|
| 传感器引脚:GND | 连接 | 主控板引脚:GND |
| 传感器引脚:C | 连接 | 主控板引脚:22/SCL |
| 传感器引脚:D | 连接 | 主控板引脚:21/SDA |
- UART连接方式

连接说明:
| 传感器引脚:VCC | 连接 | 主控板引脚:5V |
|---|---|---|
| 传感器引脚:GND | 连接 | 主控板引脚:GND |
| 传感器引脚:R | 连接 | 主控板引脚:26/D3 |
| 传感器引脚:T | 连接 | 主控板引脚:25/D2 |
注意:
- 传感器默认出厂通讯方式为I2C,若需要切换为UART,可通过板载的拨码开关切换通讯方式。
- 切换之后,传感器要重新上电方能生效。
9.4 Arduino平台示例
1. 自定义手势识别
开始本例程之前,请确保传感器已通过上位机软件进行自定义手势学习。若没有提前学习,则传感器识别为未知手势。
示例代码:
#include <DFRobot_HumanPose.h>
// 默认使用I2C通信
const uint8_t I2C_ADDR = 0x3A;
DFRobot_HumanPose_I2C humanPose(&Wire, I2C_ADDR);
void setup()
{
Serial.begin(115200);
// 1. 初始化传感器
while (!humanPose.begin()) {
Serial.println("传感器初始化失败,请检查接线!");
delay(1000);
}
Serial.println("传感器初始化成功!");
// 2. 设置为“手部检测”模式
humanPose.setModelType(DFRobot_HumanPose::eHand);
}
void loop()
{
// 3. 获取检测结果
if (humanPose.getResult() == DFRobot_HumanPose::eOK) {
// 遍历所有检测到的手/手势
while (humanPose.availableResult()) {
Result *result = humanPose.popResult();
if (result) {
// 判断逻辑:id=0 是未学习,id≠0 是已学习
if (result->id == 0) {
Serial.println("【未学习手势】");
} else {
Serial.print("【已学习手势】名称: ");
Serial.println(result->name); // 已学习的打印名称
}
// 打印通用信息:置信度、位置
Serial.print("置信度: "); Serial.println(result->score);
Serial.print("位置: 左="); Serial.print(result->xLeft);
Serial.print(" 上="); Serial.print(result->yTop);
Serial.print(" 宽="); Serial.print(result->width);
Serial.print(" 高="); Serial.println(result->height);
Serial.println("------------------------");
}
}
}
delay(100); // 延时100ms,避免刷屏
}
运行结果:
传感器自动对手势进行识别,可区分已学习手势和未学习手势。

2. 自定义姿势识别
开始本例程之前,请确保传感器已通过上位机软件进行自定义姿势学习。若没有提前学习,则传感器识别为未知姿势。
示例代码:
#include <DFRobot_HumanPose.h>
const uint8_t I2C_ADDR = 0x3A; // 默认使用I2C通信
DFRobot_HumanPose_I2C humanPose(&Wire, I2C_ADDR);
void setup()
{
Serial.begin(115200);
// 1. 初始化传感器
while (!humanPose.begin()) {
Serial.println("传感器初始化失败,请检查接线!");
delay(1000);
}
Serial.println("传感器初始化成功!");
// 2. 设置为“人体姿态检测”模式
humanPose.setModelType(DFRobot_HumanPose::ePose);
}
void loop()
{
// 3. 获取检测结果
if (humanPose.getResult() == DFRobot_HumanPose::eOK) {
// 遍历所有检测到的目标
while (humanPose.availableResult()) {
Result *result = humanPose.popResult();
if (result) {
// 统一打印前缀
if (result->id == 0) {
Serial.print("【未学习姿态/人体】");
} else {
Serial.print("【已学习姿态】");
}
// 统一打印 ID、名称
Serial.print(" ID: ");
Serial.print(result->id);
Serial.print(" | 名称: ");
if (result->id == 0) {
Serial.println("unknown"); // 未学习统一显示 unknown
} else {
Serial.println(result->name); // 已学习显示实际名称
}
// 打印通用信息:置信度
Serial.print("置信度: ");
Serial.println(result->score);
Serial.println("------------------------");
}
}
}
delay(100); // 延时100ms,避免刷屏
}
运行结果:
传感器自动对姿势进行识别,可区分已学习姿势和未学习姿势。

3. 固定手势识别
注意:该功能还处于测试阶段,AI模型识别精度有限。我们正在优化该功能中
固定手势列表如下:

代码中设置传感器为固定手势识别模式,可识别上图中的固定手势,串口则会打印对应的数字ID,例如检测到“OK“手势,会打印对应的ID "9"。不在上图中的手势,均打印为未检测到有效手势。
示例代码:
#include <DFRobot_HumanPose.h>
// 选择通信方式:默认使用I2C(接线最简单)
#define HUMANPOSE_COMM_I2C
#if defined(HUMANPOSE_COMM_I2C)
// I2C默认地址0x3A,无需修改
const uint8_t I2C_ADDR = 0x3A;
DFRobot_HumanPose_I2C humanPose(&Wire, I2C_ADDR);
#else
#error "请先定义通信方式(推荐I2C)"
#endif
// 无目标提示间隔(单位:毫秒),默认1000ms=1秒,避免刷屏
const unsigned long NO_TARGET_INTERVAL = 1000;
// 记录上次打印无目标提示的时间
unsigned long lastNoTargetTime = 0;
void setup()
{
Serial.begin(115200);
// 初始化传感器
while (!humanPose.begin()) {
Serial.println("传感器初始化失败,请检查接线!");
delay(1000);
}
Serial.println("传感器初始化成功!");
Serial.println("请在传感器前方做出手势~");
Serial.println("------------------------");
// 设置为固定手势识别模式
humanPose.setModelType(DFRobot_HumanPose::eGesture);
}
void loop()
{
// 获取识别结果
if (humanPose.getResult() == DFRobot_HumanPose::eOK) {
bool hasTarget = false;
// 遍历所有检测到的手势
while (humanPose.availableResult()) {
Result *result = humanPose.popResult();
if (result) {
hasTarget = true;
// 打印手势核心信息
Serial.print("手势ID: "); Serial.print(result->id);
Serial.print(" | 名称: "); Serial.print(result->name);
Serial.print(" | 置信度: "); Serial.println(result->score);
Serial.print("位置: 左="); Serial.print(result->xLeft);
Serial.print(" 上="); Serial.print(result->yTop);
Serial.print(" 宽="); Serial.print(result->width);
Serial.print(" 高="); Serial.println(result->height);
Serial.println("------------------------");
}
}
// 关键修改:没有检测到目标时,按间隔打印提示
if (!hasTarget) {
unsigned long now = millis();
if (now - lastNoTargetTime >= NO_TARGET_INTERVAL) {
Serial.println("未检测到有效手势");
Serial.println("------------------------");
lastNoTargetTime = now; // 更新上次提示时间
}
}
} else {
// 可选:添加传感器读取超时提示(一般不用,除非接线松动)
// Serial.println("传感器读取超时");
}
delay(100);
}
运行结果:
比出上图中的任意手势,传感器能有效识别并打印对应的ID。

4. 获取手势学习列表
已学习的自定义手势或姿势可通过上位机软件查看列表,也可以通过本示例来查看。使用本例程前,请确保已在上位机上进行传感器自定义手势学习。
示例代码:
#include <DFRobot_HumanPose.h>
// I2C 固定配置
const uint8_t I2C_ADDR = 0x3A;
DFRobot_HumanPose_I2C humanPose(&Wire, I2C_ADDR);
void setup()
{
Serial.begin(115200);
// 初始化传感器
while (!humanPose.begin())
{
Serial.println("传感器连接失败...");
delay(1000);
}
Serial.println("传感器连接成功\n");
// 设置为手部检测模式(如需读取姿态列表,改成 ePose 即可)
humanPose.setModelType(DFRobot_HumanPose::eHand);
// 获取已学习列表
LearnList list = humanPose.getLearnList(DFRobot_HumanPose::eHand);
Serial.println("===== 已学习列表 =====");
for (int i = 0; i < list.size(); i++)
{
Serial.print("ID:");
Serial.print(i);
Serial.print(" 名称:");
Serial.println(list[i].c_str());
}
}
void loop()
{
// 无需循环,只读取一次
}
运行结果:

| Arduino UNO R3 主板由于运行内存限制,无法获取完整的学习列表。只能显示学习列表前4个,但识别功能不受影响,若学习了8个自定义手势,都可以识别检测到。
5. 点亮LED灯教程
本例程演示了传感器只有识别到ID为1的手势,才会点亮主板板载的LED灯。
示例代码:
#include <DFRobot_HumanPose.h>
// I2C 通信
const uint8_t I2C_ADDR = 0x3A;
DFRobot_HumanPose_I2C humanPose(&Wire, I2C_ADDR);
void setup() {
Serial.begin(115200);
// 初始化传感器
while (!humanPose.begin()) {
Serial.println("传感器初始化失败!");
delay(1000);
}
Serial.println("传感器初始化成功!");
// 设置手部检测模式
humanPose.setModelType(DFRobot_HumanPose::eHand);
// 降低误识别:提高置信度门槛
humanPose.setConfidence(80);
humanPose.setLearnSimilarity(80);
// 初始化LED
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
}
void loop() {
bool ledState = LOW; // 默认关灯
if (humanPose.getResult() == DFRobot_HumanPose::eOK) {
while (humanPose.availableResult()) {
Result *result = humanPose.popResult();
if (!result) continue;
// ==========================================
// ? 只有 ID=1 才亮灯
// ==========================================
if (result->id == 1 && result->score >= 80) {
ledState = HIGH;
Serial.print("✅ 识别到 ID=1 手势:");
Serial.println(result->name);
}
}
}
// 控制LED
digitalWrite(LED_BUILTIN, ledState);
delay(100);
}
运行结果:
打开串口监视器并设置波特率为 115200。当传感器识别到已学习列表中 ID=1 的手势,且识别置信度不低于 80 时,主控板上的 LED 灯会点亮,同时串口会输出识别到的手势 ID 和名称。
例如:如果上位机中学习的 ID=1 手势名称为 yes,识别成功后串口会打印:
✅ 识别到 ID=1 手势:yes
当未识别到手势、识别到的手势 ID 不是 1,或置信度低于设定阈值时,LED 灯保持熄灭。

6. 低功耗模式
硬件连接图:
I2C连接方式

连接说明
| 传感器引脚 | 连接 | 主控板引脚 |
|---|---|---|
| VCC | 连接 | 5V |
| GND | 连接 | GND |
| C | 连接 | 22/SCL |
| D | 连接 | 21/SDA |
| WAKEUP | 连接 | 13/D7 |
UART连接方式

连接说明
| 传感器引脚 | 连接 | 主控板引脚 |
|---|---|---|
| VCC | 连接 | 5V |
| GND | 连接 | GND |
| R | 连接 | 26/D3 |
| T | 连接 | 25/D2 |
| WAKEUP | 连接 | 13/D7 |
示例代码:
控制传感器的WAKEUP 引脚,实现低功耗休眠 + 唤醒。
// 传感器 EN/WAKE 引脚接 ESP32-E 引脚 D7
const int WAKEUP_PIN = D7;
void setup() {
Serial.begin(115200);
pinMode(WAKEUP_PIN, OUTPUT); // 设置为输出模式
}
void loop() {
// 1. 传感器休眠(低功耗)
digitalWrite(WAKEUP_PIN, LOW);
Serial.println("传感器已休眠 → 低功耗模式");
delay(3000); // 保持休眠3秒
// 2. 传感器唤醒
digitalWrite(WAKEUP_PIN, HIGH);
Serial.println("传感器已唤醒 → 正常工作");
delay(5000); // 保持工作5秒
}
运行结果:
打印结果可以看到传感器根据设定的时间进行工作状态切换。

7. 设置 UART 波特率
注意:本例程需要切换为UART 硬件连接方式。
该示例通过传感器默认9600初始波特率完成设备连接,用于一键修改并永久保存传感器UART串口通信波特率,适配不同传输速率使用需求。
示例代码:
#include <DFRobot_HumanPose.h>
// ESP32硬件串口1:RX=25,TX=26,传感器默认9600
DFRobot_HumanPose_UART humanPose(&Serial1, 9600, 25, 26);
void setup() {
Serial.begin(115200);
Serial1.begin(9600);
delay(100);
while (!humanPose.begin()) {
Serial.println("连接失败...");
delay(1000);
}
Serial.println("连接成功!");
// 修改波特率为115200
humanPose.setBaud(DFRobot_HumanPose_UART::eBaud_115200);
Serial.println("✅ 波特率已改为 115200 !");
}
void loop() {
}
运行结果:
该示例只打印一次,打开串口监视器后需要按 RST 查看输出。

10. AT命令教程
常用AT命令如下,更多请到更多资料下载SEN0670_串口通信协议_V.10.pdf。
| AT 指令 | 功能说明 | 返回值 |
|---|---|---|
AT+ID? |
查询设备 ID | {"type":0,"name":"ID?","code":0,"code_text":"EL_OK","ok":1,"data":"3343029e"} |
AT+NAME? |
查询设备名称 | {"type":0,"name":"NAME?","code":0,"code_text":"EL_OK","ok":1,"data":"DFRobot Human Pose"} |
AT+VER? |
查询固件版本 | {"type": 0, "name": "VER?", "code": 0, "code_text": "EL_OK", "ok": 1, "data": {"at_api": "v0", "software": "2026.04.14", "hardware": "v1.0.0"}} |
AT+RST |
设备重启 | 设备直接复位,通常不会收到完整成功回包。 |
AT+MODELS? |
查询模型列表 | {"type": 0, "name": "MODELS?", "code": 0, "code_text": "EL_OK", "ok": 1, "data": [{"id": 4, "type": 0, "address": 11669504, "size": 3010560}, {"id": 3, "type": 0, "address": 9322496, "size": 2347008}, {"id": 2, "type": 0, "address": 6963200, "size": 2359296}, {"id": 1, "type": 0, "address": 4194304, "size": 2768896}]} |
AT+MODEL? |
查询当前模型 | {"type": 0, "name": "MODEL?", "code": 0, "code_text": "EL_OK", "ok": 1, "data": {"id": 3, "type": 0, "address": 9322496, "size": 2347008}} |
AT+MODEL=1 |
切换模型 hand(自定义手势) | {"type": 0, "name": "MODEL", "code": 0, "code_text": "EL_OK", "ok": 1, "data": {"model": {"id": 1, "type": 0, "address": 4194304, "size": 2768896}}} |
AT+MODEL=3 |
切换模型 posture(自定义姿势) | {"type": 0, "name": "MODEL", "code": 0, "code_text": "EL_OK", "ok": 1, "data": {"model": {"id": 3, "type": 0, "address": 9322496, "size": 2347008}}} |
AT+MODEL=4 |
切换模型 gesture(固定姿势) | {"type": 0, "name": "MODEL", "code": 0, "code_text": "EL_OK", "ok": 1, "data": {"model": {"id": 4, "type": 0, "address": 11669504, "size": 3010560}}} |
AT+INVOKE=<n_times>,<differed>,<result_only> |
执行推理方式,例如:执行一次推理_仅结果,发送AT+INVOKE=1,0,1 |
{"type": 0, "name": "INVOKE", "code": 0, "data": {"timestamp_ms": 1248979, "model": {"id": 4, "type": 0, "address": 11669504, "size": 3010560}, "algorithm": {"type": 6, "categroy": 1, "input_from": 1, "config": {"tscore": 60, "tiou": 45}}, "sensor": {"id": 1, "type": 1, "state": 1, "opt_id": 0, "opt_detail": "240x240 Auto"}}} {"type": 1, "name": "INVOKE", "code": 0, "data": {"count": 1, "seq": 1, "timestamp_ms": 1249074, "image_base64_len": 0, "perf": [9, 85, 0], "boxes": [], "resolution": [240, 240]}} |
AT+BREAK |
停止当前任务 | {"type": 0, "name": "BREAK", "code": 0, "code_text": "EL_OK", "ok": 1, "data": 1346635} |
AT+TPROTO=0 |
切换 JSON 输出 | {"type": 0, "name": "TPROTO", "code": 0, "data": 0, "message": "TPROTO updated"} |
AT+TPROTO? |
查询输出协议 | {"type":0,"name":"TPROTO?","code":0,"data":0} |
AT+TKPTS=0 |
关闭关键点输出 | {"type": 0, "name": "TKPTS", "code": 0, "data": 0, "message": "TKPTS updated"} |
AT+TKPTS=1 |
开启关键点输出 | {"type": 0, "name": "TKPTS", "code": 0, "data": 1, "message": "TKPTS updated"} |
AT+TKPTS? |
查询关键点输出配置 | {"type": 0, "name": "TKPTS?", "code": 0, "data": 1} |
AT+TSCORE? |
查询置信度阈值 | {"type": 0, "name": "TSCORE?", "code": 0, "code_text": "EL_OK", "ok": 1, "data": 60} |
AT+TSCORE=60 |
设置置信度阈值 60 | {"type":0,"name":"TSCORE","code":0,"code_text":"EL_OK","ok":1,"data":60} |
AT+TIOU? |
查询 IOU 阈值 | {"type": 0, "name": "TIOU?", "code": 0, "code_text": "EL_OK", "ok": 1, "data": 45} |
AT+TIOU=45 |
设置 IOU 阈值 45 | {"type": 0, "name": "TIOU", "code": 0, "code_text": "EL_OK", "ok": 1, "data": 45} |
AT+TSIMILARITY? |
查询学习相似度阈值 | {"type": 0, "name": "TSIMILARITY?", "code": 0, "code_text": "EL_OK", "ok": 1, "data": 60} |
AT+TSIMILARITY=80 |
设置学习相似度阈值 80 | {"type": 0, "name": "TSIMILARITY", "code": 0, "code_text": "EL_OK", "ok": 1, "data": 80} |
AT+HANDAUTOLEARN |
自动命名并开始手势学习 | {"type": 0, "name": "HANDAUTOLEARN", "code": 0, "data": {"hand_name": "Gesture_1"}} |
AT+HANDLIST? |
查询已学习手势 | {"type": 0, "name": "HANDLIST?", "code": 0, "data": []} |
AT+HANDCLEAR |
清空全部手势 | {"type": 0, "name": "HANDCLEAR", "code": 0} |
AT+POSEAUTOLEARN |
自动命名并开始姿态学习 | {"type": 0, "name": "POSEAUTOLEARN", "code": 0, "data": {"pose_name": "Posture_1"}} |
AT+POSELIST? |
查询已学习姿态 | {"type": 0, "name": "POSELIST?", "code": 0, "data": []} |
AT+POSECLEAR |
清空全部姿态 | {"type": 0, "name": "POSECLEAR", "code": 0} |
AT通讯示例:
准备: 传感器通过USB接口连接到电脑,打开sscom类似的串口助手软件。

**注意: **
如果串口返回内容中夹杂乱码或不可见字符,但能看到部分有效字段,说明模块可能当前不是 JSON 文本输出模式。请先发送以下指令切换输出协议:
AT+TPROTO=0
切换成功后,再发送:
AT+ID?
正常情况下会返回 JSON 格式数据,例如:
{"type":0,"name":"ID?","code":0,"code_text":"EL_OK","ok":1,"data":"3343029e"}
11. API 函数
/**
* @fn begin
* @brief 初始化传感器
* @return 如果初始化成功返回 true,否则返回 false
*/
bool begin();
/**
* @fn getResult
* @brief 从传感器获取检测结果
* @return 类型为 `eCmdCode_t` 的状态代码。成功返回 `eOK`,否则返回错误代码。
* @note 调用此函数后,检测结果将存储在内部结果数组中。
* 您可以使用 availableResult() 和 popResult() 方法访问结果。
*/
eCmdCode_t getResult();
/**
* @fn setConfidence
* @brief 设置检测置信度阈值
*
* 设置检测被视为有效所需的最小置信度分数。
* 较高的值会导致更少但更可靠的检测。较低的值允许更多
* 检测但可能包含误报。
*
* @param confidence 置信度阈值值(0-100)。默认值通常为 60。
* @return 类型为 `eCmdCode_t` 的状态代码。成功返回 `eOK`,否则返回错误代码。
*/
eCmdCode_t setConfidence(uint8_t confidence);
/**
* @fn setIOU
* @brief 设置交并比(IOU)阈值
*
* 设置用于目标检测过程中非极大值抑制的 IOU 阈值。
* 此参数有助于过滤重叠的检测。
*
* @param iou IOU 阈值值(0-100)。默认值通常为 45。
* @return 类型为 `eCmdCode_t` 的状态代码。成功返回 `eOK`,否则返回错误代码。
*/
eCmdCode_t setIOU(uint8_t iou);
/**
* @fn setModelType
* @brief 设置检测模型
*
* 选择要使用的检测模型。
*
* @param model 类型为 `eModel_t` 的模型类型,可能的值包括:
* - `eHand` - 手势检测模型
* - `ePose` - 人体姿态检测模型
* - `eGesture` - 固定手势分类模型(MODEL 4)
* @return 类型为 `eCmdCode_t` 的状态代码。成功返回 `eOK`,否则返回错误代码。
*/
eCmdCode_t setModelType(eModel_t model);
/**
* @fn setLearnSimilarity
* @brief 设置学习目标的相似度阈值
*
* 设置用于将检测到的目标与学习目标匹配的相似度阈值。
* 此参数用于手势识别和学习姿态匹配。
*
* @param Similarity 相似度阈值值(0-100)。默认值通常为 60。
* @return 类型为 `eCmdCode_t` 的状态代码。成功返回 `eOK`,否则返回错误代码。
*/
eCmdCode_t setLearnSimilarity(uint8_t Similarity);
/**
* @fn getConfidence
* @brief 获取当前检测置信度阈值
*
* 检索当前配置的检测置信度阈值。
*
* @param confidence 用于存储置信度阈值值的指针(0-100)
* @return 类型为 `eCmdCode_t` 的状态代码。成功返回 `eOK`,否则返回错误代码。
*/
eCmdCode_t getConfidence(uint8_t* confidence);
/**
* @fn getIOU
* @brief 获取当前 IOU 阈值
*
* 检索当前配置的 IOU 阈值值。
*
* @param iou 用于存储 IOU 阈值值的指针(0-100)
* @return 类型为 `eCmdCode_t` 的状态代码。成功返回 `eOK`,否则返回错误代码。
*/
eCmdCode_t getIOU(uint8_t* iou);
/**
* @fn getLearnSimilarity
* @brief 获取当前相似度阈值
*
* 检索当前配置的相似度阈值值。
*
* @param Similarity 用于存储相似度阈值值的指针(0-100)
* @return 类型为 `eCmdCode_t` 的状态代码。成功返回 `eOK`,否则返回错误代码。
*/
eCmdCode_t getLearnSimilarity(uint8_t* Similarity);
/**
* @fn setKeypointOutput
* @brief 配置 INVOKE 输出是否包含关键点
* @param enable 1: 输出关键点, 0: 仅输出边界框
* @return 类型为 `eCmdCode_t` 的状态代码。
*/
eCmdCode_t setKeypointOutput(bool enable);
/**
* @fn getKeypointOutput
* @brief 获取当前关键点输出模式
* @param enable 用于存储 1(含关键点)/0(仅边界框) 的指针
* @return 类型为 `eCmdCode_t` 的状态代码。
*/
eCmdCode_t getKeypointOutput(uint8_t *enable);
/**
* @fn getLearnList
* @brief 获取指定模型的学习目标列表
*
* 检索指定检测模型的所有学习目标名称列表。
* 此函数可用于手势识别和姿态学习应用。
*
* @param model 类型为 `eModel_t` 的模型类型:
* - `eHand` - 获取学习手势列表
* - `ePose` - 获取学习姿态列表
* - `eGesture` - 不适用(返回空列表)
* @return 包含学习目标名称的字符串向量。出错时返回空向量。
*/
LearnList getLearnList(eModel_t model);
/**
* @fn availableResult
* @brief 检查是否有可用的检测结果
* @return 如果有可用的检测结果返回 true,否则返回 false
*/
bool availableResult();
/**
* @fn popResult
* @brief 获取并弹出下一个检测结果
* @return 指向 Result 对象的指针。如果没有可用结果则返回 NULL。
* @note 按当前模型分别转换为 PoseResult / HandResult / Result(`eGesture` 使用 Result)。
* 使用完后,结果会被标记为已使用。
*/
Result *popResult();
/**
* @fn setBaud
* @brief 设置 UART 波特率
*
* 配置 UART 通信波特率。用户可以根据需要选择合适的
* 波特率,以确保与设备的稳定和有效通信。
*
* @param baud 类型为 `eBaudConfig_t` 的波特率配置,可能的值包括:
* - `eBaud_9600` - 9600 波特(UART 默认链路)
* - `eBaud_14400` - 14400 波特
* - `eBaud_19200` - 19200 波特
* - `eBaud_38400` - 38400 波特
* - `eBaud_57600` - 57600 波特
* - `eBaud_115200`- 115200 波特
* - `eBaud_230400`- 230400 波特
* - `eBaud_460800`- 460800 波特
* - `eBaud_921600`- 921600 波特(高速)
* @return 如果成功设置波特率返回 true,否则返回 false
*/
bool setBaud(eBaudConfig_t baud);
// Result 基类包含以下公共成员:
uint8_t id; // 检测目标ID
uint16_t xLeft; // 边界框左上角X坐标
uint16_t yTop; // 边界框左上角Y坐标
uint16_t width; // 边界框宽度
uint16_t height; // 边界框高度
uint8_t score; // 分数(0-100):id==0 为检测置信度,id!=0 为与学习目标相似度
String name; // 检测目标名称
bool used; // 是否已使用标记
// PoseResult 类(人体姿态检测结果)额外包含以下关键点:
PointU16 nose; // 鼻子
PointU16 leye; // 左眼
PointU16 reye; // 右眼
PointU16 lear; // 左耳
PointU16 rear; // 右耳
PointU16 lshoulder; // 左肩
PointU16 rshoulder; // 右肩
PointU16 lelbow; // 左肘
PointU16 relbow; // 右肘
PointU16 lwrist; // 左手腕
PointU16 rwrist; // 右手腕
PointU16 lhip; // 左髋
PointU16 rhip; // 右髋
PointU16 lknee; // 左膝
PointU16 rknee; // 右膝
PointU16 lankle; // 左踝
PointU16 rankle; // 右踝
// HandResult 类(手势检测结果)额外包含以下关键点:
PointU16 wrist; // 手腕
PointU16 thumbCmc; // 拇指CMC
PointU16 thumbMcp; // 拇指MCP
PointU16 thumbIp; // 拇指IP
PointU16 thumbTip; // 拇指指尖
PointU16 indexFingerMcp; // 食指MCP
PointU16 indexFingerPip; // 食指PIP
PointU16 indexFingerDip; // 食指DIP
PointU16 indexFingerTip; // 食指指尖
PointU16 middleFingerMcp; // 中指MCP
PointU16 middleFingerPip; // 中指PIP
PointU16 middleFingerDip; // 中指DIP
PointU16 middleFingerTip; // 中指指尖
PointU16 ringFingerMcp; // 无名指MCP
PointU16 ringFingerPip; // 无名指PIP
PointU16 ringFingerDip; // 无名指DIP
PointU16 ringFingerTip; // 无名指指尖
PointU16 pinkyFingerMcp; // 小指MCP
PointU16 pinkyFingerPip; // 小指PIP
PointU16 pinkyFingerDip; // 小指DIP
PointU16 pinkyFingerTip; // 小指指尖
12. 产品资料
- SEN0670_电路原理图_V1.0.pdf
- SEN0670_尺寸图.png
- SEN0670_CAD图.zip
- SEN0670_STP文件.zip
- SEN0670_串口通信协议_V.10.pdf
- SEN0670-CE EMC.pdf
- SEN0670-CE ROHS.pdf
13. 常见问题
-
Q:上位机软件支持哪些电脑系统?
A:经测试验证,目前支持Win10/Win11系统。 -
Q:CH343P的驱动是否必须需要安装?
A:Windows 10/11 多数情况下可自动安装,若自动安装失败或显示为“未知设备”,需手动安装。
14. 更多
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。