帆船智能自动驾驶系统 —— 基于 Arduino 双 MCU 的精准自动舵控
核心组件
- Arduino UNO(主控 MCU)× 1
- Arduino Nano(看门狗 MCU)× 1
完整 BOM 详见正文“Components List”节,含 GPS、步进电机、L298 驱动、RF433 遥控、LCD1602+i2c、EEPROM、多路复用器、锂电池、稳压、温感、保险丝等。
项目背景
独自航海时,自动驾驶能让水手腾出手享受“下午茶”。帆船无引擎,无法预设航点全程自航;自动驾驶仅在水手短暂休息时保持既定航向:GPS 获取航向/速度,步进电机经滑轮绳索控制舵杆,水手可通过遥控器或面板按键微调航向(±1°/±10°)。

系统架构
双 MCU 看门狗设计
- Uno(主控): 处理 GPS 解析、舵向 PID 控制、按键/遥控交互、显示、传感器采集、EEPROM 参数存储。
- Nano(看门狗): 独立监控 Uno 心跳。Uno 每 2.5s 翻转一次 Pin3→Nano A0;若超时未翻转,Nano 拉低复位引脚强制重启 Uno。未曾触发,但保险。
外设接口设计亮点
- LCD1602 + I2C 转接板: 仅 4 线占用引脚。
- 按键/遥控电阻分压: 6 个按键+4 键遥控共用 1 个 ADC 引脚,1% 精密电阻保证识别可靠。
- RF433 遥控 + 线圈天线: 实测 10m+,满足 4.2m 小艇需求。
- GPS (Beitian BN-220T): 配置输出 2Hz
$GNRMC语句,接 Uno RX (Pin0)。烧录时须断开 GPS 避免占用串口。 - EEPROM (24C04 I2C): 存储舵控参数(周期/最小动作/最大动作/系数),掉电保持。
- 4051 多路复用器: 扩展 ADC 采集电池电压、功耗分流电压、NTC 温度。
- 供电: 2S LiPo (7.4V) → 7805 → 5V,散热片上贴 NTC 过温报警,分流电阻 (0.22Ω/2W) 监测总电流,电压<7.0V 蜂鸣器报警。
- 指示灯: 黄灯 1Hz 闪烁=看门狗存活;蓝灯=自驾开启;红灯闪烁=遥控按键触发。

PCB 设计与组装
- 单面 PCB,含少量跨接线。提供元件面/焊盘面镜像文件,激光打印热转印制作。
- 双层堆叠:底层电源板,顶层自驾板,套在 Uno 上。
- 采用排针/杜邦线而非焊死,便于复用调试;建议量产时全焊接提高可靠性。
参数设置与传感器显示
长按黑键进入设置模式(航行中可直接进入),黑键翻页:
- 传感器页:电池电压(V)、功耗(mA)、散热温度(°C)
- Interval:舵控周期 (默认 2000ms,1000-5000ms 步进 100)
- Minimum:最小偏航触发阈值 (默认 2°,0-20° 步进 1)
- Max:单次最大舵角限幅 (默认 40°,10-45° 步进 1)
- Coefficient:舵角放大系数 (默认 1.50,0.1-4.0 步进 0.1)
- 第 6 页显示“Updating...”保存至 EEPROM
参数需海试调优:滑轮直径、杠杆比、舵杆长度、舵面灵敏度均影响响应特性。
实时运行逻辑
- 开机 GPS 定位,显示速度/时间/航向 H (R=目标航向,H=实时航向)。
- 连接舵绳,按蓝键启动自驾。系统周期性计算
calcmove = R - H(规一化到 ±180°)。 - 若
|calcmove| ≥ Minimum,按move = clamp(calcmove × Coeff, ±Max)驱动步进电机打舵,Interval后回中,形成“脉冲式”舵控。 - 红/绿键或遥控 ±1/±10° 修改 R;蓝键暂停/恢复;断开舵绳即夺回手动控制权。
软件核心要点
- 占用 65% Flash、45% RAM,运行稳健。
serialEvent()接收 2Hz GPS 数据 →nmeaExtractData()解析 →nmea0183_checksum()校验。兼容$GPRMC(EM406A) 与$GNRMC(BN-220T)。- Setup 阶段检查 EEPROM,首次运行自动格式化初始化(ID 校验 0x29/0x00)。
- 10s 周期通过 4051 读取传感器,低压/过温报警。
- 按键/遥控/显示刷新/看门狗喂狗均在主循环非阻塞处理。
- 核心函数
gomotor(steps):使能驱动 → 步进电机移动步数 → 失能。
船上安装指南
自驾箱与步进电机固定于艉部。6mm 绕过两侧定滑轮(配弹力绳预紧),末端临时连接舵杆(快拆)。务必防水!

免责声明
这是一个供学习娱乐的 DIY 项目,非船级认证设备。真实航海请使用通过认证的商用自动驾驶。作者曾环球航行 16 个月,深知可靠自驾的重要性。本项目仅供技术探索与乐趣。
—— Marco Zonca
源代码
Autopilot.ino (Uno)
/* 完整代码见 GitHub,此处仅展示关键结构 */
#include <LiquidCrystal_I2C.h> #include <NewTone.h> #include <Stepper.h> #include <Wire.h>
// ... 变量定义、EEPROM 读写、NMEA 解析、舵控算法、按键/遥控处理、看门狗喂狗、显示刷新 ...
// 核心函数:gomotor(), nmeaExtractData(), readMuxSensors(), RefreshDisplay(), checkRfRC(), checkHWButtons()
WatchDog.ino (Nano)
/* 看门狗核心逻辑 */
const int feedingPin = 14, ledPin = 15, restartPin = 16, buzzerPin = 17;
const long feedingInterval = 2500;
void loop() {
if (millis() - previousFeedingMillis > feedingInterval) {
digitalWrite(restartPin, LOW); // 复位 Uno
delay(500);
digitalWrite(restartPin, HIGH);
// 等待 Uno 重启...
}
// LED 1Hz 闪烁指示存活
}
完整代码:项目仓库(原文未给出完整链接,建议搜索作者 Marco Zonca 或项目名)
3D 打印件
- 23LM 步进电机安装板 (by Andrew Barney)
- 23LM 步进电机滑轮 (56 齿)

原理图
电源板、自驾板、接线图共 5 张 PNG,见 Schematics 栏。
制造工艺