升级Pixy CMUcam5 固件

目录

[一、Pixy / CMUcam5 固件升级的作用是什么?](#一、Pixy / CMUcam5 固件升级的作用是什么?)

二、准备工作

[1. 必备物品](#1. 必备物品)

[2. 安装 PixyMon 软件](#2. 安装 PixyMon 软件)

[三、开始升级固件(最推荐的 自动升级法)](#三、开始升级固件(最推荐的 自动升级法))

[步骤 1:连接 Pixy 到电脑](#步骤 1:连接 Pixy 到电脑)

[步骤 2:打开 PixyMon](#步骤 2:打开 PixyMon)

[步骤 3:进入固件升级界面](#步骤 3:进入固件升级界面)

[步骤 4:选择固件文件(官方自动下载)](#步骤 4:选择固件文件(官方自动下载))

[步骤 5:等待写入(切记不要断电)](#步骤 5:等待写入(切记不要断电))

[步骤 6:确认版本](#步骤 6:确认版本)

四、手动升级固件(适合高级用户)

[方法 A:通过"强制 DFU 模式"升级](#方法 A:通过“强制 DFU 模式”升级)

步骤:

[方法 B:使用命令行 pixyflash(Linux 高级玩家)](#方法 B:使用命令行 pixyflash(Linux 高级玩家))

五、固件升级失败的情况及解决方法

六、实际例子(可直接照做)

[例子 1:从 2.0.15 升级到 2.0.27](#例子 1:从 2.0.15 升级到 2.0.27)

[例子 2:升级后 Pixy 不能跟踪颜色?恢复出厂设置](#例子 2:升级后 Pixy 不能跟踪颜色?恢复出厂设置)

[例子 3:升级固件 + 配置 Arduino](#例子 3:升级固件 + 配置 Arduino)

[Arduino 读取 Pixy 颜色块:](#Arduino 读取 Pixy 颜色块:)

[例子 4:升级固件后开启行跟踪(line tracking)](#例子 4:升级固件后开启行跟踪(line tracking))

[例子 5:刷固件后切换为 SPI 通信](#例子 5:刷固件后切换为 SPI 通信)

[示例 1:最基础示例(读取颜色块坐标)](#示例 1:最基础示例(读取颜色块坐标))

[示例 2:控制舵机朝向识别物体(常见:自瞄、跟踪机器人)](#示例 2:控制舵机朝向识别物体(常见:自瞄、跟踪机器人))

[示例 3:如果你使用的是 Arduino UNO + SPI(ICSP)](#示例 3:如果你使用的是 Arduino UNO + SPI(ICSP))

[示例 4:按最大块来控制小车(常用于巡线 / 追物体机器人)](#示例 4:按最大块来控制小车(常用于巡线 / 追物体机器人))

[示例 5:Pixy 查询所有识别到的块(多目标识别)](#示例 5:Pixy 查询所有识别到的块(多目标识别))

[示例 6:Pixy + 按颜色签名识别不同物体](#示例 6:Pixy + 按颜色签名识别不同物体)


这是一份最完整、最详细、从零开始的 Pixy CMUcam5 固件升级指南,包含:准备工作、两种升级方式(官方 / 手动)、常见问题、错误恢复方法,以及实际例子。


一、Pixy / CMUcam5 固件升级的作用是什么?

升级 Pixy 固件可以带来:

  • 修复识别不稳定、丢帧、掉线的问题

  • 增加新特性(例如改进颜色代码、I2C/SPI 稳定性)

  • 增强算法能力(新版本改进了跟踪准确度)

  • 提高和 Arduino / Raspberry Pi / Robot 控制器的兼容性


二、准备工作

1. 必备物品

  • Pixy CMUcam5 本体

  • Micro-USB 数据线

  • 一台电脑(Windows 或 macOS 或 Linux)

2. 安装 PixyMon 软件

PixyMon 是官方管理工具,用来:

  • 升级固件

  • 调试颜色跟踪

  • 查看实时图像

下载地址(CMU 官方):

https://docs.pixycam.com/wiki/doku.php?id=wiki:v1:pixymon_installing_pixymon


三、开始升级固件(最推荐的 自动升级法

PixyMon 自带固件升级程序,只需连接 USB ------ 最简单、最不容易失败


步骤 1:连接 Pixy 到电脑

  • 使用 micro-USB 连接 Pixy → 电脑

  • Pixy 会亮灯且 PixyMon 能识别设备


步骤 2:打开 PixyMon

  • 打开 PixyMon

  • 等待屏幕右上角显示 Connected

若无法连接,请换 USB 口或线。


步骤 3:进入固件升级界面

依次点击:

File → Flash firmware...

然后会打开固件选择窗口。


步骤 4:选择固件文件(官方自动下载)

PixyMon 会自动列出所有官方固件,例如:

  • firmware-pixy-3.0.27.hex

  • firmware-pixy-2.0.13.hex

  • firmware-pixy-1.0.xx.hex(老版本)

你只需选择最新版即可。


步骤 5:等待写入(切记不要断电)

写入时 Pixy 会闪灯并重启,只需等待 10--20 秒。

完成后 PixyMon 会显示:

Firmware upload successful


步骤 6:确认版本

点击:

Help → About

即可查看当前固件版本。


四、手动升级固件(适合高级用户)

如果 PixyMon 无法升级(常见于砖机 / bootloader 丢失),你可以用手动方法。


方法 A:通过"强制 DFU 模式"升级

Pixy 内部有 bootloader,以下操作能让它进入 DFU(Device Firmware Update)模式。

步骤:

  1. 拔掉 Pixy 电源

  2. 使用回形针短接按钮(某些版本是按住白色按钮)

  3. 插上 USB

  4. 松开按钮

  5. PixyMon 会提示检测到 DFU 模式

  6. 再按前面步骤刷固件

如果你的 Pixy 没有按钮,常见做法是:

  • 按住按钮模块

  • 插电

  • 进入软件刷写界面


方法 B:使用命令行 pixyflash(Linux 高级玩家)

Pixy 官方提供 CLI:

bash 复制代码
pixyflash firmware-pixy-3.0.27.hex /dev/ttyACM0

或 macOS:

bash 复制代码
./pixyflash firmware.hex

适合做自动部署或批量刷机。


五、固件升级失败的情况及解决方法

问题 可能原因 解决办法
PixyMon 无法识别设备 USB 供电不足 / 驱动问题 换 USB 口、换线、重装 PixyMon
固件升级途中失败 USB 接触不良 使用短线、不要动 Pixy
固件刷完后黑屏 进入 DFU 模式了 使用 "Flash firmware..." 再刷一次
完全无法开机 bootloader 受损极少见 换电脑尝试、使用 CLI 工具、发给 CMU 官方保修

六、实际例子(可直接照做)


例子 1:从 2.0.15 升级到 2.0.27

  1. 用 USB 连接 Pixy → 电脑

  2. 打开 PixyMon

  3. File → Flash Firmware

  4. 选择最新版(如 pixy_firmware_2.0.27.hex

  5. 点击 Flash

  6. Pixy 重启

  7. Help → About → 确认版本


例子 2:升级后 Pixy 不能跟踪颜色?恢复出厂设置

固件升级后参数也可能改变,可按:

Action → Restore default parameters

恢复默认设置。


例子 3:升级固件 + 配置 Arduino

升级后你可以进行常见开发,例如:

Arduino 读取 Pixy 颜色块:

cpp 复制代码
#include <Pixy.h>

Pixy pixy;

void setup(){
  Serial.begin(115200);
  pixy.init();
}

void loop(){
  uint16_t blocks = pixy.getBlocks();
  if(blocks){
    Serial.print("block x:");
    Serial.println(pixy.blocks[0].x);
  }
}

新版固件识别更稳定。


例子 4:升级固件后开启行跟踪(line tracking)

新固件增强了线检测算法:

File → Configure → Line Tracking Mode

启用后 Pixy 能检测线路并发控制信号给机器人。


例子 5:刷固件后切换为 SPI 通信

新版固件改善 SPI 时序。

在 Arduino 中:

cpp 复制代码
#include <PixySPI_SS.h>
PixySPI_SS pixy;

void setup(){
  Serial.begin(115200);
  pixy.init();
}

下面给你 最完整、可直接使用、涵盖常用功能的 Pixy(CMUcam5) + Arduino 示例代码合集 。这些例子都是针对 Pixy1(不是 Pixy2) ,并使用 Arduino Pixy 库(pixy.h)

你只需要将代码复制到 Arduino IDE 中、下载 Pixy Arduino Library(官方库),即可马上运行。

示例 1:最基础示例(读取颜色块坐标)

这是你最常用的核心模板。

cpp 复制代码
#include <Pixy.h>

Pixy pixy;

void setup()
{
  Serial.begin(115200);
  Serial.println("Starting Pixy...");
  pixy.init();
}

void loop()
{
  uint16_t blocks = pixy.getBlocks();

  if (blocks)
  {
    Serial.print("Blocks detected: ");
    Serial.println(blocks);

    // 打印第一个识别到的方块
    Serial.print("X: ");
    Serial.println(pixy.blocks[0].x);

    Serial.print("Y: ");
    Serial.println(pixy.blocks[0].y);

    Serial.print("Width: ");
    Serial.println(pixy.blocks[0].width);

    Serial.print("Height: ");
    Serial.println(pixy.blocks[0].height);
  }
}

➡ 输出示例(串口监视器):

cpp 复制代码
Blocks detected: 1
X: 147
Y: 82
Width: 22
Height: 35

示例 2:控制舵机朝向识别物体(常见:自瞄、跟踪机器人)

Pixy 能自动输出伺服控制值,你不需要写 PID!

cpp 复制代码
#include <Pixy.h>
#include <SPI.h>

Pixy pixy;

void setup()
{
  Serial.begin(115200);
  pixy.init();

  // 打开 Pixy 的伺服输出(舵机端口 0/1)
  pixy.setServos(500, 500);  
}

void loop()
{
  uint16_t blocks = pixy.getBlocks();

  if (blocks)
  {
    int32_t pan = pixy.blocks[0].x - 160;  // 图像中心 = 160
    int32_t tilt = pixy.blocks[0].y - 100; // 图像中心 = 100

    // 将偏差换算成伺服角度
    pixy.setServos(1500 + pan * 3, 1500 + tilt * 3);
  }
}

让 Pixy 自动追踪目标时,仅需:

  • 将舵机插入 Pixy 的 servo port 0 / port 1

  • 运行上面代码

Pixy 会实时自动旋转「瞄准」颜色块。


示例 3:如果你使用的是 Arduino UNO + SPI(ICSP)

Pixy 自动支持 SPI,不需要改代码;但如果你想手动使用 SPI:

cpp 复制代码
#include <PixySPI_SS.h>

PixySPI_SS pixy;

void setup()
{
  Serial.begin(9600);
  pixy.init();
}

void loop()
{
  uint16_t blocks = pixy.getBlocks();

  if (blocks)
  {
    Serial.print("Detected ");
    Serial.println(blocks);

    for (int i=0; i<blocks; i++)
    {
      Serial.print("Block ");
      Serial.println(i);
      Serial.print("  x: ");
      Serial.println(pixy.blocks[i].x);
      Serial.print("  y: ");
      Serial.println(pixy.blocks[i].y);
    }
  }
}

示例 4:按最大块来控制小车(常用于巡线 / 追物体机器人)

假设你用两个电机:

cpp 复制代码
#include <Pixy.h>

Pixy pixy;

// 电机接口定义
int leftMotor = 5;
int rightMotor = 6;

void setup()
{
  Serial.begin(115200);
  pixy.init();
  pinMode(leftMotor, OUTPUT);
  pinMode(rightMotor, OUTPUT);
}

void loop()
{
  uint16_t blocks = pixy.getBlocks();

  if (blocks)
  {
    int x = pixy.blocks[0].x;

    if (x < 140)
    {
      // 向左转
      analogWrite(leftMotor, 100);
      analogWrite(rightMotor, 200);
    }
    else if (x > 180)
    {
      // 向右转
      analogWrite(leftMotor, 200);
      analogWrite(rightMotor, 100);
    }
    else
    {
      // 前进
      analogWrite(leftMotor, 200);
      analogWrite(rightMotor, 200);
    }
  }
  else
  {
    // 没找到目标时停止
    analogWrite(leftMotor, 0);
    analogWrite(rightMotor, 0);
  }
}

示例 5:Pixy 查询所有识别到的块(多目标识别)

cpp 复制代码
#include <Pixy.h>
Pixy pixy;

void setup()
{
  Serial.begin(115200);
  pixy.init();
}

void loop()
{
  uint16_t blocks = pixy.getBlocks();

  if (blocks)
  {
    Serial.println("All blocks:");
    
    for (int i = 0; i < blocks; i++)
    {
      Serial.print("Block ");
      Serial.println(i);
      Serial.print("  SIG: ");
      Serial.println(pixy.blocks[i].signature);
      Serial.print("  X: ");
      Serial.println(pixy.blocks[i].x);
      Serial.print("  Y: ");
      Serial.println(pixy.blocks[i].y);
      Serial.print("  W: ");
      Serial.println(pixy.blocks[i].width);
      Serial.print("  H: ");
      Serial.println(pixy.blocks[i].height);
    }
  }
}

示例 6:Pixy + 按颜色签名识别不同物体

例如 signature=1 = 红色,signature=2 = 蓝色。

cpp 复制代码
#include <Pixy.h>
Pixy pixy;

void setup()
{
  Serial.begin(115200);
  pixy.init();
}

void loop()
{
  uint16_t blocks = pixy.getBlocks();

  if (blocks)
  {
    for (int i = 0; i < blocks; i++)
    {
      if (pixy.blocks[i].signature == 1)
        Serial.println("Detected RED object");

      if (pixy.blocks[i].signature == 2)
        Serial.println("Detected BLUE object");
    }
  }
}
相关推荐
Fleshy数模14 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
az44yao15 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
秦老师Q16 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
橘子1317 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy123931021617 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋17 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣5017 小时前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
人道领域18 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
千寻技术帮19 小时前
10404_基于Web的校园网络安全防御系统
网络·mysql·安全·web安全·springboot
spencer_tseng20 小时前
MySQL table backup
mysql