本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于 Arduino Nano R3 的自动转向系统—Autopilot

发布时间:2021-12-22
分享到:

基于 Arduino Nano R3 的自动转向系统—Autopilot

发布时间:2021-12-22
分享到:

本文针对于Autopilot在帆船中的应用,让我们在导航中休息一下,用 Autopilot 跟随路线!

前言:
我喜欢独自航行,因为当一个人带着他的帆船在海上时,他得到了进化到更高水平所需的一切。在恶劣天气下在生海中航行可能会非常困难,但如果他选择阳光明媚、风很大的好天气,那么享受将是最大的。

幸福意味着无限的视野,完美的运动技术,最佳的选择,也意味着人类的东西,如美酒佳肴和美味三明治!正是在这个时候,Autopilot 会派上用场:它代替您工作,同时您下午 5:00 在海上享用茶和饼干。

Autopilot 能为您做什么:
帆船没有引擎,不能沿着从港口到海滩,然后到钓鱼点的程序化路径,绕灯塔转回来,它本身不能。

整个工作由Sailor完成,我们必须在这一点上理解它:修剪帆,控制天气和风源/速度,硬化或释放绳索,注意与其他船只的交通,决定方向和转向。当水手决定休息一下,比如说 10 秒或几分钟(著名的“下午茶时间”),他打开自动驾驶仪。在几秒钟内,它的 GPS 获取船只的位置、速度和方向,并能够保持方向(路线)。转向系统是一根连接到方向舵的杆,通常由专业的水手手移动,现在由 Autopilot 控制,通过步进电机通过滑轮和绳索连接到它。

控制方向舵是一项持续微调或粗调的工作。船越小(越轻),影响它的方向因素的变化就越大:海浪、风的方向和压力、水手运动引起的船上重量的转移、海流。但是Sailor总是醒着的,即使在自动驾驶仪上,通过遥控的方式改变实际路线:上面有4个按钮,标记为+1 -1 +10 -10,用于度数的大小变化,增加或减少值。这些按钮也出现在 Autopilot 上,绿色(右)和红色(左)按钮。蓝色按钮(中间)用于激活或停用自动驾驶仪,暂停。它也是一个用于在内存中设置参数的黑色按钮。

电路:
主要处理由 MCU Arduino Uno 完成。另一个MCU,Arduino Nano ,是看门狗:我知道Uno内部确实存在一种看门狗,但我喜欢用独立的外部微控制器来做,这是我一生的梦想,我现在很高兴!Uno 必须通过引脚 3 -> A0 将其置于高/低,5/0 伏,至少每 2.5 秒一次(feedingInterval)来馈送 Nano;如果不是,则表示 Uno 正在“休眠”或“被阻塞”,Nano 会重置 Uno……它从未发生过,你能相信吗?

它是一种流行的显示器,与焊接在一起的i2c 电路转换器结合使用,最后仅使用 4 条线来显着节省数字引脚以与 Uno 通信。还有按钮和遥控器的连接方式to 由电阻分压器完成,以达到使用尽可能少的 MCU 端口的目标;我选择了 1% 的精度电阻,模拟比较值应该在我输入代码的值之间;如果因为您选择了其他类型的电阻而无法识别某些按钮,也只需对常量进行一些更改(修改“checkRfRC()”和“checkHWButtons()”中的代码)。RF 433Mhz 遥控 (RC) 电路运行良好;为了提高距离覆盖范围和成功机会,我添加了一个线圈天线,您可以用一根铜线自己制作;我在 10 米外对其进行了测试,但我认为它甚至可以在 20 米或更远的地方工作,考虑到我用来测试 Autopilot 的目标帆船只有 4.20 米长,这已经足够了。

一开始的GPS我用的还是不错的EM406A,可惜我发现它有Week-Rollover-Bug,太旧了,只好换了一款优秀且受欢迎的北天BN-220T。用它的配置软件请把它设置为每秒“吐”出2次(2Hz)只是必要的“$GNRMC”NMEA串行语句。GPS 将 (TX) 串行数据发送到 Uno 的引脚 0 (RX)。数据包含用于计算电机校正的所有导航数据:日期、时间、位置纬度和经度、真实航线、速度和卫星定位的有效性。由于 Arduino 的 IDE 编程也使用 pin 0 (RX) 端口,请记住在此操作期间暂时断开 GPS...

我的另一个梦想是使用 EEPROM 。IC 2404 是一个漂亮的 512 字节 i2c 集成电路,我用来在这个存储芯片中读/写一些步进电机运动的参数,我将在后面的“软件”段落中解释。

