深度揭秘手势识别模块:I2C 0x39寄存器指令与手势识别原理终极解析
【免费下载链接】gesture-recognition源师兄扩展项目: 手势识别 | 由源师兄组织创建项目地址: https://gitcode.com/yuanshixiong/gesture-recognition
本文以大师兄板的 gesture-recognition(手势识别)项目为例,面向新手讲透手势识别模块如何通过 I2C 总线与主控通信:默认 I2C 地址 0x39 从哪里来、0x00 与 0x01 两个寄存器指令分别做什么、8 种手势识别结果如何一一映射,以及模块背后的红外感知原理。
🧩 项目是什么:一块"会看手势"的扩展模块
gesture-recognition 是源师兄组织开发的一款扩展板项目,专为大师兄板设计。把模块插上开发板后,你只需用手在传感器前挥动,就能通过 I2C 接口读取"向左、向右、靠近、远离"等手势结果,非常适合做免接触交互、空中遥控、手势触发开关等创意项目。
项目的核心代码非常精简,主要文件如下:
| 文件 | 作用 |
|---|---|
| library/gesture_recognizer.py | 手势识别核心库,封装 I2C 寄存器读写 |
| blocksdef.js | 图形化编程(Blockly)积木块定义 |
| category.json | 积木分类注册:"手势识别模块" |
📍 快速找到设备:I2C 地址 0x39
I2C 总线上可以挂很多设备,每个设备靠7 位地址区分,就像每栋楼有门牌号。手势识别模块的"门牌号"被硬编码在库文件的第 5 行:
- 核心定义:library/gesture_recognizer.py#L5
DEFAULT_I2C_ADDRESS: int = const(0x39)在初始化GestureRecognizer(i2c)时,如果手动不传地址,就默认使用 0x39。这意味着所有后续的寄存器读写指令,都会以 0x39 作为目标设备地址发送到 I2C 总线上。
💡 小提示:I2C 通信由主控板发起,方向是"先写寄存器号,再读数据",全程只需要 SDA、SCL 两根信号线加电源,接线非常简单。
📖 两条核心寄存器指令详解
该模块对外暴露了两条最基础的指令,都遵循"写 1 字节寄存器地址 → 读 1 字节返回值"的模式。
指令一:0x01 —— 读取当前手势
这是最常用的指令。源码见 library/gesture_recognizer.py#L32-L39:
- 向地址 0x39 写入
0x01(告诉模块:我要查手势寄存器); - 从同一地址读回 1 个字节,即当前手势的代码值;
- 代码值再查字典,翻译成"向右""向前""远离"等中文结果。
指令二:0x00 —— 读取模块版本
见 library/gesture_recognizer.py#L41-L44:写入0x00后读回 1 个字节,返回模块的硬件/固件版本标识,方便排查设备是否正常上电、通信是否握手成功。
| 寄存器 | 指令方向 | 返回内容 | 典型用途 |
|---|---|---|---|
0x00 | 写 1 字节,读 1 字节 | 版本号 | 上电自检、调试通信 |
0x01 | 写 1 字节,读 1 字节 | 手势代码(0x00~0x08) | 实时获取手势识别结果 |
🖐 8 种手势识别结果完整映射表
模块对手势的判定结果以 1 字节代码表示,库中通过gesture_dict字典翻译成中文(源码见 library/gesture_recognizer.py#L7-L30):
| 手势代码 | 枚举名 | 中文含义 |
|---|---|---|
0x00 | GESTURE_NONE | 没有识别到手势 |
0x01 | GESTURE_RIGHT_SWIPE | 向右 |
0x02 | GESTURE_LEFT_SWIPE | 向左 |
0x03 | GESTURE_BACKWARD_SWIPE | 向后 |
0x04 | GESTURE_FORWARD_SWIPE | 向前 |
0x05 | GESTURE_UPWARD | 远离 |
0x06 | GESTURE_DOWNWARD | 靠近 |
0x07 | GESTURE_OUT_OF_RANGE | 超出识别范围 |
0x08 | GESTURE_HOVER | 正上方 |
📡 手势识别原理:红外飞行时间(ToF)感知
这类手势识别模块通常基于**红外飞行时间(Time-of-Flight)**技术:
- 传感器内置的红外 LED 向空间发射人眼不可见的红外光;
- 红外光遇到手掌等物体后反射回来,被感光元件接收;
- 芯片通过统计反射光的强度分布和传播时间,判断手掌的位置与运动方向;
- 内置的专用算法把原始数据转化为上面表中的标准手势代码,通过 I2C 的
0x01寄存器输出。
正因为判定算法集成在模块芯片内部,主控侧只需要做"读寄存器 + 查字典"两步,逻辑非常轻量,这也是新手上手快的关键原因。
🚀 最快上手:3 行 Python 读取手势
得益于库的封装,读取手势只需要几行代码(I2C 总线号以 1 为例):
from machine import I2C from gesture_recognizer import GestureRecognizer i2c = I2C(1) gesture_recognizer = GestureRecognizer(i2c) print(gesture_recognizer.gesture) # 输出如:"向右"、"没有识别到手势"图形化编程用户同样简单:项目通过 blocksdef.js#L1-L10 提供了"手势识别 | 获取手势"积木,又通过 blocksdef.js#L23-L34 提供了"手势识别模块 | 识别到"布尔判断积木(可选"向前/向后/向左/向右/远离/靠近"等状态),积木分类则在 category.json 中注册为"手势识别模块"。拖一块积木,即可实现"识别到向前 → 执行某个动作"的免接触控制逻辑。
✅ 总结
- 手势识别模块挂在 I2C 总线上,默认地址为0x39,由 library/gesture_recognizer.py 统一封装;
- 两条核心寄存器指令:
0x00读版本、0x01读手势,均为"写 1 字节 + 读 1 字节"; - 8 个手势代码覆盖左右/前后/靠近/远离/悬停等常用交互场景,可直接映射为中文结果;
- 无论 Python 还是图形化积木,3 步之内即可读取手势,是入门 I2C 传感器与免接触交互的优质练手项目。
【免费下载链接】gesture-recognition源师兄扩展项目: 手势识别 | 由源师兄组织创建项目地址: https://gitcode.com/yuanshixiong/gesture-recognition
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考