一、这个项目能做什么?
这套系统把摄像头变成了灯光控制界面,主要支持以下功能:
隔空调节亮度:握拳对应 0%,完全张开对应 100%,手掌张开程度决定 LED 亮度。
分别控制两路灯光:可单独选择 LED1、LED2,也可同时控制两路 LED。
三分区控制:画面被划分为左、中、右三个区域,分别对应 LED2、两灯联动和 LED1。
意图锁定:只有手部稳定停留并被系统判定为主动控制时,操作才会生效。
多人安全保护:多只具有控制意图的手同时指向同一目标时,系统自动冻结控制,避免灯光误跳变。
实时性能显示:屏幕可同步显示 FPS、CPU 负载、推理耗时、内存、PWM 占空比及端到端延迟。
这不仅是一个“识别手势后开关灯”的小实验,更是一套具备菜单选择、用户意图判断、安全仲裁和状态反馈的完整交互系统。
二、准备材料
K230/K230D 开发板
与开发板适配的摄像头模块
LCD 显示屏,也可根据配置使用 HDMI
LED 模块 × 2
SD 卡
若干杜邦线
CanMV IDE
CanMV 最新固件
下载地址:https://download.kendryte.com/developer/releases/canmv_k230_micropython/daily_build/?lang=zh
三、连接两路 LED
项目默认使用两路硬件 PWM 驱动 LED,因此支持连续亮度调节,而不只是简单地亮灭。
LED | 信号引脚 | PWM 通道 |
LED1 | IO42 | PWM0 |
LED2 | IO43 | PWM1 |
两路 LED 的 VCC 接开发板 3V3,GND 接开发板 GND,IN 分别连接 IO42 和 IO43。
接线前请确认所用 LED 模块支持 3.3V 控制,并核对开发板引脚定义。不要直接用 GPIO 驱动超过引脚额定电流的负载;控制大功率灯具时,应增加合适的驱动或隔离电路。
四、三步完成部署
第 1 步:烧录 MicroPython 固件
将与开发板型号匹配的 MicroPython 镜像烧录到设备。完成后启动开发板,并确认 CanMV IDE 可以正常连接。
第 2 步:准备项目文件
拉取完整 SDK 后,示例代码位于:
src/canmv/resources/examples/27-Gesture-controlled-light/无需手动复制示例目录。升级固件后,构建系统会自动将示例打包到 SD 卡的 /sdcard/examples/ 目录,设备上的运行路径为:
/sdcard/examples/27-Gesture-controlled-light/main.py 会将该绝对路径加入模块搜索目录。
第 3 步:运行程序
在 CanMV IDE 中打开 /sdcard/examples/27-Gesture-controlled-light/main.py,连接开发板并运行。初始化完成后,显示屏上会出现四扇区径向菜单。
五、如何用手势控制灯光?
1. 选择控制模式
将手移动到径向菜单的目标扇区,该扇区会高亮显示。随后竖起大拇指并保持约 400 ms,等待进度弧线走完即可确认。
菜单包含四种模式:
LED1:单独控制 LED1
BOTH:同时控制 LED1 和 LED2
LED2:单独控制 LED2
REGION:进入三分区控制模式
2. 调节亮度
进入 LED1、LED2 或 BOTH 模式后:
握拳 → 0%亮度半张 → 约50%亮度张开 → 100%亮度
系统会连续计算手掌张开度,并平滑映射到 PWM 占空比,因此灯光可以自然地渐亮、渐暗。
3. 使用三分区模式
选择 REGION 后,画面会分成三个垂直区域:
左侧区域 | 中间区域 | 右侧区域 |
控制 LED2 | 控制两路 LED | 控制 LED1 |
把手放入某个区域,再改变手掌张开程度,即可控制对应灯光。
4. 返回菜单
在任一控制模式中竖起大拇指,即可重新打开径向菜单。系统设置了姿态释放时间和菜单冷却时间,长时间保持同一手势不会连续误触发。
六、为什么路过的人不会误触?
普通手势识别系统只要“看到手”就可能执行命令,但真实环境中经常有人从镜头前经过。为此,本项目加入了逐帧意图判断机制。
系统会跟踪手部运动速度,并将其划分为三个状态:
PASS(灰色):快速移动,判定为路过,忽略操作。
SEEN(琥珀色):手部正在减速,控制意图逐渐形成。
LOCK(绿色):手部低速稳定保持约 400 ms,获得控制权。
只有进入 LOCK 状态的手才能操作菜单或改变灯光。如果两只或更多有效手同时控制同一目标,系统会显示红色的 SAFETY LOCK 提示并冻结输出。
七、按自己的习惯调一调
常用参数集中在 config.py 中:
LED_PINS = (("LED1", 42, 0),("LED2", 43, 1))PWM_FREQ = 1000CURL_CLOSED = 1.10CURL_OPEN = 1.95SMOOTH = 0.30INTENT_ENABLED = TrueINTENT_TIME_MS = 400INTENT_SLOW = 0.50INTENT_FAST = 1.60
手型差异较大时,可调整 CURL_CLOSED 和 CURL_OPEN。
想让灯光变化更柔和,可适当减小 SMOOTH。
想让亮度响应更灵敏,可适当增大 SMOOTH。
如果意图锁定太慢或太容易触发,可调整 INTENT_TIME_MS 及速度阈值。
如果更换接线,可修改 LED_PINS 中的 IO 引脚和 PWM 通道。
建议每次只调整一个参数,观察效果后再继续校准。
八、还能用在哪里?
手势控制不仅有趣,也适合许多不方便触碰开关的场景:
医院、实验室及洁净室中的非接触控制
厨房和食品加工环境中的卫生操作
会议室、演播室的快速调光
智能家居和无障碍交互
戴手套的工业现场
展厅、橱窗和互动装置
还可以继续扩展继电器、灯带、舵机等外设,把手势识别变成更多设备的自然交互入口。涉及市电或大功率负载时,务必使用符合安全规范的驱动与隔离方案。
写在最后
从手部检测、关键点估计,到意图过滤、径向菜单和 PWM 调光,这个项目展示了 K230/K230D 在端侧视觉交互中的完整能力。
一块开发板、一个摄像头、两盏 LED,就能让“挥挥手控制灯光”从想法变成现实。打开项目,接好灯光,一起解锁 K230/K230D 的 AI 视觉新玩法吧!