组件清单:

  • Arduino Uno 作为 MCU
  • Arduino Nano 作为看门狗
  • 北天BN-220T GPS
  • 步进电机,型号 23LM,54 步 = 1/4 转
  • 用于电机的控制器键 L298
  • RF433Mhz RC XD-YK04 + 4 键遥控器 + 线圈天线
  • 6 个按钮常开(2xRed、2xGreen、1xBlack 和 1xBlue)
  • 电源开关(白色)
  • 用于外部步进电机的母 + 公 6 针圆形连接器
  • 蜂鸣器
  • 显示LCD1602 2x16字符+i2c转换电路
  • 3 个 LED(红色、蓝色和黄色))
  • IC 24c04 i2c eeprom
  • IC 4051 多路复用器
  • 锂电池 2s 7.4v 2600mA
  • IC 7805稳压器+散热器
  • 热敏电阻 NTC MF52-103 10k
  • 自恢复保险丝 2A
  • 6 个 1N4148 二极管 (D1-D6)
  • 电源屏蔽上的电阻器 (R1-R4=10k, R5=100k)
  • Autopilot 屏蔽上的电阻器(R1=330,R2=1k,R3=2k,R4=5.1k,R5=1k,R6/R7/R14=330,R8-R13=10k,R15=10M)
  • 电容器 (C1=470uF 16v, C2=100n)
  • 2W 0.22 欧姆电阻 (R6)
  • 公针
  • 母长针头
  • 外壳透明且“防水”

电路上有几个传感器都通过IC 4051 多路复用器连接到 Arduino Uno 。它是一个热敏电阻,以控制稳压器散热温度,一个2W电阻和4x10k作为分压器来计算安培作为整个电路的功耗。另外,电池电压被取下控制:锂聚合物是公知的,当单个元件被排出低于3.3V是关键的; 该电路在一个封装中有两个元件 (2S) LiPo,在低电压(低于 7.0v)的情况下,蜂鸣器会通过短促的蜂鸣声通知您。不要等待太久才关机,尽快充电!发光二极管:黄色 以 1Hz 闪烁表示 WatchDog 正在工作;Autopilot 开启时蓝色亮起,暂停时熄灭;当按下遥控器按钮之一时,红色 LED 会闪烁。

所有电路工作在 5.0v 由 LiPo 2S 7.4v 2600mA/h 电池和IC 7805 稳压器提供。电流不应大于800mA,但通常在100-450mA左右。请在上面放一个散热片。热敏电阻放在上面,如果温度超过 50°C,蜂鸣器会发出哔哔声。

PCB印刷电路板和组装:
由于这个原因,我使用了单面 PCB ,我必须包括一些跳线(虚线的)来解决整个电路的布线。此处显示了组件面,但在下方您有所有文件、组件和焊接面,已镜像,可通过激光打印机在“黄色”或“蓝色”纸张上下载和打印。我用的是黄色的,但他们说蓝色的更好(但价格要高得多)。打印时记得禁用省墨设置,改用 1200 dpi 分辨率以获得深黑色效果。从魔术贴到印刷电路板的墨粉转移过程是通过使用热熨斗完成的......双面印刷,也印刷在组件面上,可以轻松识别物品的定位,甚至使项目变得“专业”。

两个 PCB 的尺寸都适合作为堆叠安装在另一个 Arduino Uno 上:首先是电源单元,然后是自动驾驶单元。

我的选择是将所有东西放在一起,PCB、MCU、RC、电机驱动器电路、电池、GPS、按钮、开关、电线、连接器等。我想有一天重复使用它们:我没有将它们焊接在一起,我用过接头和流行的杜邦电线/连接代替。那么大约有 200 个未焊接的连接,这意味着意外和不需要的故障或电路的不同行为可能会不时发生,这是正常的。建议是焊接所有东西以获得更稳定的电路!

参数设置和显示传感器值:
按下盒子侧面的黑色按钮,它进入设置模式;这也可以在主动导航期间完成,无需先输入暂停。显示屏第一页显示电池电压(V=7.83)、功耗(mA=177)和靠近耗散器的热敏电阻传感器的温度(38°C);一次又一次地按下进入下一页的黑色按钮;第 2、3、4、5 页显示了下面列出的参数,您可以通过 -1 和 +1 按钮更改这些值。第 6 页显示“正在更新...”如果您更改了某些内容,值将保存在 EEPROM 内存中。

