2012年01月 文档列表

四轴飞行器第二次试飞小结

春节期间进行了第二次不拴绳的试飞。总体来说,革命尚未成功,同志仍需努力……

和第一次相比,主要做了以下变化:

1. 给油门控制添加了一点渐变处理,当不小心把油门推高或者降到0的时候,飞行器不会猛升猛降,油门会较为平稳的变化。
好的飞控不会有这个功能,因为控制比较平稳,尤其是玩暴力飞行的朋友,肯定不能有延时。这里主要是为了在调试阶段不要损伤器件。

2. 添加了超声波测距传感器,把离地距离限制在1.5米以内,超出这个高度后,油门就会适当下降,这个主要是为了避免飞出控制范围和直接坠落。

3. 把采样频率从原来的50Hz提高到了350Hz,本来想提高到400Hz,但是某些情况下单个周期里的运算时间会超过2.5ms一点儿,所以最后改为350Hz。

4. 增加了从上面拴绳和下面拴绳两种调试方法,主要是为了调试PID时使用。

这是加了超声波大眼睛的四轴飞行器:

四轴飞行器上的超声波测距传感器

四轴飞行器上的超声波测距传感器

飞行视频:

从飞行的状态看,超声波测距起了一定的作用,四轴没有像上次那样飞的太高和直线下降。但是起飞以后侧飞的非常严重,看上去像是在很大尺度上摆动。做一个小小的总结,下个阶段准备在以下几个方面进行改进:

1. 减少震动,把控制板用弹簧或者橡胶垫稍微做点隔离,减少电机震动对传感器的影响
2. 校准螺旋桨,刚刚知道我买的螺旋桨(5元一对)平衡性能不是很好,不校准的话震动很大。建议的校准可以用一根细的针穿过中心轴,看看不会向一侧偏。轻的一边用透明胶带绕几圈配重。但是不知道透明胶带会不会影响气动性能
3. 没有做误差标定,就是把四轴放在平地上,在启动电机前记录平地时的各种读数
4. 除了1和2中的物理减震外,还应该做软件减震,按老薛的建议,打算把平均滤波改为卡曼滤波
5. 挂绳的试飞和无绳的试飞并不完全相同,挂绳时有垂直或水平的作用力,会辅助四轴平衡。所以这个四轴在挂绳时有时表现的还凑合,一到实战就横着飞
6. 初期犯了个经验主义错误,我以为气压计只能测量较大尺度上的高度,毕竟上下几米气压几乎没有变化;另外也担心在快速上升下降的过程中,气压会受到风速的影响。但是通过网友们的实战看来,气压计的高度估计可以精确到0.25米左右,并且在高速飞行时的表现也还不错。真是小看了当前的电子设备,这个在下一步可以考虑加上。

另外还有一个小小的经验可以分享:刚开始挂绳时,发现挂绳也不安全。当四轴上升的时候,会把挂绳吸进螺旋桨,结果叮叮咣咣,你懂的……
后来找了一些叫做易拉宝的东西,本来是用来拴钥匙门卡的,自重小而且伸缩性挺好,绳子也挺结实。四轴上升下降的时候,绳子也跟着伸缩,这样就不怕螺旋桨卷绳子啦。

用可伸缩的挂绳来测试四轴

用可伸缩的挂绳来测试四轴

四轴飞行器攻略3:串口通信

虽然四轴飞行器还没有最后完工,但我觉得这不妨碍先发一部分攻略。作为一个新手,我在调试过程中遇到了很多问题,现在不记下来的话,等完工了很可能都忘了;另外,高手们也可以通过我的攻略,看看有没有什么错误,或者哪里可以优化;最主要的是,独乐乐不如众乐乐,分享是DIYer们的精神之一 :)

上次整理了四轴攻略的目录,今天正式把它放在导航栏成为一个新项目,目录的顺序是按照我制作的顺序来组织的。
比如刚买回来电机和电调,本来应该先做电机控制实验。但是看了说明书发现这种电机还需要初始化,而且初始化需要可调比例的PWM方波(具体的设置方法会在后续的电调部分介绍)。对于控制来说,调节方法至少有两种:一种用旋转电位器连接Arduino的模拟输入,另一种是用计算机或者手机通过串口控制调节。

因为电机的初始化只需要做一次,为了这个增加电位器好像没有必要;而串口通信则会贯通在整个控制和调试的过程中,所以我决定先从它开始实验。

串口通信其实之前已经做过很多小实验了,简单的一段演示代码如下:

Serial.begin(9600);  // 设置波特率
Serial.write(123);   // 向控制端写数据
while(Serial.available()) {
       // 如果有数据,则读取数据
       byte data = Serial.read();
}

很快你会发现这段简单的小代码有一些问题。

