Quadcopter assembly workshop

October 29th, 2011 § 3 comments § permalink

image

image

image

Building an army of inexpensive quadcopters…

四轴飞行器上天了

September 14th, 2011 § 0 comments § permalink

细细想来,为了仍这个东西上天已经折腾了一年的时间了,试了无数的方案,也受到了无数人的帮助。终于是上天了,下面就是整机的照片。样子有点丑,各位hold住。

这个飞行器是以上天为目标,所以机架什么都是最低成本制作。用两块钱买来的PVC管子加上一个捡来的饮用水桶就成了四轴的机架。

用了两块电池,kk飞控,四个新西达1000kv电机,四个新西达30A电调。下面是控制部分的特写。

下面是第一次飞行视频。

http://v.youku.com/v_show/id_XMzA0NDI3MjYw.html

Reading g-sensor with Arduino

May 6th, 2011 § 1 comment § permalink

Arduino读取g-sensor数据

May 2nd, 2011

在四轴飞行器上除了要有陀螺仪外,还要有个重要的传感器就是重力传感器。由于它们各自的误差,若使用单一的传感器会造成严重的精读问题,使飞行器丧失稳定性。所以要用两个传感器进行相互矫正。

现在重力传感器应用非常广,目前iphone等智能手机上都有重力传感器,包括笔者的一台山寨手机上都有重力传感器。

这次就是要用Android来读取重力传感器的数据。这个重力传感器模块是从淘宝购买的,模块非常简单,自己够买芯片来焊接也不成问题。根据它的datasheet,就能够知道如何使用这款重力加速度模块了。下面就进行详细的介绍

这个模块使用的芯片型号是MMA7260Q,(datasheet下载[PDF,229KB]),测试中的电路就是下面图片中的样子

Untitled

控制的目标是通过重力传感器的数据来控制舵机的转动。但是发现会有少量的抖动,于是在程序中加入了一个简单的滤波器,阶数没有仔细调,但是基本上能够进行控制了。


http://v.youku.com/v_show/id_XMjYzNjIyODIw.html

下面是芯片的特写

Untitled
Untitled

下面是用到的代码

#include <Servo.h>

//Author:  HE Qichen
//Email:  heqichen(a)gaishi.vicp.net
//Website:  http://gaishi.vicp.net
//Date:  2011-5-2

#define FILTER_LEVEL  3

class Filter
{
  private:
    int buffer[FILTER_LEVEL];
  public:
    Filter()
    {
      int i;
      for (i=0; i<FILTER_LEVEL; ++i)
      {
        buffer[i] = 0;
      }
    }
    int filter(int value)
    {
      int i;
      int sum;
      for (i=0; i<FILTER_LEVEL-1; ++i)
      {
        buffer[i] = buffer[i+1];
      }
      buffer[FILTER_LEVEL-1] = value;
      sum = 0;
      for (i=0; i<FILTER_LEVEL; ++i)
      {
        sum += buffer[i];
      }
      return sum / FILTER_LEVEL;
    }
};


Servo testServo;
Filter xFilter, yFilter, zFilter;

void setup()
{
  Serial.begin(9600);
  testServo.attach(2);
}

void loop()
{
  int gx, gy, gz;
  gx = analogRead(A0);
  gy = analogRead(A1);
  gz = analogRead(A2);
  
  Serial.print("x: ");
  Serial.print(gx, DEC);
  Serial.print("  y: ");
  Serial.print(gy, DEC);
  Serial.print("  z: ");
  Serial.println(gz, DEC);

  int fgx, fgy, fgz;
  fgx = xFilter.filter(gx);
  fgy = yFilter.filter(gy);
  fgz = zFilter.filter(gz);
  Serial.print("  fx: ");
  Serial.print(fgx, DEC);
  Serial.print("  fy: ");
  Serial.print(fgy, DEC);
  Serial.print("  fz: ");
  Serial.println(fgz, DEC);

  testServo.write((fgz-100)/3);
  //delay(10);
  
}