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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 321935|回复: 147

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

  [复制链接]
发表于 2015-1-30 23:21 | 显示全部楼层 |阅读模式
本帖最后由 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轴是信价比较高的,价格便宜又好用对于初次接触飞行器的人来说当然是首选,再来就是结构简单,扩展非常方便,还有就是我觉得这个机架还比较帅。。。

QQ截图20150130142950.png

////////////////////////////////////////////////
       电机:我采用的是郎宇2216 880kv无刷电机,淘宝有卖,109元/个,小贵 ,cnc做工精细,动静平衡好,稳定,如果需要购买这款电机建议不要买太便宜的,因为郎宇电机假货多,电机非常重要,所以不要再重要部件上太省,如果感觉此款电机太贵可以选择:新西达2212 1000kv的电机,好处就是便宜,坏处是震动大,淘宝30块钱拿下,还是很不错的,新手首选,摔坏了也不心疼,自己动手焊接头,电机就不多说了,下面说说电调。
QQ截图20150130170005.png QQ截图20150130170015.png QQ截图20150130170022.png
////////////////////////////////////////////////
       电调:电调我的选择是    好盈   天行者系列 SkyWalker  40A。电调就是电子调速器,简单说就是把直流电变成交流电,然后用PWM信号控制电机转速 ,电调都是可以用arduino舵机库使用的,非常方便,函数赋值的角度越大,电机转速越快,但是行程不是0-180,有问题?别急,下文会细说。这个电调淘宝55元/个,同样几轴就需要几个,一个电机配一个电调,至于电流大小要根据电机来看,这类电机配30A的也可以不过价格差距太小了选个40A的保守点嘛。品牌也可以选择新西达电调,便宜。。。也能用。
QQ截图20150130170235.png
///////////////////////////////////////////////////
      桨:桨我选择的是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截图20150130170658.png (我也非常奇怪为什么qq飞控的背后有个foobar2000的logo。。。)
     ////////////////////////////////////////////////////////
        遥控器:我采用的是信价比较高的天地飞7,行货450左右,7个通道,配一个接收机,遥控距离500m,如果需要更远的遥控可以买增距器,或者叫遥控信号增益器,可以将遥控距离增加到几公里甚至更远,然后最好买模拟器(电脑上模拟开飞机的一套系统包括硬件和软件),否则很难在第一次操控好无人机,比较自信的或者玩过航模的也可以不用模拟器。遥控器品种繁多,也有较好的futaba遥控器,价格3000+,新手建议天地飞6或天地飞7,天地飞6不带显示屏,淘宝很多。
