本文按“现象 → 原因 → 无破坏性检查 → 修复 → 成功判据 → 停止条件”组织。排查原则是一次只改变一个变量,先断开舵机和外部电源,再解决逻辑与通信问题。
看到电源灯亮不等于 I²C 正常;看到
/dev/i2c-0不等于它连接 40Pin;看到 UDP 发送成功不等于 K2 已经执行。
i2cdetect 在 0x40 显示 --
现象
i2cdetect -y BUS 0x40 0x4040: --最可能原因
- 扫描了错误的 I²C 适配器;
- PCA9685 VCC/GND 没有逻辑供电;
- SDA/SCL 接错、断路或接触不良;
- 地址焊桥改变了默认地址;
- 排针 I²C 控制器没有在设备树中启用;
- PCA9685 板损坏。
无破坏性检查
先断开舵机和绿色端子 V+,只保留四根逻辑线:
i2cdetect -lls -l /dev/i2c-*dmesg | grep -iE 'i2c|gpio|pinctrl'万用表检查:
VCC 对 GND:约 3.3VSDA 空闲:通常接近 3.3VSCL 空闲:通常接近 3.3V检查板上丝印,确认 K2 Pin 1/3/5/6 分别接 VCC/SDA/SCL/GND。
安全修复
- 以
i2cdetect -l确认实际总线; - 确认不是 HDMI DDC;
- 断电后重新压紧杜邦线;
- 以板上丝印核对 SDA/SCL;
- 检查地址焊桥是否全部保持默认;
- 检查
/proc/device-tree中目标 I²C 节点是否为okay。
成功判据
40: 40立即停止
VCC 高于预期、导线发热、出现焦味或怀疑 5V 接入信号线时立即断电。
地址显示 UU
现象
完整扫描中某地址显示:
50: UU最可能原因
UU 表示地址已经被内核驱动占用,不是“设备烧坏”。本次 NanoPi K2 的 0x50 UU 属于 HDMI DDC/EDID 总线,是识别错误总线的重要线索。
无破坏性检查
cat /sys/class/i2c-adapter/i2c-BUS/namedmesg | 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。
无破坏性检查
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" echodone确认系统版本、内核和 /boot 启动方式。
安全修复
本次 Ubuntu 16.04.7 / Linux 3.14.29 环境中,Pin 3/5 对应 i2c-A,目标节点是 /i2c@c1108500。先备份 DTB,再用 fdtput 把副本的 status 改为 okay,经 fdtget 和 dtc 验证后替换。
其他镜像不能直接套用该节点地址。
成功判据
重启后 i2cdetect -l 出现新的硬件适配器,并生成对应 /dev/i2c-N。
立即停止
无法离线恢复启动介质、目标节点身份不明确或 DTB 无法反编译时停止修改。
/dev/i2c-1 不存在
现象
Error: Could not open file /dev/i2c-1最可能原因
- 当前系统总线编号不是 1;
- 设备树修改没有生效;
- 启动程序加载了另一个 DTB;
- 控制器注册失败。
无破坏性检查
i2cdetect -lls -l /dev/i2c-*tr -d '\0' < /proc/device-tree/i2c@c1108500/statusdmesg | 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 的变化肉眼不明显;
- 舵机损坏或机械卡住。
无破坏性检查
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 状态回传路径不通。
无破坏性检查
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_avgpreprocess_msinference_mspostprocess_msother_msinput_age_ms_avg安全修复
一次只改变一个变量:先减小输入分辨率,再换更小模型,最后考虑硬件加速。每次保留同一测试场景和日志。
成功判据
推理 FPS 提高,输入帧年龄不持续累积,跟踪 ID 和控制行为仍稳定。
立即停止
设备温度异常、系统频繁降频或进程内存持续增长时停止耐久测试。
跟踪 ID 频繁跳变
现象
相同目标的 track_id 经常改变,或主目标在多个对象间跳转。
最可能原因
- 检测间断;
- 遮挡时间超过
lost_timeout_ms; - 新目标切换阈值太低;
- 置信度阈值或模型类别不合适;
- 目标外观相似、速度过快。
无破坏性检查
分别记录检测框是否连续、原始 track_id、目标评分和切换原因。不要只看最终被选中的 ID。
安全修复
逐项调整:
lost_timeout_ms: 500switch_improvement_ratio: 1.2switch_confirmation_frames: 5先保证检测稳定,再调整跟踪和选择滞回。
成功判据
短暂遮挡不立即切换,明显更优目标经过确认后才切换。
立即停止
ID 跳变通常不是电气危险,但云台因目标切换快速摆动时应切回 simulated 后端。
通用排查顺序
- 关闭完整视觉服务;
- 关闭外部舵机电源;
- 只验证 K2 系统和设备树;
- 只验证 PCA9685 I²C
0x40; - 验证项目后端初始化;
- 只接 CH0 小范围测试;
- 只接 CH1 小范围测试;
- 使用 simulated 后端验证 UDP 和状态机;
- 写入实测安全脉宽;
- 最后启用双机完整跟踪。
跳过中间层会让网络、软件、电气和机械问题互相掩盖。
参考资料
- 项目仓库:https://github.com/zh19990906/yolo-gimbal-tracker
- FriendlyELEC NanoPi K2:https://wiki.friendlyelec.com/wiki/index.php/NanoPi_K2
- NXP PCA9685 数据手册:https://www.nxp.com/docs/en/data-sheet/PCA9685.pdf
- Linux I²C 用户空间接口:https://docs.kernel.org/i2c/dev-interface.html
- Debian
i2cdetect手册:https://manpages.debian.org/i2c-tools/i2cdetect.8.en.html - Ultralytics Track 模式:https://docs.ultralytics.com/modes/track/