简介:基于Arduino的无人船项目完整开发记录,面向嵌入式爱好者、物联网竞赛团队及无人系统初学者。文档以实际项目为主线,覆盖硬件选型与搭建、软件控制、PID直线航行、GPS与APM自动巡航,并针对OSD固件丢失、APM接口脱焊、摄像头供电、GPS定位误差、数传掉线等疑难问题给出排查思路。船体组装部分详述舵机、马达、螺旋桨安装,以及防水防锈、连杆生锈处理等实操经验。从动力模块、视频模块到数据传输模块,均有清晰的分模块说明与排错方法,便于复现和迁移。资源为1个docx文件,压缩包大小3.02MB,内容结构完整,适合作为课程设计或科创项目的参考范本。目前已有252人学习,对希望从零完成无人船原型、理解嵌入式系统集成与调试流程的读者具有直接借鉴价值。
1. 无人船项目为什么值得拆开看
这艘叫 ZENAS 的无人船,船体是现成的,但所有软硬件和组装都是从零做的。核心不是一块普通的 Arduino 板子,而是基于 Arduino 生态的 APM 2.8 飞控,用它实现了直线航行和 GPS 自动巡航。直线航行靠 PID 控制算法,自动巡航是 GPS 与 APM 协同,这在无人船里是比较典型的低成本方案。适合正在做水面机器人、无人船,或想从 Arduino 智能小车过渡到复杂运动控制的人看。更值得看的是,这个项目把大量篇幅留给了故障排查:OSD 不显示、数传掉线、船体机械不对称,这些比烧录代码更磨人。
2. 从黑盒到水面:APM 与三大模块的硬件架构
2.1 APM 2.8 在无人船里的角色
APM 2.8 虽然老,但在水面项目里依然够用。它本质上是一个基于 AVR 的自动驾驶仪,能同时读取 GPS 罗盘、接收遥控信号、输出 PWM 给电调和舵机。船体内部的黑盒以 APM 为中心,向外分出三个模块:动力、视频、数据传输。一开始我把注意力放在 Arduino 代码上,后来才发现真正难的是把这三个模块的电源和信号理清楚。
2.2 动力模块:电调、电机、舵机的接线逻辑
动力模块由电调、电机和舵机组成。电调从电池取电,接收 APM 输出的 PWM 信号,驱动两个无刷电机;舵机同样由 APM 的舵机输出通道控制,负责转向。接线时要注意共地,电调的信号线和地线必须与 APM 输出端的地连通,否则信号容易飘。舵机安装时,如果出现螺丝孔错位,会让舵盘无法固定在正确角度,后面会专门说这种机械问题。
2.3 视频模块:OSD、摄像头、图传的供电与数据链路
视频模块包括 OSD、摄像头和图传。OSD 的作用是把 APM 的飞行数据叠加到摄像头画面上,然后通过图传发回地面。这里最常见的坑是 OSD 与 APM 之间的串口通信。APM 2.8 新版本需要在背面的 MUX_TXO/OSD 焊盘上短接,否则 OSD 拿不到飞控数据,屏幕一片干净。另一个坑是摄像头供电,很多摄像头自带 12V 转 5V 芯片,一旦为了把摄像头伸出船体而剪掉转换口,就必须在电路里补一个 12V 转 5V 的 UBEC,否则摄像头不工作。
2.4 数据传输模块:GPS、数传与遥控器的协同
数据传输模块由遥控器接收端、数传和 GPS 组成。数传负责把 APM 的实时状态发回 Mission Planner,同时也能把地面站的新航点上传给船。GPS 提供位置信息,但船在泳池边静止时定位误差比运动时大,所以校准时应该让船在水面慢速移动一段距离再观察航迹。遥控器接收端作为兜底,数传掉线后还能用手动遥控拉回来。
这里总结一下三个模块的组成和最容易出问题的地方。
| 模块 | 核心部件 | 信号/供电链路 | 常见故障 |
|---|---|---|---|
| 动力模块 | 电调、电机、舵机 | APM PWM 输出 → 电调/舵机,电池供电 | 舵机螺丝孔错位、推力不对称 |
| 视频模块 | OSD、摄像头、图传 | APM 串口 → OSD → 摄像头 → 图传,12V/5V 供电 | OSD 无信息、摄像头供电不足 |
| 数据传输模块 | GPS、数传、遥控接收端 | APM 串口 ↔ 数传 ↔ 地面站,遥控通道接收 | 数传掉线、GPS 静止漂移 |
提示:黑盒内部如果导线布置得很乱,电机会和 GPS 天线形成干扰。后面数传掉线和 GPS 偏向问题,很大概率就是线缆位置引起的磁场畸变。所以硬件架构不只是接线,还包括走线。
为什么用 APM 而不是在 Arduino 上自己写全部控制?因为 APM 固件里已经实现了 PID、航向锁定、GPS 导航等成熟逻辑,我们只需要在 Mission Planner 里调参数,不用从底层写卡尔曼滤波。这与 Arduino 智能小车完全不同,小车可以用差速转向,而船只能靠舵机偏转,是一个欠驱动系统,控制难度更大。
3. PID 直线航行:从调参逻辑到 Mission Planner 实操
3.1 为什么无人船直线航行必须用 PID
船体本身不对称,固定舵卡槽偏斜、电机连杆摩擦力不均,导致船会持续向右偏。单纯把舵摆正没用,因为水流的扰动是随机的。PID 是闭环控制,能根据航向误差实时修正舵角。和 Arduino 智能小车的巡线不同,船在水面没有物理轨道,反馈完全依赖 GPS 和罗盘,所以 PID 的三个系数必须重新调。
3.2 APM 固定翼模式下 PID 参数与船体模型的映射
APM 在固定翼固件下,船被当成一个低速水面飞行器。核心参数在 Mission Planner 的 Config / Tuning 页面里。对舵机船来说,最关键是 Steering(方向舵)相关的比例、积分、微分,以及偏航速率环。注意 APM 默认 PID 值是按飞机调出来的,船体响应比飞机慢很多,所以直接用的效果就是蛇形前进。我们当时花了整整一周,主要时间在太阳底下看船头是否周期性摆动。
自动巡航和直线航行共用这套 PID,只是在航点之间,把目标航向换成当前航段的方向角。Mission Planner 里上传航点后,APM 会顺序跟踪,遇到偏差仍然走同一个 PID 环。
3.3 通过地面站调参的步骤
调参流程比想象中简单,但要有耐心。第一次调参建议用数传连接,把船放在水面固定好。在 Mission Planner 里进入 Config / Tuning 页面,读取当前 PID 值,然后按照下面的表格小幅调整。
| 参数 | 作用 | 调大后的现象 | 调小后的现象 |
|---|---|---|---|
| NAV_LAT_P | 航向比例系数 | 转向迅速,可能振荡 | 回正慢,画大弯 |
| NAV_LAT_I | 航向积分系数 | 消除稳态偏航,但可能低频振荡 | 长时间无法对准航线 |
| NAV_LAT_D | 航向微分系数 | 抑制超调,但会放大噪声 | 船头易抖动 |
| RUDDER_P | 舵机比例系数 | 舵角响应更猛 | 舵效不足 |
每次修改 10%-20%,写入后让船跑一个直线航段,看航迹是否收敛。如果船头有高频抖动,说明 D 过大;如果低频画龙,说明 P 或 I 不合适。最后我们调出来的值,让船在泳池 50 米能保持直线,偏差在 1 米以内,对水面来说已经算不错了。
3.4 一个可移植的简化 PID 参考实现
虽然 APM 内部已经实现了 PID,但理解它才能知道参数含义。下面是一个简化的 C++ PID 类,对应 APM 的航向控制:
class PIDController { public: PIDController(float kp, float ki, float kd, float dt) : _kp(kp), _ki(ki), _kd(kd), _dt(dt) {} float update(float target, float current) { float error = target - current; // 航向误差,做角度归一化 _integral += error * _dt; // 积分项 float derivative = (error - _prevError) / _dt; // 微分项 _prevError = error; return _kp * error + _ki * _integral + _kd * derivative; } private: float _kp, _ki, _kd, _dt; float _integral = 0; float _prevError = 0; };这个类的输出可以映射到舵机 PWM:把输出值限幅在舵机行程范围内,比如 ±45 度。在 APM 里不需要自己写这个类,但通过它能看到 P 项让舵机随误差成比例偏转,I 项累计长期偏航,D 项抑制误差变化率。调参时如果发现船总是往同一个方向偏,优先加 I;如果船头来回摆动,优先减 P 或 D。
注意:这里dt必须和 APM 的循环时间一致,APM 默认是 50Hz 或 100Hz。你写外部控制脚本时,如果循环频率不稳,微分项会引入噪声。
4. OSD 黑屏与数传掉线:视频和数据链路的排错实战
4.1 OSD 无显示的排查顺序
拿到第一块 APM 时,按说明书短接了焊盘,接上显示屏却没有任何 OSD 信息。当时怀疑是固件丢了,但换一块 OSD 就能用,说明大概率不是固件。正确做法是从最外层往内层排除,而不是一上来就重刷固件。下面的表格是当时列出的可能性:
| 可能性 | 排查方法 | 结论 |
|---|---|---|
| 接线错误/接反 | 用万用表测通路,确认信号线在第几个串口 | 排除 |
| OSD 固件丢失 | 用 USB 转 TTL 读取固件,读不出来则重刷 | 排除 |
| bootloader 丢失 | 用 AVR 编程器重写 | 排除 |
| OSD 本身损坏 | 用另一块正常 OSD 替换 | 排除 |
| APM 与 OSD 通信口虚焊 | 检查 APM 背面焊盘和接口,按压看是否恢复 | 最终找到 |
最终发现是 APM 的接口脱焊,导致和 OSD 的串口完全断连。重新焊接或更换 APM 后问题消失。
4.2 APM 背面 MUX_TXO/OSD 短接与固件重刷
在排查中还有一个常见的坑:APM 2.8 的 OSD 信号需要在背面短接 MUX_TXO/OSD 端口,否则 APM 的 TX 数据不会路由到 OSD。不同批次短接点位置可能不同,拿到板子后要把铜片刮开,用焊锡短接,再用万用表确认通断。如果怀疑 OSD 固件坏了,可以用 USB 转 TTL 刷写,前提是先将 OSD 从 APM 串口断开。常见的刷写命令类似:
# 使用 avrdude 重刷 ATmega328P 的 OSD,假设串口是 /dev/ttyUSB0 avrdude -c arduino -P /dev/ttyUSB0 -b 115200 -p atmega328p \ -U flash:w:MWOSD.hex:i -U eeprom:w:MWOSD.eep:i这里的-c arduino是指定编程器协议,很多 USB 转 TTL 模块兼容这个协议。-P后面接实际串口号,Windows 下是 COM5 之类。-p atmega328p是目标芯片型号,OSD 通常用这颗芯片。刷写顺序很重要,如果 eeprom 里的默认配置和当前接线不匹配,OSD 依然没输出,所以刷完还要用 OSD 配置工具恢复默认配置。
注意:如果 bootloader 也丢了,直接刷 hex 会失败,报
not in sync之类的错误。这时需要用 AVR 编程器先烧 bootloader,再用串口刷固件,这和用 Arduino IDE 给板子恢复引导的思路一致。
4.3 摄像头 12V 转 5V 电源改造
实验室发下来的摄像头自带 12V 转 5V 芯片,但为了把摄像头伸出船体,我们剪掉了原来的转换口,结果画面不稳定。问题在于剪掉转换口后,摄像头直接吃 12V,而内部的传感器需要 5V。解决方案是在电源线上串入一个 UBEC,常见的 12V 转 5V 模块都可以。
接线时注意 UBEC 的输入接电池正负极,输出接摄像头的电源正负极,同时共地。如果摄像头和图传分别供电,两个设备的负极必须连通,否则视频信号会有干扰纹。这个经验也适用于 Arduino 项目中外接多个传感器的情况。
4.4 数传掉线问题分析
数传是无人船最痛的通讯瓶颈。数传一旦断开,地面站就完全失去小船的位置和状态,船会变成失控状态。我们实验了几种方案,包括重启 APM、用 USB 转 TTL 更新数传固件、更换整套数传,都不能根治。后来仔细分析,发现掉线往往发生在电机启动瞬间或者舵机大幅偏转的时候,怀疑是黑盒内部的导线和电机磁场干扰了数传的天线,同时也影响了旁边的 GPS 罗盘。
检查数传稳定性有几个简单手段:先看数传指示灯,LOS 亮红表示链路丢失;再用地面站看 RSSI 值;把图传天线和数传天线垂直摆放;数传天线尽量远离电调和电机。如果数传仍然掉线,可以考虑把数传的供电单独用 5V UBEC,避免和电机共用电源导致电压跌落。这个项目的最终结论是硬件优化只能缓解,要彻底解决需要换用带跳频和错误重传的专用数传,或者把地面站和船之间的无线中继做冗余。
5. 船体组装中的机械校准与防水防锈技巧
5.1 舵机固定:螺丝孔不对齐时的处理
舵机安装是机械层面的第一道坎。我们的舵机有一个螺丝孔比标准尺寸大,角度也不对,直接装上舵盘无法固定。最初用两个螺丝从两边压住,时间长了会松动。最后在顶部涂抹强力胶,同时用螺丝从两侧向中间施压,等胶干透才稳定。这里有一个细节:银色螺母要拧松一些,黑色螺丝要拧紧一些,这样舵机转动才灵活。
这个经验对 Arduino 控制舵机的项目同样适用。很多 DIY 船的舵机安装不是标准舵机座,固定方式往往决定转向精度。
5.2 马达与螺旋桨的直线度校准
马达、连杆、固定舵、螺旋桨必须在一条直线上,否则船跑起来会画圈。但船体模具本身不对称,固定舵卡槽和开口都有偏差。我们做了一个大胆的尝试:把固定舵不卡入卡槽,而是先装好连杆和螺旋桨,手动拨转两个螺旋桨感受摩擦力,等找到两侧阻力相同的位置,再用胶把固定舵黏在船底。这样两个螺旋桨转速一致,船才不会因为左右推力偏差而走歪。
5.3 连杆防锈:铅笔粉末的润滑原理
连杆生锈后摩擦力会显著增大,导致螺旋桨转速下降。我们用锉刀把锈迹擦掉,然后涂上铅笔芯粉末。铅笔粉末主要成分是石墨,具有层状结构,能在金属表面形成干性润滑膜,减小摩擦的同时还能防锈。这个办法成本几乎为零,而且效果比润滑油好,因为不会粘到泥沙。每次试水后,把连杆拔出重新抹一遍铅笔末,就能保持顺滑。
5.4 上船体拼装与防水胶选择
上船体的拼接要先用 502 胶准确定型,再用 AB 胶慢慢粘合。502 胶干得快,用来固定位置,AB 胶强度高,用来做长期密封。防水方面,同样用 AB 胶而不是防水胶。防水胶的边界很厚,容易形成空隙,而 AB 胶在接缝处能形成连续密封层,更适合水下浸泡。船底其他部分用喷漆做防水防锈,兼顾美观和保护。
| 场景 | 推荐材料 | 原因 |
|---|---|---|
| 快速定型 | 502 胶 | 几秒固化,适合塑料件临时固定 |
| 结构性粘接 | AB 胶 | 强度高,固化后可打磨,密封性好 |
| 船底防水 | AB 胶 | 边界连续密封,不易漏水 |
| 连杆防锈 | 铅笔粉末 | 石墨干性润滑,不沾水不沾泥沙 |
最后提醒一句,机械装完一定要在小范围水域先做短程试水,观察直线度和舵效,再上 PID 调参。否则 PID 调得再好,机械间隙导致的跑偏也会让调参过程变得毫无意义。
本文还有配套的精品资源,点击获取