用Arduino扩展无人飞行器+普及无人机知识,不会算法的人必看-Arduino中文社区 - Powered by Discuz! Archiver

Leonardo 发表于 2015-1-30 23:21

用Arduino扩展无人飞行器+普及无人机知识,不会算法的人必看

本帖最后由 Leonardo 于 2016-8-1 14:35 编辑

相信大多数arduino爱好者想做一个自己的无人机,但很多人都被四元数,卡尔曼滤波,PID等需要花功夫才能搞定的东西难住。。。不想去研究复杂的算法和硬件同时也能用arduino做出自己满意的无人飞行器?那么你就来对地方了!现在,我们从零开始!
1,购买航模零件()/////对航模熟悉的人可跳过此段!
      {
         机架:我采用的是ATG-700AL-X6,淘宝有卖,玻纤版本的180左右,也有炭纤版本接近400,轴距700mm,轴杆为10×10mm的铝合金材质,支持2212/2216/2814的无刷电机,稳定的kv建议值为880-1000kv(由于刚刚接触航模的人可能不清楚这些数字的意思,我在这里做一个简单解释:2212/221是无刷电机的规格,2212表示线圈外径22毫米,电机高度12毫米,Kv1000表示空载下每增加1V电压转速大约提高1000rpm,够清楚明白吧!)推荐的理由是这款机架在大尺寸6轴是信价比较高的,价格便宜又好用对于初次接触飞行器的人来说当然是首选,再来就是结构简单,扩展非常方便,还有就是我觉得这个机架还比较帅。。。



////////////////////////////////////////////////
       电机:我采用的是郎宇2216 880kv无刷电机,淘宝有卖,109元/个,小贵 ,cnc做工精细,动静平衡好,稳定,如果需要购买这款电机建议不要买太便宜的,因为郎宇电机假货多,电机非常重要,所以不要再重要部件上太省,如果感觉此款电机太贵可以选择:新西达2212 1000kv的电机,好处就是便宜,坏处是震动大,淘宝30块钱拿下,还是很不错的,新手首选,摔坏了也不心疼,自己动手焊接头,电机就不多说了,下面说说电调。
////////////////////////////////////////////////       电调:电调我的选择是    好盈   天行者系列 SkyWalker40A。电调就是电子调速器,简单说就是把直流电变成交流电,然后用PWM信号控制电机转速 ,电调都是可以用arduino舵机库使用的,非常方便,函数赋值的角度越大,电机转速越快,但是行程不是0-180,有问题?别急,下文会细说。这个电调淘宝55元/个,同样几轴就需要几个,一个电机配一个电调,至于电流大小要根据电机来看,这类电机配30A的也可以不过价格差距太小了选个40A的保守点嘛。品牌也可以选择新西达电调,便宜。。。也能用。
///////////////////////////////////////////////////      桨:桨我选择的是ATG1147,这款桨价格合理,平衡很好,配合郎宇2216 880kv是黄金组合,1147的意思是桨长度11英寸(1英寸=2.54cm),47是螺旋桨的螺距,重要的是桨的长度是不能随便选的,记住:越长的桨就要配kv值越低的电机,然而桨越大,推力也越大,也相对越省电,力效就高,880kv一般最好的组合就是11英寸合理,1000kv就是配10寸的合理,如果你是做固定翼飞机的,(固定翼就是飞机翅膀是不转的,我们座的航班就是固定翼,直升机就是旋翼)那么kv值就要很高甚至是两千多kv的才行了,这个我也没玩过就不说了,这里主要说多旋翼无人机。//////////////////////////////////////////////////////      电池:电池的重要程度甚至高于电机,很多炸机(就是飞机掉下来摔了)的就是因为电池的原因,如果是4轴选容量2200mah-4000mah比较合适,6轴的话建议5300mah以上,4轴2200mah电池一般能飞6-7分钟,但这个仅供参考,航模电池上写有20C ,30C,40c。。。。如果我没记错的话,这个是电池的放电能力的表现,比如你的电池是5000mah,30c的,那么你电池的最大放电能力就是5000×30=150000ma=150A,一般来说无人机30C的电池是标配,还有个数字是1s   2s   3s    6s 等等, 这个意思是你的锂电池电芯数量,一个电芯电压大约是3.7v,那么3s的电池3×3.7v=11.1v的电压,6s的电池就是6×3.7v=22.2v,以此类推,电池的电压要看参考电机电调来买,这里我用的电池是30C   3s的锂电,因为电机是11v的,容量的话根据自己需要的飞行时间和飞机载重来买。品牌推荐ACE(格氏电池),5300mah,3s的价格 400元左右,名牌,用的人也多,淘宝有旗舰店可放心购买,另外便宜点的狮子电池也不错,淘宝也有。///////////////////////////////////////////////////////////       飞控:这个东西是飞机的控制核心,平衡全靠它,品种繁多,有开源飞控:kk,APM,MWC,pix,等等,商业飞控:比较出名的有大疆的naza ,A2。零度智控的双子星等,飞控一般价格越高的越稳,价格最低的70元左右,贵的上万也有。在这里我用qq飞控,qq飞控是闭源飞控,有自稳功,价格不超过100,淘宝也有,最多支持六轴,不用调参,简单易用。(我也非常奇怪为什么qq飞控的背后有个foobar2000的logo。。。)   ////////////////////////////////////////////////////////      遥控器:我采用的是信价比较高的天地飞7,行货450左右,7个通道,配一个接收机,遥控距离500m,如果需要更远的遥控可以买增距器,或者叫遥控信号增益器,可以将遥控距离增加到几公里甚至更远,然后最好买模拟器(电脑上模拟开飞机的一套系统包括硬件和软件),否则很难在第一次操控好无人机,比较自信的或者玩过航模的也可以不用模拟器。遥控器品种繁多,也有较好的futaba遥控器,价格3000+,新手建议天地飞6或天地飞7,天地飞6不带显示屏,淘宝很多。
}//////////////////////////////////////////////////////////////几个基本的东西都说完了,其他小配件就不在这里多讲了,接下来我们一起造飞机{:soso_e130:}//////////////////////////////////////////////////////2,开始造飞机{   我看帖子都比较喜欢看图,所以咱们上图讲!   第一步,将准备好的硅胶电线取合适的长度穿进机架的轴杆,这里用的为16AWG的电线,其实18AWG就够了(这个东数值越小那么电线就越粗,承载能力就越强,一般干线用12AWG-14AWG粗一点的,电机的分线用18AWG-16AWG的也就合适)   每根轴杆里面有三根电线用想香蕉头焊接好,然后用热缩管包好
部好电线后就可以开始安装电机了电机安装好后开始焊接电线另一头

