电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
用Arduino 2560做个飞控——MPNG-Board
分 享
扫描二维码分享
用Arduino 2560做个飞控——MPNG-Board
arduino
飞控
DIY
xukejing
关注
发布时间: 2019-07-22
丨
阅读: 5700
# 1 开发背景 大家好,本人最近设计并打样了几块PCB,名字叫MPNG-Board,它是一种飞控板硬件。之所以名字叫MPNG-Board,是因为本项目又是基于MegaPirateNG(简称MPNG,原作者SirAlex)做的。MPNG也是个飞控项目,属于飞控软件项目。相对的,我这个就是硬件项目了。 SirAlex写MPNG的时候,姿态解算、自稳和导航算法都参考了ArduPilotMega(简称APM,是另一个开源飞控项目了)。APM的软件代码是为APM公版飞控板的硬件量身定制的,由于硬件方案固定,代码的驱动部分就写得不太灵活。相对来说,MegaPirateNG的驱动接口就写得比较好了。比如,电子爱好者们都希望飞控可以更方便地接入廉价的MPU6050传感器;于是,善良的SirAlex听从大家的呼唤,在MPNG的代码仓库里加入了AP_InertialSensor_MPU6000_I2C驱动文件。由于加入了丰富的驱动库,使MPNG可以支持各种第三方廉价传感器方案的飞控板硬件,比如CRIUS AIOP、HobbyKing MultiWii Pro、MULTIWII_PRO_EZ3等。 我是站在巨人的肩膀上做出了MPNG-Board。非常感谢SieAlex的无私开源,MPNG的代码非常自由,引脚和端口的配置都可以自由编辑和查看,并且配置接口也做得比较灵活。所以有很多玩家利用公版的Arduino板子,插上面包板和一堆杜邦线,做出了自己的飞控主板。本人也是这些玩家中的一员,过去也做过很多这样的板子。但是用面板板和杜邦线连接并是不太靠谱,飞的时候总有些提心吊胆的。所以,我发起了一个叫MPNG-Board项目,目的是为公版Arduino 2560开发板量身定制一块飞控底板PCB,并在MPNG开源代码的基础上制作该板子的固件。 本人的MPNG-Board项目地址:[https://github.com/xukejing/MPNG-Board ](https://github.com/xukejing/MPNG-Board "https://github.com/xukejing/MPNG-Board ") PCB打样文件和飞控固件都已开源到该项目仓库,欢迎大家下载使用。代码仓库页面的截图如下所示。 ![GPL开源协议](https://cf02.ickimg.com/bbsimages/201907/7bc6eaec54bfa22065abe8c18e1498ed.jpg "GPL开源协议") # 2项目介绍 下图是该飞控板的硬件,由一块公版Arduino 2560(蓝色PCB)和一块飞控底板(绿色PCB)构成: ![硬件展示](https://cf02.ickimg.com/bbsimages/201907/fa731709005f4d068c1b208a7740ed8a.jpg "硬件展示") 飞控板的原理图如下: ![原理图](https://cf02.ickimg.com/bbsimages/201907/077f3fd7d0437db67d1297ee81aa3283.jpg "原理图") 对于嵌入式系统来说,软件与原理图是紧密联系的。一旦确定了硬件原理图,那么驱动代码就必须按原理图来写;或者反过来,事先已经写好了代码,或者已经在代码里规划好了端口框架,那么硬件线路就必须按代码里给的来画了。我其实是先写好了软件代码,后画的硬件原理图。本项目的飞控软件局部参考了CRIUS AIOP的硬件,并参考了APM 2.8板子的硬件布局,所以代码里要修改的地方还是挺多的;但是大家完全没有必要死抠这些细节,因为我已经在github里把修改并编译好的hex文件给提供了,拿去直接烧写到Arduino 2560板子上就可以了。人生苦短,我愿意做大家的垫脚石,大家就完全没有必要重复造车轮了。 如果您实在是手痒,想要捣鼓一下软件代码,可以参考一下我放在该项目hex目录下的readme文件,里面给出了引脚细节。看看就好了,没有必要修改(也不能改,改了就错了)。 ![readme文件](https://cf02.ickimg.com/bbsimages/201907/af8d0f9c93db778c13d02f1d458eabe2.jpg "readme文件") PCB的设计图如下所示。其中左上的4Pin接口是连接数传模块的串口;左方的10Pin接口与遥控器接收机相连(8个PWM通道,并能给接收机提供5V电源);左下的两个4Pin接口分别是电源模块输入(支持电压和电流检测),和I2C(接10DOF传感器模块);下方3Pin接口是空速传感器接口;右下的4Pin接口连接GPS模块;最右边的是输出接口(10个PWM输出和一个相机触发接口);板子上有一个2Pin接口是跳线接口,可以设置是否把舵机供电的PWM-5V与主板5V连接在一起。一般是断开,防止舵机的电机对主板造成干扰。 ![PCB设计文件](https://cf02.ickimg.com/bbsimages/201907/480bdd7023300c134f4ee4bfefa4567e.jpg "PCB设计文件") PCB的Gerber文件已经共享在github上了。板子的丝印上也显示了它的github项目地址。我在设计PCB的时候设计了很多版本,为了让GND铺铜的电压一致,V1.2版本在铺铜上打了大量过孔 # 3 飞控板测试 PCB的Gerber文件打样回来的实物如下图所示。 ![打样回来了](https://cf02.ickimg.com/bbsimages/201907/5511081eaefdb596705941bfdaa1f976.jpg "打样回来了") 我们把LED、电阻和排针等焊上。右侧的3排针可以选择弯针或直针,我这里选了弯针,并安装在下方。 ![焊接并插到arduino上](https://cf02.ickimg.com/bbsimages/201907/6b914ad5173468729f3b1a3080825627.jpg "焊接并插到arduino上") 接上外部模块,线路连接示意图如下,接上了GPS、空速计和10DOF传感器,没有接数传、遥控接收机,和舵机、电调。 ![接外部模块](https://cf02.ickimg.com/bbsimages/201907/2ec83c93841c4fe755cb43bf98a54fa6.jpg "接外部模块") 接上USB端口(调试时候从USB端口上电,实际飞行时候是从PWR-IN端口),给板子上电,程序初始化后,LED灯开始规律闪烁(Arduino板子已经烧写好了飞控软件)。其中,板子上的3个电阻分别是3个LED指示灯的限流电阻,建议选择1K欧姆以上的,甚至4.7K欧姆的。LED在这里只是起到指示作用,并不是为了照明。我用了1K欧姆的限流,电流还是大了一点,调试时候已经晃瞎眼睛了。 ![LED非常晃眼](https://cf02.ickimg.com/bbsimages/201907/c247756d08095487e7afce5989086a54.gif "LED非常晃眼") 飞控软件使用MAVlink协议与地面站的上位机通讯,地面站可以选择支持MAVlink的QGroundControl或MissionPlanner。这两个都是开源软件,可以分别去PX4和APM官网免费下载。下图是QGroundControl连接了飞控,可以看到飞控姿态解算正常,数据连接正常。 ![QGC地面站](https://cf02.ickimg.com/bbsimages/201907/71e99713858dc11ac6715a496bfb94e9.jpg "QGC地面站") 因为QGroundControl是为PX4的飞控软件设计的,当它给我们的MPNG设置航点时,会提示延迟高,这是协议接口兼容性的问题。 ![航点设置失败](https://cf02.ickimg.com/bbsimages/201907/df576b92ede2bdedc8e1910861ac6315.jpg "航点设置失败") 我们换一个地面站,MissionPlanner,它本身就是为APM飞控软件设计的。我们的飞控算法与APM一致,所以可以很好地适配。 ![MP地面站](https://cf02.ickimg.com/bbsimages/201907/cdf949fbdb41a195da7c73e1e6e36700.jpg "MP地面站") 除了姿态角,飞控也把传感器数据实时地发送给地面站,晃动传感器板子可以发现姿态角和xyz加速度以及xyz角速度的变化 ![传感器数据](https://cf02.ickimg.com/bbsimages/201907/67cea1c518596066ed2edeaf05f17d61.jpg "传感器数据") 航点设置和加载也都正常。下图中,我们只是以程序测试的目的,纸上谈兵地设置一下航点,并不是真的要飞,因为我们学校操场上面人太多了,真的很不安全。 ![航点设置](https://cf02.ickimg.com/bbsimages/201907/09de0613e2a9e179b6f03d96f0709beb.jpg "航点设置") 喜闻乐见的PID参数。我们不飞,只是象征性地调一下。 ![PID参数](https://cf02.ickimg.com/bbsimages/201907/c848ac9f976069f88917cefd07fd5958.jpg "PID参数") 别怕,我们真的不飞!!! 钱学森说,手上没有剑,有剑不用,不是一回事!是的,我们要有剑,因为这代表着实力;但我们不一定会亮剑,因为我们热爱和平。 APM的相机云台的增稳算法是开环控制的,根据飞机的姿态角给云台舵机输出相应的角度,但是云台具体的角度并不返回给控制算法。我个人认为,这个云台控制方案用来控制相机还不太完美,没有那些闭环控制的无刷云台稳定,但是它非常适合用来控制GPS天线的方向。当飞机姿态发生倾斜时,如果天线能自动旋转对准正上方,可以提高信号接收质量。云台可以自定义输出通道,比如下图设置了通道5和6(分别是D44和D45引脚作为输出)。当没有设置输入通道时,默认控制舵机脉宽在1100~1900之间变化,把云台控制到俯仰角=0、滚转角=0的位置上。 ![云台增稳](https://cf02.ickimg.com/bbsimages/201907/8ef04c8aefa20f3370f3fd3f010876ec.jpg "云台增稳") 当飞控有轻微的倾斜时,可以看到5和6通道的输出PWM脉宽值不在中位点1500微秒。 ![云台增稳输出](https://cf02.ickimg.com/bbsimages/201907/ed8ef77821678126c8611c38184c35a0.jpg "云台增稳输出") 上图中,其他通道的PWM输出占空比都是900us,这是因为当没有遥控器输入,代码里的解算默认值就是900。这样的输出其实是故障的。比如,通道1是副翼舵机输出信号,被打到了行程极限(占空比900us,相当于左压杆到底了);通道2是升降舵,现在这个状态是拉杆到底了。 怎么让其他通道的输出正常呢?方法很简单,让飞控知道遥控器信号丢失,让飞控完全接管各通道的输出。我们在故障保护里,把油门检测加上,油门通道(3通道)的输入占空比低于950us,就触发失控保护。如下图,刚设置上,遥控信号失控保护就触发了,我们可以看到通道1(副翼)和2(升降舵)都输出了一个接近1500us的信号。通道3是油门,飞机没有起飞时,失控保护状态下,飞控会把油关掉(1100us)。 ![启用油门保护](https://cf02.ickimg.com/bbsimages/201907/5ab3d2c9a88870946176430557633684.jpg "启用油门保护") 失控保护模式下,飞控完全接管飞机的自稳,它会自动控制副翼和升降舵的舵量让飞机保持水平。在起飞或落地状态下,舵面是依然是受飞控控制的。下图中,当飞控稍微发生倾斜,通道1(副翼)和2(升降舵)都有了相应的输出变化。 ![自稳输出](https://cf02.ickimg.com/bbsimages/201907/5e0bbd5292ae8b1a3d75ddc207a6b324.jpg "自稳输出") # 4 小结 既然已经测试了PCB打样文件和hex程序文件没有问题,那么大家都可以放心下载使用啦。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
2
)
xukejing
擅长:其他应用
关注
评论
(1)
登录后可评论,请
登录
或
注册
温暖的大锅
9
天前...
你这个飞控是不是体积有点大啊。:-)
1
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交