HomeBright:Leap Motion 手势控制智能家居灯光系统 (Arduino UNO)
项目概述
HomeBright 是一个基于 Leap Motion Controller 手势识别与 Arduino UNO 硬件控制的智能家居灯光演示系统。通过将家庭平面图映射到 Leap Motion 的三维坐标空间,用户只需伸手指向对应区域,手掌高度控制该区域灯光亮度,抓握手势开关灯。项目使用 Node.js + Cylon.js 机器人框架串联 Leap Motion 与 Arduino Firmata 协议,适合作为手势交互原型、智能家居教学或创客展示。
硬件架构
| 组件 | 数量 | 角色 |
|---|---|---|
| Arduino UNO | 1 | 运行 StandardFirmata,驱动 4 路 PWM LED |
| Leap Motion Controller | 1 | USB 连接电脑,捕获手部骨骼数据 |
| LED (通用 5mm) | 4 | 分别代表:客厅、餐厅、卧室、书房 |
| 220Ω 电阻 | 4 | LED 限流 |
| 面包板 + 杜邦线 | 若干 | 搭建电路 |
| 电脑 (Windows/macOS/Linux) | 1 | 运行 Node.js 宿主程序 |
电路连接
- LED 阳极 (长脚) → Arduino PWM 引脚 6, 9, 10, 11 (分别对应 4 房间)
- LED 阴极 → 220Ω 电阻 → GND
- Arduino 通过 USB 连接电脑,上传 StandardFirmata 固件 (Arduino IDE: 文件 > 示例 > Firmata > StandardFirmata)
软件环境搭建
- 安装 Node.js (建议 LTS 版本)
- 安装 Leap Motion SDK (v2.3.1+),运行 Leap Motion 服务
- 初始化项目并安装依赖:
mkdir homebright && cd homebright
npm init -y
npm install cylon cylon-firmata cylon-gpio cylon-i2c cylon-leapmotion firmata serialport
或使用附件 package.json 直接 npm install。
核心代码解析 (homebright-console.js)
"use strict";
var cylon = require("cylon");
cylon.robot({
connections: {
leapmotion: { adaptor: "leapmotion" },
arduino: { adaptor: "firmata", port: "COM7" } // 修改为你的串口
},
devices: {
leapmotion: { driver: "leapmotion" },
livingroom: { driver: "led", pin: 6, connection: "arduino" },
dininghall: { driver: "led", pin: 9, connection: "arduino" },
bedroom: { driver: "led", pin: 10, connection: "arduino" },
studyroom: { driver: "led", pin: 11, connection: "arduino" }
},
work: function(my) {
my.leapmotion.on("hand", function(hand) {
// 抓握强度 > 0.5 视为"关灯手势",否则开灯
var on = hand.grabStrength > 0.5 ? false : true;
// 手掌中心坐标 (mm) : x(左右), y(高度), z(前后)
var x = hand.palmPosition[0];
var z = hand.palmPosition[2];
// 亮度映射:手掌高度 y (0~300mm) → PWM 0~255
var value = on ? hand.palmPosition[1] : 0;
console.log("Brightness:", value, "Zone:", x>0?"Right":"Left", z>0?"Front":"Back");
// 简单四象限映射房间
if (x > 0 && z > 0) {
my.livingroom.brightness(value); // 右前 → 客厅
} else if (x > 0 && z < 0) {
my.dininghall.brightness(value); // 右后 → 餐厅
} else if (x < 0 && z > 0) {
my.studyroom.brightness(value); // 左前 → 书房
} else {
my.bedroom.brightness(value); // 左后 → 卧室
}
});
}
}).start();
运行与测试
- 确认 Leap Motion 服务运行中 (系统托盘图标为绿色)
- 修改代码中 Arduino 串口号 (
port: "COM7"或"/dev/ttyUSB0") - 运行:
node homebright-console.js - 将 Leap Motion 放在桌面朝上,手掌悬停在设备上方:
- 手掌水平移动 (x/z) 切换控制目标房间 (LED 亮起指示)
- 手掌上下移动 (y) 调节该房间 LED 亮度
- 握拳 (抓握) → 关灯;张开手掌 → 开灯并恢复亮度
坐标映射与房间划分优化
当前代码使用简单的四象限硬编码映射。实际部署时建议:
- 校准步骤:引导用户将手掌指向各房间实体位置,记录坐标范围
- 使用
hand.stabilizedPalmPosition获取更平滑坐标 - 引入房间多边形区域判断 (point-in-polygon) 替代象限判断
- 添加平滑滤波 (EMA/Kalman) 消除亮度抖动
扩展方向
- 多灯/彩灯支持:替换为 WS2812B 灯带,用 Cylon
neopixel驱动实现 RGB 调色 - 语音融合:集成
cylon-speech或 Web Speech API,实现"打开客厅灯"+"手势微调" - 场景模式:定义"观影模式""阅读模式"等预设,手势一键调用
- 边缘部署:将 Node.js 宿主移植到树莓派 4,配合本地 Leap Motion 或改用摄像头 + MediaPipe Hands 实现无专用硬件手势识别
- MQTT/Home Assistant 集成:Cylon 发布 MQTT 消息,接入 Home Assistant 实现真实灯具控制