【K230/K230D 新技能点亮】握拳灯灭、张手灯亮:用 K230/K230D 打造 AI 手势灯

Viewed 44

问题描述


想象一下:不碰开关、不找遥控器,也不用打开手机 App,只需张开手掌或轻轻握拳,就能让灯光随手势明暗变化。
这一次,我们基于 K230/K230D 的端侧 AI 能力,打造了一套“基于视觉的远程灯光交互系统”。摄像头负责捕捉手部动作,AI 模型实时识别手部和 21 个关键点,再通过 PWM 控制 LED 亮度。整个过程在设备端完成,响应直接,交互自然。
image.png

▶️ 先看运行效果视频
https://www.bilibili.com/video/BV1kwhA64ECC

一、这个项目能做什么?

这套系统把摄像头变成了灯光控制界面,主要支持以下功能:

  • 隔空调节亮度:握拳对应 0%,完全张开对应 100%,手掌张开程度决定 LED 亮度。
  • 分别控制两路灯光:可单独选择 LED1、LED2,也可同时控制两路 LED。
  • 三分区控制:画面被划分为左、中、右三个区域,分别对应 LED2、两灯联动和 LED1。
  • 意图锁定:只有手部稳定停留并被系统判定为主动控制时,操作才会生效。
  • 多人安全保护:多只具有控制意图的手同时指向同一目标时,系统自动冻结控制,避免灯光误跳变。
  • 实时性能显示:屏幕可同步显示 FPS、CPU 负载、推理耗时、内存、PWM 占空比及端到端延迟。
    这不仅是一个“识别手势后开关灯”的小实验,更是一套具备菜单选择、用户意图判断、安全仲裁和状态反馈的完整交互系统。

二、准备材料

硬件

  • K230/K230D 开发板
  • 与开发板适配的摄像头模块
  • LCD 显示屏,也可根据配置使用 HDMI
  • LED 模块 × 2
  • SD 卡
  • 若干杜邦线

软件

三、连接两路 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 视觉新玩法吧!

1 Answers