Arduino读取g-sensor数据 May 2nd, 2011
在四轴飞行器上除了要有陀螺仪外,还要有个重要的传感器就是重力传感器。由于它们各自的误差,若使用单一的传感器会造成严重的精读问题,使飞行器丧失稳定性。所以要用两个传感器进行相互矫正。
现在重力传感器应用非常广,目前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)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); }]]>
G-sensor是四轴飞行器项目对这个传感器的代号,正确的译名是加速度传感器。另外,FreeScale的加速度传感器虽然便宜,但是质量和精度真的不太好,还不如国产的MEMSIC。