四轴飞行器攻略2:器件介绍(下)

首先说下现在的进度:目前已经测试了用Arduino读取陀螺仪传感器,加速度传感器,电子罗盘的读数;并且可以用Android手机通过蓝牙向Arduino发送指令;焊了一个小小的扩展板,并完成了初步的组装。接下来的主要工作是传感器读数的分析和姿态平衡算法的研究。发个近照:

组装完毕,等待编写程序的四轴飞行器

组装完毕,等待编写程序的四轴飞行器

圈妈学过一点心理学,忧心忡忡的对我说“据说提前说出目标的事情就不容易成功”,所以她不建议我还没做好就发攻略。但是攻略这种东西,想写的时候没写下来,过几天就忘了。我只好用男生追mm的例子做了解释:闷骚型的男生如果被人知道了暗恋对象,有的人变得更紧张,见到mm就躲;有的人则是硬着头皮展开攻势,最终满载而归。所以公布目标没啥问题,关键是看你把它当成动力还是压力。

言归正传,下面继续介绍四轴飞行器的器件们。

陀螺仪传感器
陀螺仪传感器又称角速度传感器,它的作用是测量物体运动的角速度(废话啊)。从测量维度分,陀螺仪传感器有单轴的,双轴的和三轴的;以传输方式分,又有数字型的和模拟型的。
对于四轴飞行器,最好使用三轴传感器。因为水平方向上就已经需要测量x,y两个维度的角速度,z轴方向上的自转如果有电子指南针的话,倒是也可以省略。所以很流行的另一种方案是用两个垂直安装的单轴传感器(ENC-03MB 村田角速度传感器),价格会便宜好多。
至于数字型的还是模拟型的,初学者开始会觉得模拟型的好用,它会引出3条线,分别输出0~5V之间的电压,表示xyz三轴的加速度值。
看上去似乎相当简单,用analogRead一下就好了。
从我的实践经验看来,它的问题在于线太多!陀螺仪需要3根线,加速度又3根线,指南针再3根线….随着器件的增加,Arduino的模拟输入口完全不够用。
而数字型则简单了很多,以I2C总线为例,数据通信只需要2根线,而且很多个设备(最多支持256个设备)都是公用这两条线。反正看你愿意花力气在焊板子上还是写代码上了。对于我这样的IT民工来说,显然觉得敲代码比焊板子舒服很多,所以我最终选择的是L3G4200D三轴数字式陀螺仪传感器。

加速度传感器
加速度传感器又称重力感应器,它可以感知物体受到的重力。例如水平静止放置的重力感应器,xy方向上重力加速度都是0,z轴方向上的读数则是9.8;而倾斜放置的传感器,在xy分量上就可以读出所受的重力。和陀螺仪相比,加速度传感器测量的是绝对的“倾角”,而陀螺仪测量的是“倾角的变化速度”。
这些传感器的最终目标,就是让四轴飞行器保持平稳。有人可能觉得用重力感应器就足够了,因为它可以测量绝对角度。但是请注意的是,这个倾角必须是在物体静止或者匀速的情况下测量的,飞行器在运动过程中是测不准的。就好比闭眼蹦极的人,在失重的时候是不知道上下左右的。所以一般需要两个传感器配合,一个用来测变化量,一个用来修正误差。
加速度传感器同样分为数字型的和模拟型的,我看上的是ADXL345数字型三轴加速度传感器。