间隔:即2000毫秒,是步进电机将“H”方向恢复到“R”路线,向右或向左移动舵杆的一次尝试和另一次尝试之间的时间;
最小值:即 2°,是让 Autopilot 干预的最小偏离航线度数;达到这个值,方向舵稳定地保持在中心位置;
Max:即40°,是步进电机一次最大的转向变化;如果计算是 50° 变化,实际上 Stepper 只会移动 40°;
Coeffic.:即1.50 x°,是转向一次变化的系数;如果计算为 40° 变化,实际上步进电机将移动 (40 x 1.50)=60°;
当安装在帆船上时,这些参数是微调 Autopilot所必需的。响应性、灵敏度和平滑度取决于滑轮的直径、滑轮的数量、步进电机上主滑轮的直径、舵的灵敏度、舵杆连接在其上的长度等。让我们安装所有东西,然后尝试在船上积累经验。当然,所有测试阶段都选择阳光明媚、微风的日子!

它是如何“实时”工作的:
您正在海上、湖泊或港口附近航行。下午茶时间到了,你的可乐和你最喜欢的三明治在口袋里等着。在这里,我们有:开关自动驾驶仪上,并让它采取卫星的GPS定位,现在应在结显示实际速度读取,时钟和航向方向即H270°(R =路线跟随,H =实际标题)以度(记180°=南,270°=西,360°或 0°=北,90°=东)。在暂停模式(显示为 STOP)时,R 和 H 值相同。现在连接舵机绳,从步进电机到舵杆,然后按蓝色按钮启动自动驾驶仪转向;在这一点上,Autopilot 持有 R=route 方向,它可以控制 H=heading 发生的情况。标题编号肯定会改变 ,根据我们已经讨论过的天气条件,缓慢或快速。Autopilot 然后尝试恢复到 R=route 方向进行修正,即 -10°、+5° 等,直到 H 值等于 R 值。您可以决定对Route进行一些更改,您可以使用单元上的红色和绿色按钮(-1 -10 +1 +10)或通过遥控器的方式修改编号。收回控制权的的转向,你只需要按下暂停蓝色按钮,断开尾舵摇杆继续通过你手中的工作绳子。做得好。

软件端:
代码很长,但我希望它足够清晰,易于理解。无论如何,我会解释它是如何做的。草图使用了大约 65% 的程序和大约 45% 的内存。即使使用String类,主要用于Serial NMEA语句操作,整个阐述流程也稳定扎实;它使用“serialEvent()”每秒两次从 GPS 接收数据,然后调用“nmeaExtractData()”,最后使用“nmea0183_checksum()”检查数据包以确保数据完整性。如果您使用其他品牌和型号的 GPS确保句子具有相同的结构,或者您必须在这里进行一些更改。例如,EM406A 使用“$GPRMC”数据包ID ,BT220 使用“$GNRMC”代替...只是一个小的名称更改

在“Setup()”期间,检查 EEPROM :如果是新的或未知的,则对其进行初始化(格式化)。内存中的参数以字节为单位读/写:0=0x29, 1=0x00, 2-3=interval, 4-5=min, 6-7=max, 8-11=coefficient (byte, byte, int, int,漂浮)。我小心地处理了 EEPROM读写操作,可能防御性太强了……多路复用器通过“readMuxSensors()”每 10 秒检查一次传感器,如果电池电量低或温度高,可能会引起警报。分辨率功耗低,步进40mA左右。硬件和遥控按钮不断检查;他们做什么取决于“IsSetup”布尔值以及显示“RefreshDisplay()”. 代码的核心是 STEERING CONTROL 部分,它调用“gomotor()”函数将步进器移出和移回;是的,它可能会将方向舵向右移动 10°,并且在间隔值之后它会移回零方向舵位置,以此类推在新一轮计算之后。如前所述,转向工作也在设置期间进行,因为它只影响几个按钮和显示行为。Whatchdog 喂食非常简单但很重要:只要尽快打开/关闭它的 Pin。

如何将其安装在帆船上:
如下图所示,我选择将 Autopilot 和 Stepper Motor 放置在船尾,两者都用螺栓等固定好;一根直径为 6mm 的绳索从主电机滑轮开始,绕着放置在两侧的另外两个滑轮。这两个滑轮应该通过两个蹦极环的方式“固定”在船上,以保持绳索的轻微张紧。此时,最后要决定如何将绳子连接到舵杆上(临时连接);它必须在您希望 Autopilot 运行时连接,易于连接和断开连接。保持自动驾驶系统远离水!

如果您对此项目有任何想法、意见或问题,请在下方留言。

原文链接丨以上内容来源网络,如涉及侵权可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论