3493
17 分钟
YOLO 云台故障排查手册:I²C、PCA9685、舵机、网络与视觉性能

本文按“现象 → 原因 → 无破坏性检查 → 修复 → 成功判据 → 停止条件”组织。排查原则是一次只改变一个变量,先断开舵机和外部电源,再解决逻辑与通信问题。

看到电源灯亮不等于 I²C 正常;看到 /dev/i2c-0 不等于它连接 40Pin;看到 UDP 发送成功不等于 K2 已经执行。

i2cdetect 在 0x40 显示 --#

现象#

Terminal window
i2cdetect -y BUS 0x40 0x40
40: --

最可能原因#

  • 扫描了错误的 I²C 适配器;
  • PCA9685 VCC/GND 没有逻辑供电;
  • SDA/SCL 接错、断路或接触不良;
  • 地址焊桥改变了默认地址;
  • 排针 I²C 控制器没有在设备树中启用;
  • PCA9685 板损坏。

无破坏性检查#

先断开舵机和绿色端子 V+,只保留四根逻辑线:

Terminal window
i2cdetect -l
ls -l /dev/i2c-*
dmesg | grep -iE 'i2c|gpio|pinctrl'

万用表检查:

VCC 对 GND:约 3.3V
SDA 空闲:通常接近 3.3V
SCL 空闲:通常接近 3.3V

检查板上丝印,确认 K2 Pin 1/3/5/6 分别接 VCC/SDA/SCL/GND。

安全修复#

  1. i2cdetect -l 确认实际总线;
  2. 确认不是 HDMI DDC;
  3. 断电后重新压紧杜邦线;
  4. 以板上丝印核对 SDA/SCL;
  5. 检查地址焊桥是否全部保持默认;
  6. 检查 /proc/device-tree 中目标 I²C 节点是否为 okay

成功判据#

40: 40

立即停止#

VCC 高于预期、导线发热、出现焦味或怀疑 5V 接入信号线时立即断电。

地址显示 UU#

现象#

完整扫描中某地址显示:

50: UU

最可能原因#

UU 表示地址已经被内核驱动占用,不是“设备烧坏”。本次 NanoPi K2 的 0x50 UU 属于 HDMI DDC/EDID 总线,是识别错误总线的重要线索。

无破坏性检查#

Terminal window
cat /sys/class/i2c-adapter/i2c-BUS/name
dmesg | grep -iE 'i2c|ddc|edid|hdmi'

查看 /sys/bus/i2c/devices/ 中对应设备和驱动绑定。

安全修复#

不要使用用户空间程序强行与已绑定驱动争用地址。先确认该适配器服务的硬件,再选择排针对应的新总线。

成功判据#

PCA9685 所在总线的 0x40 显示 40;HDMI 总线保留 0x50 UU 并不影响云台。

立即停止#

不要为了消除 UU 随意卸载显示驱动或删除设备树节点。

只有 i2c_gpio.32,没有排针总线#

现象#

i2c-0 i2c_gpio.32

没有其他 /dev/i2c-*

最可能原因#

旧版厂商镜像只注册了 HDMI 软件 I²C,40Pin 的硬件 I²C 节点仍为 disabled

无破坏性检查#

Terminal window
find /proc/device-tree -type d | grep -Ei 'i2c|iic'
for d in /proc/device-tree/i2c@*; do
[ -d "$d" ] || continue
printf '%s: ' "$d"
[ -f "$d/status" ] && tr -d '\0' < "$d/status"
echo
done

确认系统版本、内核和 /boot 启动方式。

安全修复#

本次 Ubuntu 16.04.7 / Linux 3.14.29 环境中,Pin 3/5 对应 i2c-A,目标节点是 /i2c@c1108500。先备份 DTB,再用 fdtput 把副本的 status 改为 okay,经 fdtgetdtc 验证后替换。

其他镜像不能直接套用该节点地址。

成功判据#

重启后 i2cdetect -l 出现新的硬件适配器,并生成对应 /dev/i2c-N

立即停止#