1. 传输速度:
代码中的9600是波特率,也就是数据通信的速度,它是目前比较流行的传输速率。以这个速度通信的话,每发送一个字节(Byte)到控制端需要的时间大概是1毫秒。需要注意的是,为了精确控制四轴的平衡,我们需要尽量在短时间内多读取各种传感器的值。以目前的350Hz的采样率来说,每2.85毫秒就需要读取一次陀螺仪和重力感应器。这种情况下,1Byte/ms的传输速度显然是不能容忍的。解决的办法就是修改波特率,Arduino支持的波特率包括:300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 和 115200。如果修改的话,相应的控制端也需要修改成一样的。
大家可能会说,为什么不全都用高速的呢?实际上能使用多少的波特率,跟处理器的主频有关;而且主频最好是波特率的整数倍,否则的话可能会增加错误率。对于我这个四轴来说,如果用USB和电脑通信,可以达到最高的115200;如果用蓝牙和手机通信,只能达到9600的波特率(因为蓝牙模块修改波特率还需要额外购买一个控制板)
很让人高兴的一点是,Arduino支持在运行过程中动态修改波特率。所以可以首先使用9600连接,当发现连接对象是电脑时,调整为115200:

    if(controlType == 100 && !connectToPc) {
      Serial.end();
      connectToPc = true;
      Serial.begin(115200);
    }

需要说明的是,只有发送数据才有这个问题,对于单向接收数据基本是没有关系的。因为Arduino接收的数据会放在缓冲区里,在读取的时候数据已经下载完毕,主程序不需要等待接收。

2. 关于通信协议
对于一个新手来说,协议可能是个特别吓人的词汇,感觉是权威机构才能制定的东西。事实上,在单片机领域经常需要自己定义协议。下面我们看看到底是怎么回事。
前面的代码中演示了如何接收一个字节的数据,问题是:如果需要接受多个控制数据,读取程序怎么知道哪个字节是控制那个参数呢?
我用了一个非常简单的协议,每组数据6个字节,其中第一个字节是FF,其他字节都小于255。这样一来,我们在读取数据时,如果看到FF就知道它是数组的第一个元素了。
当然我这里是一个简单的协议,对于复杂的系统,数据中很可能也带有FF数据,这种情况该怎么办呢?其实也很简单,就像高等语言中的转义功能。如果数据中有FF,那么我们把它改成FE01。等等,如果数据中原来就有FE01怎么办?我们可以把所有的FE改成FE02。这样就完成了转义。学过HTML语言的同学,可以用&转义符做参考进行理解。

3. 校验位
接下来是另外一个问题。单片机通信并不像我曾经想象的那样稳定和精确,它其实是有可能丢数据的。例如串口数据到达的时候,Arduino的中断正好被触发,这时候数据就丢了。
丢一个数据可能会带来非常严重的后果,例如我的控制参数,第一个是油门,第二个是PID的积分参数,第三个是PID的微分参数。如果第二个数据丢了,我就会认为第三个是积分参数,这两个参数如果相差较大的话,也许四轴就坠毁了……
所以在协议里,还需要确认一下收到的数据是否完整和正确,这里就需要用到校验位。一个常用的简单的方法是,把一组数据依次进行异或操作,把结果作为最后一个字节的数据一起发出去。接收端收到数据后,也相应的做一次异或操作,看看两个值是否相等。从数学上看,也可以把接收数据全部异或起来,如果等于0就对了。(这种异或校验法不能完全保证正确性,有一定的概率会误判,但是大多数情况够用了)
如果校验错误的话,我们宁可把这一组数据丢掉,也不能使用错误的参数。

void loop()
{
    while(Serial.available()) {
        pushData(Serial.read());
    }
}
int bufferIndex = 0;
void pushData(byte data)
{
  //验证是否数据的开始
  if (bufferIndex < 1 && data != (byte)0xFF) {
    bufferIndex = 0;
  } else {
    buffer[bufferIndex] = data;
    if (bufferIndex == 5) {
      setParams();
    }
    bufferIndex = (bufferIndex + 1) % 6;
  }
}
void setParams()
{
  // 因为超声波中断可能导致数据丢失,所以需要额外的一个字节用于校验
  if(buffer[1] ^ buffer[2] ^ buffer[3] ^ buffer[4] == buffer[5]) {
    ctrlPower = buffer[1];
    reportType = buffer[2];
    P_Control = buffer[3] / 200.0;
    I_Control = buffer[4] / 200.0;
    // 其他处理
  }
}

总结,其实所谓的“协议”,就是在数据通信时商量好的“规则”,按照这个规则,我们才能保证接收到正确的数据。

智能小车DIY”全”攻略

据胡泊同学介绍,最近南京嵌入之梦的站长丁齐整理了一本《智能小车DIY全攻略》的电子书。

该同学常年折腾智能小车,各种成功与失败都已经经历过了,特此总结了这本书。现在可以从机器人天空免费下载,有兴趣的同学赶快去吧!

作者的话:“标题只是为了赶时髦,所谓“全攻略”实不敢当,所以将“全”字用引号括起。本文是为正准备DIY 一辆智能小车或已在进行中的学生、玩家们提供一些综合、客观的信息,作为其方案选择、取舍的参考。系个人所见,欢迎交流、指正!”

