问题描述
想象一下:不碰开关、不找遥控器,也不用打开手机 App,只需张开手掌或轻轻握拳,就能让灯光随手势明暗变化。
这一次,我们基于 K230/K230D 的端侧 AI 能力,打造了一套“基于视觉的远程灯光交互系统”。摄像头负责捕捉手部动作,AI 模型实时识别手部和 21 个关键点,再通过 PWM 控制 LED 亮度。整个过程在设备端完成,响应直接,交互自然。
▶️ 先看运行效果视频
https://www.bilibili.com/video/BV1kwhA64ECC
一、这个项目能做什么?
这套系统把摄像头变成了灯光控制界面,主要支持以下功能:
- 隔空调节亮度:握拳对应 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 = 1000
CURL_CLOSED = 1.10
CURL_OPEN = 1.95
SMOOTH = 0.30
INTENT_ENABLED = True
INTENT_TIME_MS = 400
INTENT_SLOW = 0.50
INTENT_FAST = 1.60
- 手型差异较大时,可调整 CURL_CLOSED 和 CURL_OPEN。
- 想让灯光变化更柔和,可适当减小 SMOOTH。
- 想让亮度响应更灵敏,可适当增大 SMOOTH。
- 如果意图锁定太慢或太容易触发,可调整 INTENT_TIME_MS 及速度阈值。
- 如果更换接线,可修改 LED_PINS 中的 IO 引脚和 PWM 通道。
建议每次只调整一个参数,观察效果后再继续校准。
八、还能用在哪里?
手势控制不仅有趣,也适合许多不方便触碰开关的场景:
- 医院、实验室及洁净室中的非接触控制
- 厨房和食品加工环境中的卫生操作
- 会议室、演播室的快速调光
- 智能家居和无障碍交互
- 戴手套的工业现场
- 展厅、橱窗和互动装置
还可以继续扩展继电器、灯带、舵机等外设,把手势识别变成更多设备的自然交互入口。涉及市电或大功率负载时,务必使用符合安全规范的驱动与隔离方案。
写在最后
从手部检测、关键点估计,到意图过滤、径向菜单和 PWM 调光,这个项目展示了 K230/K230D 在端侧视觉交互中的完整能力。
一块开发板、一个摄像头、两盏 LED,就能让“挥挥手控制灯光”从想法变成现实。打开项目,接好灯光,一起解锁 K230/K230D 的 AI 视觉新玩法吧!
