目录
[一、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)模式。
步骤:
-
拔掉 Pixy 电源
-
使用回形针短接按钮(某些版本是按住白色按钮)
-
插上 USB
-
松开按钮
-
PixyMon 会提示检测到 DFU 模式
-
再按前面步骤刷固件
如果你的 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
-
用 USB 连接 Pixy → 电脑
-
打开 PixyMon
-
File → Flash Firmware
-
选择最新版(如
pixy_firmware_2.0.27.hex) -
点击 Flash
-
Pixy 重启
-
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");
}
}
}