本书为作者多年智能小车DIY与嵌入式开发经验总结,书中资料详实准确,有前人的宝贵经验,也有作者的实际测试所得。书中全面系统的阐述了智能小车开发所涉及的方方面面,包括驱动方式的选择,各种方式之间的比较,电机与电池的选择……相信对智能小车DIY还心存困惑的爱好者们看完此书后定会获得醍醐灌顶之感。

下载地址:http://www.robotsky.com/XiangM/2012-01-16/13266880187017.html
作者主页:http://www.embedream.com/

为这些无私奉献的DIY同学们鼓掌 :)

四轴飞行器首次试飞小结

今天的天气非常好,蓝天白云,风平浪静,阳光明媚,万物复苏,狗熊撒欢……想一想四轴飞行器已经在阳台上挂着试飞过若干次了,今天终于要摆脱枷锁,真正试飞一次。

于是携带专用摄影师圈圈妈,来到了附近的小绿园。因为最近剃了光头,所以脑袋还是挡一下吧,以免吓到小盆友和花花草草:

四轴飞行器首次试飞

四轴飞行器首次试飞

现在还没有加上超声波测距传感器,不能测量离地高度。因为觉得可以控制电机转速,所以觉得没有它也问题不大。

不过从试飞看来,没有这个测距传感器还是很不方便的,主要有以下几个原因:
1. 有效量程较小,我设置的量程是0~200,对应电机的最小和最大转速;但是转速到60的时候才刚刚离地,到80就已经接近失控;
2. 手机控制过于灵敏,手指头稍微动一下,十几二十就出去了;
3. 控制距离比较短,只能支持10多米,总担心飞出控制范围;

下面的视频是第一次正式离地,总的来说,离地还算平稳。第一次没敢使劲飞,一起来我就向下调油门。结果有点心急了,搞得像坠毁似的。
从离地表现看来,陀螺仪和重力传感器应该是工作正常,姿态平衡算法也还勉强凑合。Ar.Drone使用的是ARM芯片,读数采样率可以达到500Hz,而我这个Arduino目前只优化到350Hz,第一次试飞能直上直下还算满意了。

随后又试了几次类似的低飞操作,终于决定卯足劲飞高点。于是把油门推到80,结果瞬间就蹿到了十米高左右。
要知道这家伙如果超出蓝牙控制范围,就会保持这个速度乱飞,谁知道会发生什么事情呢?
那边还有几个打太极拳的老头老太太,再过去是一群小P孩,数千转的螺旋桨跟飞刀也差不多了……
太恐怖了,所以马上遥控降落,结果再次操作过快。这次从高空重重摔在地上,好不容易焊好的那块扩展板被震松了,所有的电机全部罢工。
第一次试飞只能到此结束啦。

这是由美女摄影师拍摄的坠落现场:

阶段总结:
1. 量程控制应该改进成非线性的,0~60可以缩短一点,60~90可以拉长一点(对应手机上的控制距离)。这样遥控的时候,在有效量程内就不会手忙脚乱的,一哆嗦就上天或者坠落。
2. 是时候加上超声波测距了,目前陀螺仪和加速度计都工作正常。如果能够测量离地高度,就可以比较平稳的悬浮。
3. 四个腿应该捆上点泡沫缓冲,不然高处坠落的时候,非常容易损坏零部件。
4. 蓝牙的遥控距离确实有点短了,一不留神就飞出10米远。接下来可以考虑wifi控制,或者捆一个手机上去,用另一个手机控制。
5. 添加意外处理,万一真的失去控制,应该平稳降低电机转速下降,否则的话一定会有安全隐患。

欢迎各路英雄提出宝贵意见 :)

关于四轴飞行器

今天看到SSS_SXS同学的提醒,发现已经有一个多月没更新了。这段时间乱七八糟的事情挺多,期间还开小差又玩了一阵子陀螺,总之进展不多。

目前的状况是:传感器可以正确读数,电机驱动和手机蓝牙控制也已经完成,最复杂的姿态平衡控制正在调试中。虽然还没有完成,现有的东西也可以大概总结一下攻略,这里先列出目录,以后慢慢补充内容。

快过年啦,祝大家新年快乐,万事如意,多拿红包!

基于Arduino的四轴飞行器制作攻略

  • 四轴飞行器教程1:器件介绍(上)
  • 四轴飞行器教程2:器件介绍(下)
  • Arduino串口通信
  • 用一块Arduino输出多路PWM
  • 带好盈程序的电子调速器控制
  • I2C总线和SPI总线
  • 三轴陀螺仪的调试
  • 三轴加速度感应器的调试
  • 三轴电子指南针的调试
  • 蓝牙接收板的使用
  • Android手机开发环境设置
  • Android手机的蓝牙通信
  • 自制Arduino扩展板
  • Arduino中的指令时间
  • 卡尔曼滤波和平衡滤波
  • 空间坐标系变换及调试
  • PID平衡算法
  • 在电脑上记录log并调试
  • 超声波测距传感器的使用