Rocky Rover:基于 Arduino 101 与 PixyCam 的视觉追踪智能小车
项目概览
本项目基于 Intel Arduino 101(内置 BLE 与 IMU)搭载 PixyCam (CMUcam5) 视觉传感器,构建一台能识别颜色物体并自主跟随的履带式机器人。通过 Blynk App 实现手机遥控与视觉模式切换,展示嵌入式视觉、电机控制、蓝牙通信的综合集成。
核心硬件清单
| 模块 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | Arduino 101 (Intel Curie) | 1 | BLE + 6轴 IMU,3.3V 逻辑 |
| 电机驱动 | Adafruit Motor Shield V2 (TB6612) | 1 | I2C 控制 4 路 DC 电机,堆叠兼容 |
| 底盘 | SparkFun Dagu DG102 履带底盘 | 1 | 含 4× 减速电机、履带、电池盒 |
| 视觉传感器 | PixyCam (CMUcam5) + Pan/Tilt 云台套件 | 1 | SPI 接口,50fps 色块追踪 |
| 供电 | Adafruit USB 移动电源 (5V/2A) + AA电池盒 | 各1 | 分离供电:逻辑/电机 |
| 结构件 | M2.5 铜柱、JST 极性连接器、排针、跳线 | 若干 | 云台安装、电池快拆 |
软件工具链
- Arduino IDE 1.8.19+(支持 Arduino 101 核心)
- Blynk App (iOS/Android) + Blynk Library
- PixyMon 配置工具(教色块、调参数)
- Pixy Arduino Library (SPI 通信)
关键技术点解析
1. PixyCam 视觉工作流
PixyCam 通过色度空间(HSV)阈值分割识别颜色签名(最多 7 个),输出检测到的色块信息:
signature:签名 ID (1-7)x, y:色块中心坐标 (0-319, 0-199)width, height:色块尺寸getBlocks()返回检测到的色块数量
教学过程:按住 Pixy 顶部按钮 → 对准目标物体 → 释放 → LED 闪烁确认 → 在 PixyMon 中微调 HSV 范围。
2. Pan/Tilt 云台 PID 跟随
利用色块中心偏差驱动舵机,保持目标居中:
// 云台 PID 控制核心逻辑
int32_t panError = X_CENTER - pixy.blocks[0].x; // X_CENTER = 160
int32_t tiltError = pixy.blocks[0].y - Y_CENTER; // Y_CENTER = 100
panLoop.update(panError); // PID 计算输出位置
tiltLoop.update(tiltError);
pixy.setServos(panLoop.m_pos, tiltLoop.m_pos); // 直接驱动 Pixy 内置舵机控制器
3. 底盘运动控制策略
根据色块面积(距离代理)与水平偏差计算差速转向:
// 面积越大 = 物体越近 -> 减速/后退
long size = blocks[trackedBlock].width * blocks[trackedBlock].height;
int forwardSpeed = constrain(400 - (size / 256), -100, 400);
// 水平偏差 -> 差速转向
int32_t followError = RCS_CENTER_POS - panLoop.m_pos;
int32_t differential = (followError + (followError * forwardSpeed)) >> 8;
int leftSpeed = constrain(forwardSpeed + differential, -400, 400);
int rightSpeed = constrain(forwardSpeed - differential, -400, 400);
motor1->setSpeed(leftSpeed); motor3->setSpeed(leftSpeed); // 左侧双电机
motor2->setSpeed(rightSpeed); motor4->setSpeed(rightSpeed); // 右侧双电机
4. BLE 遥控与模式切换
Blynk Virtual Pins 映射:
- V0: 摇杆 X/Y → 手动模式差速控制
- V1: 按钮 → 切换 手动/视觉跟随 模式
- V2: 滑块 → 设置最大速度限幅
视觉模式下,Pixy 数据优先;遮挡镜头(或无目标)自动停车。
完整固件架构
// 关键库
#include <SPI.h> #include <Pixy.h> #include <Wire.h>
#include <Adafruit_MotorShield.h> #include <BlynkSimpleCurieBLE.h> #include <CurieBLE.h>
// 全局对象
Pixy pixy;
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *motor[4];
BLEPeripheral blePeripheral;
// PID 控制器(简化版)
struct PID { float kp, ki, kd; int32_t integral, prevError; int32_t m_pos;
void update(int32_t error) {
integral += error;
int32_t deriv = error - prevError;
m_pos += (kp*error + ki*integral + kd*deriv) >> 8;
prevError = error;
}
} panLoop = {200, 0, 50}, tiltLoop = {200, 0, 50};
void setup() {
Serial.begin(115200);
pixy.init(); AFMS.begin();
for(int i=0;i<4;i++) motor[i] = AFMS.getMotor(i+1);
// BLE 初始化
blePeripheral.setLocalName("RockyRover");
blePeripheral.setDeviceName("RockyRover");
blePeripheral.setAppearance(0x0080);
Blynk.begin(blePeripheral, authToken);
}
void loop() {
Blynk.run(); // 处理 BLE 事件
if (visionMode) { // 视觉跟随模式
uint16_t blocks = pixy.getBlocks();
if (blocks) {
// 选取最大色块作为目标
int tracked = 0; long maxSize = 0;
for (int j=0; j maxSize) { maxSize = sz; tracked = j; }
}
// 云台 PID
int32_t panErr = 160 - pixy.blocks[tracked].x;
int32_t tiltErr = pixy.blocks[tracked].y - 100;
panLoop.update(panErr); tiltLoop.update(tiltErr);
pixy.setServos(panLoop.m_pos, tiltLoop.m_pos);
// 底盘运动控制(同上面策略)
// ...
} else {
stopAllMotors(); // 丢失目标停车
}
}
// 手动模式由 Blynk 回调直接控制电机
}
组装要点
- 底盘组装按 Dagu 说明书,电机接线对应 Motor Shield M1-M4
- 电池盒前移,腾出空间安装 Pan/Tilt 云台(云台舵机线接 Pixy 专用接口)
- PixyCam 通过 ICSP 排针 SPI 连接 Arduino 101(需飞线:SCK→13, MISO→12, MOSI→11, SS→10)
- Motor Shield 供电:VM 接电池盒(6×AA ≈ 9V),VIN 接 Arduino 101 VIN(共地)
- 整理走线,热缩管绝缘,扎带固定防震动脱落
测试与调试
- 先跑 Motor Shield 例程验证四轮正反转
- 跑 Pixy "hello_world" 例程确认 SPI 通信、色块检测
- 用 PixyMon 教红色/橙色南瓜(或任意高对比度物体)
- 调云台 PID 参数(kp/ki/kd)消除振荡
- 调底盘跟随参数(面积-速度映射、差速增益)
- 配对 Blynk,实测室内地毯/地板跟随效果
项目资源
- GitHub 代码仓库:Rocky Rover 固件
- PixyCam 官方 Wiki:文档与 API
- Blynk 文档:BLE 接入指南
后续迭代方向 (Mark 2)
- 升级 ESP32-CAM 或 OpenMV H7,实现边缘 AI 目标检测(不限颜色)
- 引入 SLAM(激光雷达/视觉里程计)实现自主导航
- 加装机械臂,完成“看-走-抓”闭环任务
- ROS 2 微控制器移植,标准化消息接口
制造工艺
- Arduino POV 时钟:自制视觉暂留 LED 显示器
- SERENA:基于 Arduino Mega 2560 与 TFT 触摸屏的多级密码报警系统
- 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
- Arduino 项目优化供电方案:从按键开关到电池监测与数据记录
- Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
- Arduino 101 BLE + Blynk:DIY 蓝牙遥控履带坦克车
- 智能配对墨镜:Arduino 101 + tinyTILE BLE 实现眼神交流信号
- 自制便携式视觉暂留显示器:Arduino UNO 与 ATtiny85
- DIY Arduino 智能手表:打造属于你的 Apple Watch 风格腕表
- 智能地下室通风系统:Arduino 驱动的湿度自动控制
- Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里
- 优化机器人手术视觉系统照明设计