本帖最后由 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块钱拿下,还是很不错的,新手首选,摔坏了也不心疼,自己动手焊接头,电机就不多说了,下面说说电调。 //////////////////////////////////////////////// 电调:电调我的选择是 好盈 天行者系列 SkyWalker 40A。电调就是电子调速器,简单说就是把直流电变成交流电,然后用PWM信号控制电机转速 ,电调都是可以用arduino舵机库使用的,非常方便,函数赋值的角度越大,电机转速越快,但是行程不是0-180,有问题?别急,下文会细说。这个电调淘宝55元/个,同样几轴就需要几个,一个电机配一个电调,至于电流大小要根据电机来看,这类电机配30A的也可以不过价格差距太小了选个40A的保守点嘛。品牌也可以选择新西达电调,便宜。。。也能用。 /////////////////////////////////////////////////// 桨:桨我选择的是ATG 1147,这款桨价格合理,平衡很好,配合郎宇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 AIL1 22 //AIL fuyi #define ELE2 24 //ELE shengjiang #define THR3 26 //THR youmen #define RUD4 28 //RUD fangxiang #define LED 13 unsigned 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一起讨论
|