无法离线恢复启动介质、目标节点身份不明确或 DTB 无法反编译时停止修改。

/dev/i2c-1 不存在#

现象#

Error: Could not open file /dev/i2c-1

最可能原因#

  • 当前系统总线编号不是 1;
  • 设备树修改没有生效;
  • 启动程序加载了另一个 DTB;
  • 控制器注册失败。

无破坏性检查#

Terminal window
i2cdetect -l
ls -l /dev/i2c-*
tr -d '\0' < /proc/device-tree/i2c@c1108500/status
dmesg | grep -iE 'i2c|pinctrl|clock|reset'

安全修复#

项目配置中的 i2c_bus 改为当前机器实际编号。若节点仍是 disabled,检查启动 DTB;若是 okay 但没有适配器,检查驱动、pinctrl、时钟和复位错误。

成功判据#

i2cdetect -l/dev/i2c-* 同时出现目标适配器。

立即停止#

不要通过手工创建 /dev/i2c-1 文件解决;设备节点必须由内核驱动注册。

PCA9685 指示灯亮但没有应答#

现象#

板上红灯亮,0x40 仍为 --

最可能原因#

  • 灯连接在 V+ 而不是 VCC;
  • VCC 有电但 SDA/SCL 不通;
  • GND 未共地;
  • 扫描错误总线;
  • 地址或芯片故障。

无破坏性检查#

测量 VCC 对控制排针 GND,而不是只看指示灯。检查 SDA/SCL 空闲电平和 K2 端物理 Pin 3/5。

安全修复#

保持舵机和外部电源断开,逐根按丝印重接逻辑线。换一组已知良好的杜邦线。确认正确总线后只扫 0x40

成功判据#

逻辑供电约 3.3V,SDA/SCL 空闲为高,受限扫描显示 40

立即停止#

发现 VCC 被接到 5–6V、芯片发热或有异味时立即断电。

SDA 或 SCL 空闲电平异常#

现象#

总线空闲时 SDA/SCL 长期接近 0V,或电平明显高于 K2 3.3V。

最可能原因#

  • 信号线短路到 GND;
  • 外设持续拉低;
  • VCC/V+ 混接使上拉电压错误;
  • 杜邦线插错;
  • PCA9685 或 K2 引脚损坏。

无破坏性检查#

断开 PCA9685 后测 K2 引脚,再只接 VCC/GND,最后逐根接 SDA/SCL,定位在哪一步电平异常。

安全修复#

全程断电插拔。更换线材,检查焊锡、金属碎屑和相邻针脚短路。确认 PCA9685 VCC 只接 3.3V。

成功判据#

空闲电平接近 3.3V,通信时示波器或逻辑分析仪能看到开漏波形。

立即停止#

信号线上出现 5V 或更高电压时立即断电,避免损坏 K2。

VCC 与 V+ 混淆#

现象#

  • I²C 不工作但舵机供电灯亮;
  • 接外部电源后 K2 异常;
  • PCA9685 芯片或 K2 发热。

最可能原因#

  • 外部 5–6V 接到了 VCC;
  • K2 3.3V 接到了 V+;
  • 控制排针 V+ 被误当作逻辑电源;
  • 绿色端子极性反接。

无破坏性检查#

断开所有电源,按板上丝印追线:

K2 3.3V -> VCC
外部 5–6V -> 绿色端子 V+
所有负极 -> GND 共地

安全修复#

重新接线前用万用表确认电源极性。外部电源先限流或使用带保护的电源。

成功判据#

只接逻辑电源时能检测 0x40;接外部电源后 K2 稳定,绿色端子电压符合舵机规格。

立即停止#

任何发热、焦味、冒烟或异常高电流都应立即断电,不要继续软件测试。

舵机完全不动#

现象#

项目后端初始化成功,舵机没有动作。

最可能原因#

  • 外部 V+ 未供电;
  • 三线插头方向错误;
  • 脚本通道与实际插槽不一致;
  • OE 被拉高禁用输出;
  • 1475/1525 的变化肉眼不明显;
  • 舵机损坏或机械卡住。