用香蕉头公头焊好方便连接电调,在用电池粘把电调粘在机架中心板上效果已经出来了电机的位置,电机的出线处刚好是进入轴杆内部的,和事先预留在管内的电线连接电机很漂亮
现在开始焊接电调,因6个电调的输入端都是并联,可以使用电调板焊接,最后汇总干线直接接电池!按照正负焊接好电调,这里一定要注意正负,否则后果很严重
好了,大功告成

装上QQ飞控,M1-M6电机分别按照说明书位置和6个电调连接,(注意在此之前需要做油门行程校准,此步骤这里不做详细解答,电调说明书上有确切的步骤,需要强调的是,电调油门行程校准不是在连接飞控后进行的,意思就是说直接将接收机的油门通道连接电调进行油门行程校准!)此步骤全部完成后进行飞控的中心点校准,和遥控器行程校准,在这里不做详细解答,最后试飞!,也就是说在用arduino扩展之前需要飞机能飞!到这里你应该能明白,飞控和接收机的电源是电调的控制线输出的,电调的电源来自电池,这里就有一个问题,电调输出的电压是多少?这个在电调上会写出,一般是5v,刚好也是arduino的输出电压,这套系统的全称叫做BEC,全程为battey elimination circuit 中文翻译成免电池电路 在电调里设置了一个电路模块,将11V电池输出的电压转换到5V给接收机和舵机飞控等电子设备使用(当然电机还是用11V供电的)这样就省去了那个5V电池这就是BEC(免电池电路)名称的由来。}此时此刻,飞机已经可以玩了,那么我们就开始上主角Arduino!这里我采用的是Mega2560,别急,我们先不谈扩展,我们先让arduino融入到无人机的控制系统中去,特洛伊木马也是先潜入再动手脚的嘛,这里的Arduino就是个特洛伊木马{:soso_e113:}
那么接线怎么接,我慢慢给大家说清楚,首选在接收机的任意一个空置插口引出一个vcc和GND,直接连接arduino 5v 和GND,这时你的arduino就和飞机连成了一套系统,可以共同工作了,接下来把接收机供给飞控的四根信号线从飞控上卸下,连接在arduino上的任意数字端口,我连接的是22,24,26,28,而这四根线的作用分别是AIL副翼,ELE升降,THR油门,RUD方向,这是干嘛用的呢,其实这些词都是固定翼飞机的,那么在多旋翼无人机上的意思是什么呢,很简单,AIL副翼信号就是控制飞机在水平面俯仰的,也就是说当飞机俯下去的时候,飞机会产生一个向前的分解力,就会向前飞,向后仰的时候会分解一个向后的力飞机向后飞。同样这个ELE升降其实不是真正控制无人机升降的,是和副翼一样,不过是向左倾斜和向右倾斜而已,飞机就向左向右飞。而这个THR油门,其实是控制飞机起飞和下降的,油门大飞机就直升,油门小了就将下来了。RUD方向是控制飞机水平转动的,左转右转,飞机的方向改变,但位置不会变。把这几个接口接上arduino后,我们开始用arduino来看看这个信号的奥秘,其实它就是PWM信号,不信你直接接一个舵机去试试,舵机会随着遥控的控制而转动,那么怎么读取这个PWM信号呢,我们从源代码开始讲!上源代码{:soso_e112:}#include<Servo.h>;#define AIL122   //AIL fuyi#define ELE224   //ELE shengjiang#define THR326   //THR youmen#define RUD428   //RUD fangxiang#define LED   13unsigned long INAIL;unsigned long INELE;unsigned long INTHR;unsigned long INRUD;int OUTAIL;int OUTELE;int OUTTHR;int OUTRUD;Servo AIL;Servo ELE;Servo THR;Servo RUD;
void setup(){pinMode(AIL1,0);pinMode(ELE2,0);pinMode(THR3,0);pinMode(RUD4,0);pinMode(LED,1);
AIL.attach(4);ELE.attach(5);THR.attach(6);RUD.attach(7);
Serial.begin(9600);}void loop(){ digitalWrite(LED,1);INAIL = pulseIn(AIL1, 1);INELE = pulseIn(ELE2, 1);INTHR = pulseIn(THR3, 1);INRUD = pulseIn(RUD4, 1);
OUTAIL = map(INAIL,1010,2007,47,144);OUTELE = map(INELE,1010,2007,47,144);OUTTHR = map(INTHR,1010,2007,47,144);OUTRUD = map(INRUD,1010,2007,47,144);AIL.write(OUTAIL); ELE.write(OUTELE); THR.write(OUTTHR); RUD.write(OUTRUD);
int dianya = analogRead(A0); float wendu = dianya * (5.0 / 1023.0*100);Serial.print("AIL=");Serial.print(INAIL);Serial.print(" ELE=");Serial.print(INELE);Serial.print(" THR=");Serial.print(INTHR);Serial.print(" RUD=");Serial.print(INRUD);Serial.print(" wendu=");Serial.println(wendu);      
digitalWrite(LED,0);delay(5);
}好了,代码非常简单,读取PWM信号的代码我已用红字标出,我用到了 pluseIn()函数,这个函数可以读取指定端口的电平脉冲时间,没错,那就是PWM的宽度,接下来我用串口输出了这个时间到底是多少我们一起看大屏幕。此时我的油门处于最低位,我们可以看见THR油门的值在1000左右,先不管其他的值。
紧接着我吧油门推到最高我们看看又是多少
很巧,2000左右,那么区间大约是1000-2000,接着我又试着吧其他的几个摇杆搬动,发现最小值和最大值都是在1000-2000,那么可以说明遥控的行程都是一样的,每个通道发出的PWM信号也是一样的范围,好的,那么我们现在可以把这个PWM信号原封不动的输出到飞控,这样的话arduino就完全融入了这个系统中,那么问题来了,怎么输出PWM呢。。。。呵呵,还记得我在介绍电调的时候说过吗,电调可以直接用arduino 的舵机库的舵机函数来控制,好的,那么请看代码蓝色部分。//////////////////////////////看完了蓝色部分,有人看出了,OUTTHR = map(INTHR,1010,2007,47,144); 这是个缩放函数,让1010-2007缩放为47-144,这里有人会问,为什么是1010-2007,为什么是47-144,我再来和同学们讲解,刚刚在取样的时候我们发现arduino读取的PWM宽度在1000-2000之间,但是有些值是大于2000的,那么我取了一个更大的区间,来“装”PWM的区间,所以是1000-2007,但是为什么要让舵机输出47-144度呢。这里要用点小技巧,羊毛出在羊身上,没错我们让arduino自己给自己测脉冲时间,我们可以写一个很简单的代码,还记得刚刚那个pluseIn()函数吗,我们让任意一个端口输出一个90度的舵机角度值,也就是xxxx.write(90); 然后把这个端口接在arduino其他任意一个数字端口上,用pluseIn()去测这个90度的脉宽是多少,比如90度测出来脉冲时间是1500,大了,我们要找的是1000-2000范围的那个舵机角度,我们再来一个30度,或者170度,就这样把范围越缩越小,最后,我找出了他们之间的关系,47度的舵机输出,用pluseIn()去测量刚好在1000左右,那么地、低位就找到了,同样高位在144度上 脉冲宽度时间是2000左右,那么接下来代码大家都看懂了吧?{:soso_e100:},这里的arduino就原封不动的把接收机的信号吃进去了,又吐出来给飞控,至此,arduino已经完全潜入飞机控制系统,那么接下来,没错,试飞!视频连接:http://www.meipai.com/media/232728596嘿嘿,现在想干嘛不行呢,这种想象空间就交给大家啦!可以看出我写的代码中有一个是测量电调温度的,我们看看图
没错,就是那个小小的LM35D温度传感器。好了,我的飞机目前状态也和此帖保持一样的进度,但是在这里还是要向大家提出几个实验中发现的问题,1:由于用pluseIn()函数读出接收机的脉冲时间是一个会波动的数,我们可以想一个办法滤波让数值更加稳定。2:在arduino用pluseIn()函数测试自己输出的舵机角度端口脉冲值的时候,用求斜率的办法得出斜率K1=47/1010=0.0465346534653465.K2=144/2007=0.0717488789237668。K1不等于K2,也就是说他们之间的关系是非线性的,我并不知道这是为什么,希望有知道问题所在的大神求解,未完待续。。。。感兴趣的朋友可以加入QQ群67931507一起讨论

