亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Rocky Rover:基于 Arduino 101 与 PixyCam 的视觉追踪智能小车

项目概览

本项目基于 Intel Arduino 101(内置 BLE 与 IMU)搭载 PixyCam (CMUcam5) 视觉传感器,构建一台能识别颜色物体并自主跟随的履带式机器人。通过 Blynk App 实现手机遥控与视觉模式切换,展示嵌入式视觉、电机控制、蓝牙通信的综合集成。

核心硬件清单

模块型号/规格数量备注
主控板Arduino 101 (Intel Curie)1BLE + 6轴 IMU,3.3V 逻辑
电机驱动Adafruit Motor Shield V2 (TB6612)1I2C 控制 4 路 DC 电机,堆叠兼容
底盘SparkFun Dagu DG102 履带底盘1含 4× 减速电机、履带、电池盒
视觉传感器PixyCam (CMUcam5) + Pan/Tilt 云台套件1SPI 接口,50fps 色块追踪
供电Adafruit USB 移动电源 (5V/2A) + AA电池盒各1分离供电:逻辑/电机
结构件M2.5 铜柱、JST 极性连接器、排针、跳线若干云台安装、电池快拆

软件工具链

关键技术点解析

1. PixyCam 视觉工作流

PixyCam 通过色度空间(HSV)阈值分割识别颜色签名(最多 7 个),输出检测到的色块信息:

教学过程:按住 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 映射:

视觉模式下,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 回调直接控制电机
}

组装要点

  1. 底盘组装按 Dagu 说明书,电机接线对应 Motor Shield M1-M4
  2. 电池盒前移,腾出空间安装 Pan/Tilt 云台(云台舵机线接 Pixy 专用接口)
  3. PixyCam 通过 ICSP 排针 SPI 连接 Arduino 101(需飞线:SCK→13, MISO→12, MOSI→11, SS→10)
  4. Motor Shield 供电:VM 接电池盒(6×AA ≈ 9V),VIN 接 Arduino 101 VIN(共地)
  5. 整理走线,热缩管绝缘,扎带固定防震动脱落

测试与调试

  1. 先跑 Motor Shield 例程验证四轮正反转
  2. 跑 Pixy "hello_world" 例程确认 SPI 通信、色块检测
  3. 用 PixyMon 教红色/橙色南瓜(或任意高对比度物体)
  4. 调云台 PID 参数(kp/ki/kd)消除振荡
  5. 调底盘跟随参数(面积-速度映射、差速增益)
  6. 配对 Blynk,实测室内地毯/地板跟随效果

项目资源

后续迭代方向 (Mark 2)

制造工艺

  1. Arduino POV 时钟:自制视觉暂留 LED 显示器
  2. SERENA:基于 Arduino Mega 2560 与 TFT 触摸屏的多级密码报警系统
  3. 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
  4. Arduino 项目优化供电方案:从按键开关到电池监测与数据记录
  5. Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
  6. Arduino 101 BLE + Blynk:DIY 蓝牙遥控履带坦克车
  7. 智能配对墨镜:Arduino 101 + tinyTILE BLE 实现眼神交流信号
  8. 自制便携式视觉暂留显示器:Arduino UNO 与 ATtiny85
  9. DIY Arduino 智能手表:打造属于你的 Apple Watch 风格腕表
  10. 智能地下室通风系统:Arduino 驱动的湿度自动控制
  11. Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里
  12. 优化机器人手术视觉系统照明设计