Arduino DIY 人脸追踪云台:OpenCV + 双舵机 + 串口通讯
项目背景
作者受启发于 3D 打印同事头像,设计了一款“会盯着人看”的桌面云台。摄像头连接 PC 运行 Python+OpenCV 人脸检测,检测到人脸后通过 USB 串口发送舵机角度指令给 Arduino,驱动双舵机 (Pan/Tilt) 将人脸保持在画面中心。项目开源了 3D 打印模型、Arduino 固件与 Python 检测端,极易复刻与二次开发。
核心硬件
- Arduino UNO ×1
- USB 摄像头 (UVC 免驱) ×1
- MG90S 金属齿舵机 ×2:Pan (水平) + Tilt (垂直)
- 7805 稳压模块 ×1:9V 降 5V 供舵机
- 3×LED (红/黄/绿) + 220Ω:状态指示
- 3D 打印云台结构件:Thingiverse 下载
- 9V 1A 电源适配器、DC 插座、自攻螺丝、杜邦线 若干
系统架构
┌──────────────┐ USB/Serial (115200) ┌──────────────┐ │ PC (Win10) │ ◀──────────────────────────▶ │ Arduino UNO │ │ Python+OpenCV│ 指令:│ 双舵机驱动 │ └──────────────┘ └──────────────┘ ▲ │ │ 摄像头视频流 │ PWM ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ USB Camera │ │ Pan/Tilt │ │ (UVC) │ │ Servos │ └──────────────┘ └──────────────┘
Arduino 固件要点
通讯协议
帧格式:<pan_angle,tilt_angle,led_state>,例如 <90.5,45.0,1>
- 起始标记
<,结束标记> - 字段以逗号分隔,
strtok解析 led_state:0=红(无人脸),1=绿(居中),2=黄(偏离),3=全亮(启动自检)
核心循环
void loop() {
getDataFromPC(); // 非阻塞串口解析
replyToPC(); // 回传当前舵机角度供 PC 校验
moveServo(); // 写入目标角度
setLED(); // 更新状态灯
}
启动自检序列
上电后舵机回中 (90°,90°),RGB 灯跑马灯自检,最后发送 <Hasta la vista baby> 就绪消息。
Python 人脸检测端 (GitHub 开源)
仓库:LittleFrenchKev/face_tracking_camera
核心流程
cv2.VideoCapture(0)打开摄像头cv2.CascadeClassifier('haarcascade_frontalface_default.xml')加载 Haar 级联分类器- 每帧检测人脸,取最大面积人脸中心点
(cx, cy) - 计算偏差:
err_x = cx - frame_w/2,err_y = cy - frame_h/2 - 比例控制:
pan += Kp * err_x,tilt -= Kp * err_y(Kp 经验值 ~0.05) - 限幅 0–180°,打包发送串口指令
- 无人脸时随机游走或回中
可配置参数 (config.json)
- 舵机角度限幅 (min/max)
- 舵机方向反转
- PID 增益 / 死区
- 串口端口 / 波特率
- 检测置信度阈值
3D 打印与组装
- 模型文件:官网下载 或 Thingiverse
- 材料建议:PLA,0.2mm 层高,20% 填充
- 打印件:底座、水平臂、垂直臂、摄像头支架、舵机固定座、盖板
- 组装视频教程见项目页面 “Assembly” 章节
接线原理图
见 Schematics 部分 (PNG)。关键点:
- 舵机信号线 → D8 (Pan), D9 (Tilt)
- LED 红/黄/绿 → D2/D3/D4 (共阴极)
- 7805 输入 9V,输出 5V 并联供双舵机 + Arduino (Vin)
- 摄像头直插 PC USB,不接 Arduino
扩展创意
- 替换为 ESP32-CAM,实现完全无线、无 PC 的嵌入式人脸追踪
- 升级检测器为 MediaPipe Face Mesh / YOLOv8,支持多关键点、姿态估计
- 加入 激光指示器,人脸居中时投射红点 (需严格眼部安全评估)
- 集成 语音交互 (Snowboy/Porcupine),实现“Hey Robot, look at me”
- 云台搭载 热成像模块 (MLX90640),实现体温筛查机器人
常见问题
- 舵机抖动/卡顿
- 供电不足:舵机单独供电,加 470μF 电解电容;软件端加平滑滤波 (EMA)。
- 串口通讯乱码/丢帧
- 波特率统一 115200;Python 端
serial.write()后flush();帧头帧尾校验。 - 人脸检测频繁丢失
- 环境光不足 → 补光;Haar 级联对侧脸弱 → 换 DNN/SSD/MediaPipe;分辨率过高导致延迟 → 降至 320×240。
- 云台运动范围不足
- 检查 3D 打印件干涉、舵机物理限位、代码角度限幅设置。
制造工艺
- 树莓派实时人脸追踪云台:OpenCV + 舵机 + ServoBlaster 实战
- 定制 4×4 井字棋名片 PCB – 设计、制作与代码指南
- 多位置温度传感器系统,助力智能家居集成
- 862D+ 电烙铁 DIY 智能温控器:精准可靠,低成本替代方案
- MotionSense:基于 Arduino 与 ESP8266 的智能入侵检测系统
- 3D 打印机防火卫士:智能传感器安全系统
- 基于 Arduino、Yaler 与 IFTTT 构建 Web 化 IoT 仪表盘
- Arduino 简易排斥式磁悬浮:电路与 DIY 指南
- 进阶遥控夹爪机器人:精密抓取 DIY 指南
- 高性能 Arduino 气象气球数据记录器
- Arduino Nano + OpenCV 人脸追踪自主机器人小车
- CoroFence 热成像检测器:Panasonic GridEye + PIR + IoT 集成