无破坏性检查#

Terminal window
i2cdetect -y BUS 0x40 0x40

测绿色端子 V+,确认插头信号/V+/GND。只接 CH0,一个舵机,从 1500 到 1475/1525。

安全修复#

确认供电后逐步扩大到 1450/1550,不要直接全范围。换一个已知正常的舵机或通道进行交叉测试。

成功判据#

舵机在中心附近做可重复小动作,K2 不重启,电源电压稳定。

立即停止#

舵机持续嗡鸣、发热或无法转动时立即断电。

舵机反向#

现象#

目标在右侧,Pan 却向相反方向运动;或 Tilt 上下相反。

最可能原因#

舵机安装方向与逻辑正方向相反,或 Pan/Tilt 通道定义互换。

无破坏性检查#

用单轴小范围脚本确认 CH0/CH1 分别控制哪个轴,以及脉宽增大时实际方向。

安全修复#

修改对应轴:

invert: true

或在断电后交换 CH0/CH1 插头与配置。一次只做一种修改。

成功判据#

目标误差方向与云台纠偏方向一致。

立即停止#

不要通过反接红黑电源线“改变方向”。

舵机抖动或持续嗡鸣#

现象#

中心附近高频微动,或到某位置持续嗡鸣。

最可能原因#

  • dead_zone 太小;
  • 检测框噪声;
  • smoothing_alpha、增益或 max_step_us 不合适;
  • 机械结构在限位或负载过大;
  • 电源压降或地线不稳;
  • PWM 频率错误。

无破坏性检查#

先停止视觉端,用固定 1500 微秒观察。若固定脉宽仍嗡鸣,优先排查机械、供电和中心值;若只在跟踪时抖动,再看误差日志和控制参数。

安全修复#

  • 扩大死区;
  • 降低增益;
  • 逐步调整平滑;
  • 重新标定中心和安全范围;
  • 改善供电和共地;
  • 确认 frequency_hz: 50

成功判据#

固定中心时安静稳定,跟踪时动作连续且不在中心附近来回切换。

立即停止#

嗡鸣伴随发热、堵转或大电流时立即断电。

舵机撞限位#

现象#

启动或跟踪时机械结构猛烈撞击。

最可能原因#

  • 中心值不适合当前安装角;
  • 示例 1000~2000 微秒范围远大于实际机械范围;
  • invert 或轴映射错误;
  • 完整服务在标定前启动。

无破坏性检查#

断电后手动检查机械可动范围,不强扭舵机。拆下连杆或减小负载后,从 1500 附近小步测试。

安全修复#

逐轴测量已验证最小、中心和最大脉宽,并写入本地配置。保留额外安全余量。

成功判据#

所有自动输出均远离机械硬限位,回中过程不碰撞。

立即停止#

一旦碰撞、卡住或发出齿轮异响,立即断电。

接入舵机后 K2 重启或网络断开#

现象#

舵机动作瞬间 K2 重启、SSH 断开或 USB/网络异常。

最可能原因#

  • 舵机从 K2 供电;
  • 外部电源电流不足;
  • 地线或端子压降过大;
  • 瞬时短路;
  • 舵机堵转电流过大;
  • 电源与 K2 之间存在错误回灌。

无破坏性检查#

只接一个舵机,监测外部 V+ 电压。检查 K2 系统日志和重启原因,但不要在堵转时继续采集日志。

安全修复#

使用独立、足额、带保护的 5–6V 电源,缩短并加粗舵机供电线,确认共地和极性。分别测试两个舵机的空载和负载行为。

成功判据#

单轴和双轴小范围动作时 K2 不重启,网络和 I²C 稳定,电压无明显跌落。

立即停止#

线缆、端子或电源发热时立即断电。

Pan/Tilt 通道互换#

现象#

水平误差驱动俯仰轴,垂直误差驱动水平轴。

最可能原因#

CH0/CH1 插头与配置不一致。

无破坏性检查#

使用固定脉宽脚本分别写通道 0 和 1,观察实际轴。

安全修复#

