在四轴飞行器上除了要有陀螺仪外,还要有个重要的传感器就是重力传感器。由于它们各自的误差,若使用单一的传感器会造成严重的精读问题,使飞行器丧失稳定性。所以要用两个传感器进行相互矫正。
现在重力传感器应用非常广,目前iphone等智能手机上都有重力传感器,包括笔者的一台山寨手机上都有重力传感器。
这次就是要用Android来读取重力传感器的数据。这个重力传感器模块是从淘宝购买的,模块非常简单,自己够买芯片来焊接也不成问题。根据它的datasheet,就能够知道如何使用这款重力加速度模块了。下面就进行详细的介绍
这个模块使用的芯片型号是MMA7260Q,(datasheet下载[PDF,229KB]),测试中的电路就是下面图片中的样子

控制的目标是通过重力传感器的数据来控制舵机的转动。但是发现会有少量的抖动,于是在程序中加入了一个简单的滤波器,阶数没有仔细调,但是基本上能够进行控制了。
http://v.youku.com/v_show/id_XMjYzNjIyODIw.html
下面是芯片的特写


下面是用到的代码
#include <Servo.h>
//Author: HE Qichen
//Email: heqichen(a)gmail.com
//Website: http://heqichen.cn
//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);
}
1,762 total views, 1 views today