电子指南针
电子指南针也叫电子罗盘,也有人叫磁通传感器。它的原理跟指南针类似,通过测量某个截面内的磁通量大小来判断方向。它也可以是三轴的,其中垂直于南北极磁力线的那个截面会有最大的读数。这个指南针不是四轴飞行器必须的,因为平稳飞行靠前面两个传感器就够了。
但是试想一下这样的情况,我们遥控一个直升机的时候,可以看到机头的朝向,所以我们可以让他“前进/后退/左移/右移”。
而四轴飞行器是对称的,当你发出“前进”指令的时候,它并不知道你期望的是哪个方向的“前进”。
网上一种流行的方案是,给四轴飞行器的某条腿涂上鲜艳的颜色,作为“机头”,前进后退的参照系都是以它为准。但是这样就需要对遥控者有一定要求,需要能够迅速分辨方向。
我加上这个电子指南针,是希望它能和手机遥控器上的指南针对应起来,永远以遥控者的面向方向作为“前方”。当然这样会给算法带来更多的工作量,大家祝我好运吧 :)
我最终选择的芯片是HMC5883L三轴数字型电子指南针

其他还有一些零七八碎的东西,包括:
超声波测距传感器,用来测量离地高度;
蓝牙适配器,用来和手机通信;
洞洞板,用来组合这些传感器;
各种插针、排母、导线、开关;
机架,这个也可以自己做,现成的比较好看;

最后是某些网友非常关心的价格问题,下面的价格表仅供参考,最终还是请大家自己擦亮眼睛,货比三家。
必须提到的是一个小插曲,很多芯片的价格分为散件价格和模块价格。例如L3G4200D芯片,单买芯片据说30元就可以搞定;如果买现成的小电路板+所有电容电阻等配件,那么需要70元左右;如果这些小配件都帮你焊好的成品,大概需要160元左右。
看到这些价格之后,勤劳勇敢的圈妈大骂奸商,说要帮我焊上,省下这100块钱!结果散件回来以后我们都傻眼了,这是一种叫LGA的封装方式,花椒一样大的小芯片,肚子下面有十几根脚。而且这些脚是在芯片肚子下面,不是伸出来的!

新手焊不了的小芯片

新手焊不了的小芯片

圈妈硬着头皮焊了几下,发现基本所有的脚都连在一起了,最后弄掉了焊盘,彻底报废。所以建议新手们,如果没有专业焊接工具的话,就不要尝试省这100块钱了。

价格表(仅供参考!)
格氏11.1V2200mA25C锂电   128
B6充电器     160
郎宇A2212电机   62×4
天行者20A电调  48×4
四轴机架     88
三轴陀螺仪模块L3G4200D       160
三轴加速度ADXL345模块     50
三轴磁阻HMC5883L模块      70
蓝牙模块JY-MCU          40
超声波测距            16



