☰
深度揭秘手势识别模块:I2C 0x39寄存器指令与手势识别原理终极解析
2026/9/25 3:08:29 网站建设 项目流程

深度揭秘手势识别模块: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:

  1. 向地址 0x39 写入0x01(告诉模块:我要查手势寄存器);
  2. 从同一地址读回 1 个字节,即当前手势的代码值;
  3. 代码值再查字典,翻译成"向右""向前""远离"等中文结果。

指令二: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):

手势代码枚举名中文含义
0x00GESTURE_NONE没有识别到手势
0x01GESTURE_RIGHT_SWIPE向右
0x02GESTURE_LEFT_SWIPE向左
0x03GESTURE_BACKWARD_SWIPE向后
0x04GESTURE_FORWARD_SWIPE向前
0x05GESTURE_UPWARD远离
0x06GESTURE_DOWNWARD靠近
0x07GESTURE_OUT_OF_RANGE超出识别范围
0x08GESTURE_HOVER正上方

📡 手势识别原理:红外飞行时间(ToF)感知

这类手势识别模块通常基于**红外飞行时间(Time-of-Flight)**技术:

  1. 传感器内置的红外 LED 向空间发射人眼不可见的红外光;
  2. 红外光遇到手掌等物体后反射回来,被感光元件接收;
  3. 芯片通过统计反射光的强度分布和传播时间,判断手掌的位置与运动方向;
  4. 内置的专用算法把原始数据转化为上面表中的标准手势代码,通过 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询