断电后交换插头,或修改:

pan: {channel: 0}
tilt: {channel: 1}

成功判据#

CH0/Pan 纠正 error_x,CH1/Tilt 纠正 error_y

立即停止#

通道互换本身通常不会损坏硬件,但错误方向导致撞限位时必须立即断电。

UDP 有发送日志但云台不跟踪#

现象#

视觉端显示 UDP 发送成功,K2 不进入 tracking。

最可能原因#

  • allowed_n100_ip 不匹配视觉主机;
  • 端口或防火墙错误;
  • 消息被序号、实例、时间戳或字段校验拒绝;
  • K2 使用 simulated 后端;
  • target_visible 为假;
  • K2 已进入 fault;
  • K2 状态回传路径不通。

无破坏性检查#

Terminal window
k2-gimbal --config configs/k2.local.yaml --check-config

查看两端日志、K2 心跳、模式、最近序号和 fault。确认系统时钟大致同步。

安全修复#

先保持 simulated 后端,修复地址、端口和防火墙。确认 K2 能收到合法控制并回传状态后,再切真实后端。

成功判据#

K2 心跳在线,目标可见时模式为 tracking,目标丢失时按配置进入 holding/return-center。

立即停止#

不要为了“让包通过”关闭协议校验或允许任意来源地址。

视觉端帧率低#

现象#

摄像头约 30 FPS,但 YOLO/ByteTrack 只有较低 FPS。

最可能原因#

  • 模型或输入分辨率超过 CPU 能力;
  • inference_ms 是主要瓶颈;
  • 输入帧排队导致 input_age_ms_avg 高;
  • 后处理候选过多;
  • ByteTrack 或 Python 其他开销较大;
  • 浏览器流与推理速率被混淆。

无破坏性检查#

查看 5 秒聚合的 vision perf

track_call_ms_avg
preprocess_ms
inference_ms
postprocess_ms
other_ms
input_age_ms_avg

安全修复#

一次只改变一个变量:先减小输入分辨率,再换更小模型,最后考虑硬件加速。每次保留同一测试场景和日志。

成功判据#

推理 FPS 提高,输入帧年龄不持续累积,跟踪 ID 和控制行为仍稳定。

立即停止#

设备温度异常、系统频繁降频或进程内存持续增长时停止耐久测试。

跟踪 ID 频繁跳变#

现象#

相同目标的 track_id 经常改变,或主目标在多个对象间跳转。

最可能原因#

  • 检测间断;
  • 遮挡时间超过 lost_timeout_ms
  • 新目标切换阈值太低;
  • 置信度阈值或模型类别不合适;
  • 目标外观相似、速度过快。

无破坏性检查#

分别记录检测框是否连续、原始 track_id、目标评分和切换原因。不要只看最终被选中的 ID。

安全修复#

逐项调整:

lost_timeout_ms: 500
switch_improvement_ratio: 1.2
switch_confirmation_frames: 5

先保证检测稳定,再调整跟踪和选择滞回。

成功判据#

短暂遮挡不立即切换,明显更优目标经过确认后才切换。

立即停止#

ID 跳变通常不是电气危险,但云台因目标切换快速摆动时应切回 simulated 后端。

通用排查顺序#

  1. 关闭完整视觉服务;
  2. 关闭外部舵机电源;
  3. 只验证 K2 系统和设备树;
  4. 只验证 PCA9685 I²C 0x40
  5. 验证项目后端初始化;
  6. 只接 CH0 小范围测试;
  7. 只接 CH1 小范围测试;
  8. 使用 simulated 后端验证 UDP 和状态机;
  9. 写入实测安全脉宽;
  10. 最后启用双机完整跟踪。

跳过中间层会让网络、软件、电气和机械问题互相掩盖。

参考资料#

YOLO 云台故障排查手册:I²C、PCA9685、舵机、网络与视觉性能
https://zh19990906.github.io/fuwari/posts/yolo-gimbal-troubleshooting/
作者
Henson
发布于
2026-08-05
许可协议
CC BY-NC-SA 4.0