对 “四轴飞行器攻略2:器件介绍(下)” 的 98 条 评论

  1. goopy 说:

    用超声波测距传感器,如果飞到屋顶上空,离地高度还会准确么?

  2. zxx 说:

    L3G4200D初始化寄存器怎么设置的?我现在读x,y,z一直是个定值,求救~

    • 你是用I2C还是用SPI?
      我用的I2C方式,读数之前还需要设置几个寄存器,这会儿记不清了,回家给你发一下

    • 这个是我设置的参数:

      int GYRO_ADDR = 0×68; // 7-bit address: 1101000, change to 0×69 if SDO is High
      byte GYRO_READ_START = 0xA8; //Start register address, total 6 bytes: (XL,XH,YL,YH,ZL,ZH)
      byte GYRO_CTRL_REG1 = 0×20;
      byte GYRO_CTRL_REG2 = 0×21;
      byte GYRO_CTRL_REG3 = 0×22;
      byte GYRO_CTRL_REG4 = 0×23;
      byte GYRO_CTRL_REG5 = 0×24;

      int setupGyroSensor(int scale){
      writeRegister(GYRO_ADDR, GYRO_CTRL_REG1, 0x0f);
      writeRegister(GYRO_ADDR, GYRO_CTRL_REG2, 0×00);
      writeRegister(GYRO_ADDR, GYRO_CTRL_REG3, 0×08);
      if(scale == 250){
      writeRegister(GYRO_ADDR, GYRO_CTRL_REG4, 0×00);
      }else if(scale == 500){
      writeRegister(GYRO_ADDR, GYRO_CTRL_REG4, 0×10);
      }else{
      writeRegister(GYRO_ADDR, GYRO_CTRL_REG4, 0×30);
      }
      writeRegister(GYRO_ADDR, GYRO_CTRL_REG5, 0×00);
      }

  3. zxzxy1988 说:

    咳咳,经过RSS订阅,抢板凳的几率大了许多…哈哈

    BGA,LGA,各种GA的封装都是我们这种人士的禁区…而且板子也不好弄,只要看见这种封装,我立马都买现成的模块,哈哈。我们实验室原来尝试过焊,BGA的基本就没成功过,QFP的成功率也低…

    持续关注!

  4. zEus 说:

    用超声波测距的话是想自动降落吗,比如蓝牙控制的时候来电话了,或者超出控制范围了。
    不过如果四轴在水上飞行的时候。。。我觉得还是失去控制的话悬停比较好。

    • 不是,我弄这个测距的东西,主要就是为了失控的时候悬停。
      四轴保持平衡之后,如果匀速向上或者匀速向下,各种传感器都是无法分辨的。
      好像除了测距之外,没有特别好的悬停控制了 :)

      • zEus 说:

        超声波做悬停的话,飞低的话还不错,太高的话就不行了,而且我估计你的四轴不会飞的太低了。我看论坛上做悬停好像用的都是气压(高度)传感器,我看那个精度都是0.2m左右,不知道是怎样来做悬停的。

        • 气压传感器没有这么高的精度吧?没查过资料,直觉上觉得气压随高度的变化非常微弱,能精确到米的级别就不错了吧?
          超声波可以精确到厘米级别,但是测量范围可能只有2米。这两者结合应该是比较好的方式,在近地高度,用超声波测距,可以非常稳定的悬浮。上升到一定高度之后,只需要保持米级别的高度稳定即可。

          • bbj!!! 说:

            超声波的距离是15feet,像AR Drone就使用超声波.
            话说… 四轴的程序什么的 都需要自己编写嘛? 有网站 可以下载嘛?

          • Ar Drone本身好像就是开源的,电路和程序都可以下载

  5. 糖伯虎 说:

    记得你好像说过圈妈的EE,半个同行来的。这个LGA确实难焊,我用风枪吹了很久才搞定。我也一直迷恋四轴,原本也想diy的,后来考虑计算了一下成本,发现还是先买了个AR.Drone,这东西,拓展性不错。正在写用pc控制它的应用,但是视频部分遇到写问题,不知道前辈有写过java的视频开发吗?如果有,能不能给点思路,最好有个demo。

    • 没做过视频处理,曾经看到过建议,添加一个wifi路由设备,然后有那种直接插网线的摄像头,好像接上之后链接到一个ip地址,就可以看视频流。具体的细节还不太清楚。

      • 糖伯虎 说:

        谢谢回复,已经从AR.Drone的获取视频流,目前就缺乏把数据转化成视频的知识了,看来之能继续百度。

      • TanLingQi 说:

        我记得淘宝有专门卖无线视频传输模块的

  6. 小伟 说:

    LGA的封装方式的芯片我会这样焊,在小芯片每个引脚引出几根线,然后在焊在焊盘上,这个焊接技术我还是有,反正不能浪费了,哈哈

  7. 小伟 说:

    我想照着你的做一个,可我不会编程这一块,哎,动手我还是很在行,编程不行

  8. leafroot 说:

    有没有考虑用GPS,这样高度就没问题了,而且可以规划好路径自动巡航了 或 实现按原有路径返航功能

    • 有考虑,不过现在电池续航能力稍微差点,还没正式飞呢,听说只能飞10分钟以内。
      这样的话gps就没有用武之地了,不过一步一步来,平衡算法和惯性导航,对小飞机和大飞机应该是类似的。
      到时候可以做升级版

  9. SONG_Kevin 说:

    如果有一个腿上装了摄像头
    就应该用这个摄像头做前方吧

  10. zEus 说:

    问个问题,洞洞板上焊排针,能直接插到arduino 1280的插孔中吗,UNO貌似不行有一排位置对不上,不知道您有啥解决办法吗。

    • 我焊的排针刚刚好可以插到arduino的插孔里。我看间距和尺寸都是相同的,
      你是不是选用的洞洞板标准不太一样?

      • zEus 说:

        不是洞洞板的问题,1280有6条单排的插孔和尾部的1条双排插孔吧。而arduino UNO有4条单排插孔,其中有3条插孔之间的距离是正好可以插入洞洞板,有一条插孔有整体偏移,呵呵,所以没办法直接插入。
        现在只有尽量避开使用那边的IO口,或者在洞洞板上想其他的办法了。呵呵,其实解决问题才是DIY的最大乐趣嘛。

        • 原来如此,我用的是1280,所以刚刚好都可以插上。
          看来UNO的尺寸不一样,如果是我的话,会考虑买那种长腿插针,然后全都掰过去,笨办法

  11. 馄饨 说:

    传感器读数分析你是用什么软件呈现呀。
    姿态平衡算法 弄得怎么了呀

  12. cooska 说:

    如果在飞行器上装个智能手机,不仅可以去掉其他传感器的焊接,还能减少很多编程量,更重要的是,在其自动控制方面会体现的更好,位置放的好的话,摄像头也省了 哈哈

    • 这个恐怕不行,手机和飞行器之间,只能通过蓝牙通信,这个通信是很慢的,对于需要迅速反应的平衡机制来说,估计搞不定

      • 欲言 说:

        我也在考虑用智能手机,你说的蓝牙通信应该没所谓吧。直接用arduino加上它的android扩展板,那个通信是用ISP的,很快。电调什么的都靠arduino控制,但是姿态检测和平衡之类的全靠android上面的编程了,这样所有问题都扫清了~~

        另外想问下你的机架是在哪个网店里买的?我也想要~~~~~

  13. wlreg 说:

    那种封装的芯片要怎么焊的呢???话说,圈圈妈难道也是学电子出身的吗???

  14. 小马 说:

    很有创意呀,可惜对电路不了解。。

  15. SSS_SXS 说:

    lz很久没更新了,是不是什么问题卡住了?

    期待你的成品呢

  16. richard 说:

    其实想问一下楼主关于超声波测距的中断方式。
    在微博上给你看的是我写的第一篇博客,第二篇写了一个超声波的代码。。但是我发现如果两次间隔很短,比如delay(10) ,就会发生错误,数据越长越大。。不知道为啥。。谢谢……&……

  17. 猪头 说:

    最近做一个项目,我就想问一下,如果想测传感器所在平面与水平方向的夹角,有没有直接测量的?一定要用数字陀螺仪传感器么?
    求解答。。。

    • 如果被测量的物体运动比较缓慢,用加速度传感器就足够了。
      但是对于姿态快速变化的小车或航模,只能用陀螺仪+加速度

  18. 小鸡 说:

    你好啊,我也在做掌上四轴飞行器,希望能多多交流!我为了焊接那些原件,直接就买了热风枪,看个视频很快就学会焊了!我建议不要多花那100元冤枉钱。

    • darkorigin 说:

      这个强。。。不过好点的热风机都要好几百啊,而且还要回摆弄。

      我之前才发了链接给博主,淘宝上4个传感器一个板子上也才150,焊神马啊
      三轴陀螺+气压+磁定向+三轴加速度
      你自己焊就算热风机不要钱,自己加工PCB能做到如此细致?很难吧。热转印也很麻烦不是么。
      芯片自己配的话,基本上也有100左右了吧。算起来,其实省的很少。

    • darkorigin说的在理,主要是我不太擅长焊这些小东西,太费时间了,而且一旦焊坏了,成本比直接买还贵 :)
      对了,你的掌上四轴选用的都是那些型号的电机电调呢?

      • 小鸡 说:

        发现回复有点麻烦,每次都要输名字,邮箱。
        to楼上.我自己用感光膜做的电路板,线路绝对精致……做这个没有问题,不精致的是裁下来的形状……
        热风枪以后有的用啊,就200元,正好我烙铁坏了,上面还有调温防静电烙铁。
        我用的是直径7mm的空心杯电机,直接用PWM加贴片场效应管就能驱动了,45MM的正反浆……现在正在调试芯片的通信……对四轴的控制方法还是有些不懂……慢慢来吧……

        • 奇怪,你用的什么浏览器,应该输入一次以后就会记住的。
          这样说来你是自己画PCB,然后做的电路板了。网上见过的掌上四轴,好像是直接把PCB板当支架使了?

          • 小鸡 说:

            原来我用的是不同的浏览器……电脑换成手机……没错……就是你想象的那样……你的那一个模块的可能比我整个四轴的板子都大……考虑我的重量,所以我必须自己焊……
            你对四轴算法研究的透彻吗?我还没有完全搞明白……

          • 之前企图看一些开源的代码,但是看得不太明白。后来主要是在各论坛看帖子,大概就是检测倾角和旋转的角速度,然后用PID调节平衡。
            你的空心杯电机升力有多大,如果用arduino nano和一块9轴的模块,不知道能不能带的起来。我没有画过pcb,这方面没有基础。
            另外,空心杯电机怎么驱动?上次你说过场效应管,那个是做什么用的?这个空心杯调速是不是用PWM直接输出即可?功率多大,单片机的管脚直接输出带的动吗?

        • darkorigin 说:

          你热风机教程有地址么?想学下。谢谢!

          • 小鸡 说:

            我在优酷上面搜的,好像是二十几分钟的视频,好像有3集,那人经常说:我们的教程是精品,我说的每一句话都是经典…没有半句废话。事实也差不多是那样……说的很实用!

  19. 小鸡。 说:

    不知道为什么ADXL345始终调不通,不知道是程序不对还是引脚虚焊,帮我看看这也段程序吧:
    uchar SPI_Transfer(uchar cmd,uchar byte)
    {
    uchar i,read;
    SCK_H;

    SET_SDO_OUT;
    SET_SDI_IN;
    for(i=0;i<8;i++)
    {
    SCK_L;
    if(cmd&0×80) SDO_H;
    else SDO_L;
    SCK_H;
    cmd<<=1;
    }

    for(i=0;i<8;i++)
    {
    SCK_L;
    if(byte&0×80) SDO_H;
    else SDO_L;
    SCK_H;
    read<<=1;
    if(SDI_IN) read|=0×01;
    }
    return read;
    }
    uchar ADXL_Transfer(uchar cmd,uchar byte)
    {
    uchar dat;
    CS_L_ADXL;
    dat=SPI_Transfer(cmd,byte);
    CS_H_ADXL;
    return dat;
    }
    我觉得没啥问题啊。。。
    能不能把你的ADXL345的示例程序给我看看?
    发到ai_shi_qi@126.com吧,谢谢你啦

    • 你用的SPI方式啊,我用的是IIC。资料已发邮件给你 :)

      • 小鸡 说:

        谢谢啊!问题我也找到了。avr有个jtag。需要禁用portc才能使用。。

        • 赞!你有试过这些空心杯电机能带起多大重量吗?

          • 小鸡 说:

            反正不小!!飞机没有带电池的情况下,一个螺旋桨就把飞机吹得翻了个跟头!!
            今天陀螺仪突然又不行了,怀疑是电压过大坏了,换其他的也不行了,我估计是我第一次焊接是碰巧。现在把其他的陀螺仪吹坏了。焊盘也快不行了。。看来这个快报废了。。手工做的板子就是不行。。马上又要考试。。忍忍吧。先复习好。我qq526195537

          • 很有参考价值,多谢了。先好好考试,回头继续玩! :)

  20. 慕小野 说:

    我想问一下,电池是直接与四个电调相接吗?

  21. 慕小野 说:

    是不是要电源分配的东西?我把电源与俩个电调相接,启动的时候很正常运转,之后,一个电机加速,一个电机速度逐渐变慢,到停止,我感觉好像是电流没有平均分配,你的原件清单上没有电源分配这部分的东西

    • 不需要,你的情况看上去应该是电池的电流不够用,我用的是25C,11.1V的锂电。那个参数25C就是放电速度,至少也需要20才能飞起来吧

  22. 慕小野 说:

    嗯,我感觉也是功率不够,导致的竞争现象。但是我发现,一个电机转速达到一定值时,接电池的负极线开始迅速发热。
    我用的是这种电调:http://item.taobao.com/item.htm?id=13171068056
    这种现象是电池放电快达到极限值的原因,还是电调质量不好呢?

  23. 慕小野 说:

    补充一下,就是我这15c的电池是给俩个电机供电,不是同时给四个供电的

  24. darkorigin 说:

    太小了,真的太小了,中毒已久的我在淘宝上盘旋了几周了,这次买了一个9轴模块跟你的模块一样,就是多了个BMP085….一起买的还有一个网络模块。。
    东西到手之后真的是发现太小了,原来还心存侥幸说模块也许手艺好能焊接出来,现在发现真的太小了,整个模块也就是1元硬币大一丁点。幸亏没买芯片回来,不然准傻眼了。
    价格嘛。100块钱。

  25. 黑白 说:

    看了一下你那要焊接的片子,那不是用烙铁焊的,是用热风枪焊的。买一个也没多贵,练习一下,也很容易掌握,一般都是一个镊子捏好片子,用热风枪把盘子上的焊盘里的锡盘吹化,再把片子在热风枪口吹一下,立刻对准焊盘按下去,这样基本就焊好了。练习一下,很快就有感觉了。微型器件,都是要靠这个手段去搞的,否则没得玩。

  26. Stateflow 说:

    对于传感器,可以看看意法半导体的STEVAL-MKI108V2,这是一个陀螺仪(l3gd20)、三轴加速度以及地磁(集成到了LSM303DLHC)的评估模块。不过原厂的产品比较贵(30多美元,且限制出口),你可以到淘宝去买上面提到的两个芯片,然后用热风枪焊到板子上就行了。在ST的网站上,有原理图和PCB版图(cam的),可以参考它的设计(我个人感觉照搬就可以了,他的布线很成熟)。
    参考设计:http://www.st.com/internet/evalboard/product/252687.jsp
    顺便提一句的是,如果你的主控芯片是stm32的,可以参考带微控制器的模块设计,里面有方便调试的小程序。

  27. 林先炎 说:

    我正着手于做一个四轴 由于是新手 所以有一些购置的问题想请教一下
    1. 我之前买的电机是按照你的信号买的 到网上问了一下 大多数人说这个型号(A2212 kv980)使用10寸浆 请问这个尺寸是否合理呢?
    2. 我在网络上看到一个叫MPU的传感器 已经集成了6轴 我想对于我来说应该够用了 型号是MPU-6050 我还看中它的另一个原因是价格低廉
    http://item.taobao.com/item.htm?spm=a1z0k.1000775.1.151.MUA35I&id=16987043030&_u=blvo66bdaf6
    这是一个网址(正版的大概也要60左右)
    您觉得这个传感器是否可用呢?还有她本身也是兼容arduino板的

  28. sa 说:

    话说现在9轴姿态传感器好便宜,才20多块。 真的好佩服你们。

发表评论

可以使用下列 XHTML 标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>