gotzero 发表于 2015-1-30 23:48

新人想问,有了飞控以后,还要arduino做啥用呢。。

ifconfigex 发表于 2016-2-12 23:34

我最近也在DIY 4轴,直接用arduino mega 2560代替飞控,再改造下遥控器。

关于输出PWM的地方,可以有更好的办法:
OUTTHR = map(INTHR,1010,2007,47,144); 这是个缩放函数,让1010-2007缩放为47-144

查Servo.cpp源码发现,Servo::write()函数是调用的writeMicroseconds()函数执行输出,将0-180角度值映射为PWM脉冲时间,如下:
void Servo::write(int value)
{
if(value < MIN_PULSE_WIDTH)
{// treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds)
    if(value < 0) value = 0;
    if(value > 180) value = 180;
    value = map(value, 0, 180, SERVO_MIN(),SERVO_MAX());
}
this->writeMicroseconds(value);
}

所以楼主不必再将PWM脉冲时间映射回角度,而是直接调用AIL.writeMicroseconds(INAIL)即可,直接将测得脉冲时间输出,既简单还避免了精度损失。

豆豆家 发表于 2015-1-30 23:38

好厉害!!楼主牛气吖!!已被你幽默的语气森森吸引!!

syl312 发表于 2015-1-30 23:59

flexbot玩了没{:soso_e113:}

Leonardo 发表于 2015-1-31 00:31

syl312 发表于 2015-1-30 23:59
flexbot玩了没

玩了,不过代码看晕了:)

kuanshizhuo 发表于 2015-1-31 09:13

楼主,要加个摄像头就更亮了。

Leonardo 发表于 2015-1-31 20:44

kuanshizhuo 发表于 2015-1-31 09:13
楼主,要加个摄像头就更亮了。

摄像头会有的,图传也会有的,视觉识别也是会有的

lnehe 发表于 2015-1-31 20:52

加个GPS就好玩了,用arduino读取位置

Leonardo 发表于 2015-1-31 20:54

lnehe 发表于 2015-1-31 20:52
加个GPS就好玩了,用arduino读取位置

很多东西以后都可以加上去的,下一步就是加BDS

godspeed1989 发表于 2015-2-1 18:59

Leonardo魏宇科 发表于 2015-1-31 20:54
很多东西以后都可以加上去的,下一步就是加BDS

BDS的模组有卖的吗?
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 用Arduino扩展无人飞行器+普及无人机知识,不会算法的人必看