QQ截图20150130213424.png
}
//////////////////////////////////////////////////////////////
几个基本的东西都说完了,其他小配件就不在这里多讲了,接下来我们一起造飞机{:soso_e130:}
//////////////////////////////////////////////////////
2,开始造飞机
{
     我看帖子都比较喜欢看图,所以咱们上图讲!
     第一步,将准备好的硅胶电线取合适的长度穿进机架的轴杆,这里用的为16AWG的电线,其实18AWG就够了(这个东数值越小那么电线就越粗,承载能力就越强,一般干线用12AWG-14AWG粗一点的,电机的分线用18AWG-16AWG的也就合适)
QQ截图20150130172007.png      
每根轴杆里面有三根电线用想香蕉头焊接好,然后用热缩管包好
QQ截图20150130171957.png QQ截图20150130172016.png QQ截图20150130172023.png
部好电线后就可以开始安装电机了
QQ截图20150130210848.png
QQ截图20150130210906.png
QQ截图20150130210915.png
电机安装好后开始焊接电线另一头
QQ截图20150130210926.png
QQ截图20150130210958.png
用香蕉头公头焊好方便连接电调,在用电池粘把电调粘在机架中心板上
QQ截图20150130210949.png QQ截图20150130210941.png QQ截图20150130211007.png
效果已经出来了
QQ截图20150130210934.png
电机的位置,电机的出线处刚好是进入轴杆内部的,和事先预留在管内的电线连接
QQ截图20150130212108.png
电机很漂亮
QQ截图20150130212124.png
现在开始焊接电调,因6个电调的输入端都是并联,可以使用电调板焊接,最后汇总干线直接接电池!
QQ截图20150130211016.png
按照正负焊接好电调,这里一定要注意正负,否则后果很严重
QQ截图20150130211025.png
好了,大功告成
QQ截图20150130211033.png
QQ截图20150130212134.png
装上QQ飞控,M1-M6电机分别按照说明书位置和6个电调连接,(注意在此之前需要做油门行程校准,此步骤这里不做详细解答,电调说明书上有确切的步骤,需要强调的是,电调油门行程校准不是在连接飞控后进行的,意思就是说直接将接收机的油门通道连接电调进行油门行程校准!)
此步骤全部完成后进行飞控的中心点校准,和遥控器行程校准,在这里不做详细解答,最后试飞!,也就是说在用arduino扩展之前需要飞机能飞!
到这里你应该能明白,飞控和接收机的电源是电调的控制线输出的,电调的电源来自电池,这里就有一个问题,电调输出的电压是多少?这个在电调上会写出,一般是5v,刚好也是arduino的输出电压,这套系统的全称叫做BEC,全程为battey elimination circuit 中文翻译成免电池电路 在电调里设置了一个电路模块,将11V电池输出的电压转换到5V给接收机和舵机飞控等电子设备使用(当然电机还是用11V供电的)这样就省去了那个5V电池这就是BEC(免电池电路)名称的由来。
}
此时此刻,飞机已经可以玩了,那么我们就开始上主角Arduino!
这里我采用的是Mega2560,别急,我们先不谈扩展,我们先让arduino融入到无人机的控制系统中去,特洛伊木马也是先潜入再动手脚的嘛,这里的Arduino就是个特洛伊木马{:soso_e113:}
QQ截图20150130212151.png
QQ截图20150130212217.png
那么接线怎么接,我慢慢给大家说清楚,首选在接收机的任意一个空置插口引出一个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左右,先不管其他的值。
QQ截图20150130223055.png
紧接着我吧油门推到最高我们看看又是多少
QQ截图20150130223106.png
很巧,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
嘿嘿,现在想干嘛不行呢,这种想象空间就交给大家啦!可以看出我写的代码中有一个是测量电调温度的,我们看看图
QQ截图20150130212201.png
没错,就是那个小小的LM35D温度传感器。好了,我的飞机目前状态也和此帖保持一样的进度,但是在这里还是要向大家提出几个实验中发现的问题,1:由于用pluseIn()函数读出接收机的脉冲时间是一个会波动的数,我们可以想一个办法滤波让数值更加稳定。2:在arduino用pluseIn()函数测试自己输出的舵机角度端口脉冲值的时候,用求斜率的办法得出斜率K1=47/1010=0.0465346534653465.K2=144/2007=0.0717488789237668。K1不等于K2,也就是说他们之间的关系是非线性的,我并不知道这是为什么,希望有知道问题所在的大神求解,未完待续。。。。感兴趣的朋友可以加入QQ群67931507一起讨论

QQ截图20150130172033.png
QQ截图20150130212116.png
QQ截图20150130212143.png
QQ截图20150130212201.png
QQ截图20150130212209.png
发表于 2015-1-30 23:48 | 显示全部楼层
新人想问,有了飞控以后,还要arduino做啥用呢。。
发表于 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脉冲时间,如下:
[mw_shl_code=cpp,true]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);
}[/mw_shl_code]

所以楼主不必再将PWM脉冲时间映射回角度,而是直接调用AIL.writeMicroseconds(INAIL)即可,直接将测得脉冲时间输出,既简单还避免了精度损失。
发表于 2015-1-30 23:38 来自手机 | 显示全部楼层
好厉害!!楼主牛气吖!!已被你幽默的语气森森吸引!!
发表于 2015-1-30 23:59 | 显示全部楼层
flexbot玩了没{:soso_e113:}
 楼主| 发表于 2015-1-31 00:31 | 显示全部楼层

玩了,不过代码看晕了
发表于 2015-1-31 09:13 | 显示全部楼层
楼主,要加个摄像头就更亮了。
 楼主| 发表于 2015-1-31 20:44 | 显示全部楼层
kuanshizhuo 发表于 2015-1-31 09:13
楼主,要加个摄像头就更亮了。

摄像头会有的,图传也会有的,视觉识别也是会有的
发表于 2015-1-31 20:52 | 显示全部楼层
加个GPS就好玩了,用arduino读取位置
 楼主| 发表于 2015-1-31 20:54 | 显示全部楼层
lnehe 发表于 2015-1-31 20:52
加个GPS就好玩了,用arduino读取位置

很多东西以后都可以加上去的,下一步就是加BDS
发表于 2015-2-1 18:59 | 显示全部楼层
Leonardo魏宇科 发表于 2015-1-31 20:54
很多东西以后都可以加上去的,下一步就是加BDS

BDS的模组有卖的吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:56 , Processed in 0.118535 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表