接口陀螺仪arduino uno。gydF4y2Ba

这篇文章是关于接口陀螺仪arduino。陀螺仪是测量三轴角速度的装置。它在角动量的概念下工作,可以用来确定一个物体的方向。陀螺的典型应用包括导弹制导、飞行控制、智能手机、游戏机操纵杆等。机械陀螺仪,MEMS陀螺仪,光纤陀螺仪,环形激光陀螺仪。gydF4y2Ba

在这里我们讨论MEMS陀螺仪。MEMS是微机电系统的简称。MEMS陀螺仪是在焦摆原理下工作的,具有一个振动的机电元件来感知方向。MEMS陀螺仪结构紧凑,价格低廉。广泛应用于智能手机、游戏杆、遥控玩具等消费类产品。gydF4y2Ba

GY521模块。gydF4y2Ba

这里使用的陀螺仪模块是GY521。GY521是一款基于MEMS芯片MPU6050的三轴陀螺仪+加速度计模块。MPU6050有6个内置的16位ADC通道,3个用于陀螺仪输出,3个用于加速度计输出。采用I2C协议与单片机进行通信。MCU6050的工作电压范围为2.37v ~ 3.46V。在GY521板上提供了一个低降出调节器来提供这种电压。加速度计和陀螺仪的全量程范围是用户可编程的,他们是+/- 2g, 4g, 8g和16g的加速度计和+/- 250°/S, 500°/S, 1000°/S和2000°/S。GY521模块的照片如下所示。gydF4y2Ba

gy521陀螺仪gydF4y2Ba

在本文中,我们只考虑陀螺仪。许多人发现很难将陀螺仪接口到arduino或任何其他基于微控制器的系统。但这很容易做到,我将展示如何做到。根据MPU6050 datasheet,三个方向的原始陀螺仪输出值可以用下面的公式转换成三个方向的角速度。gydF4y2Ba

v_pitch = GyX / 131gydF4y2Ba

v_roll = GyY / 131gydF4y2Ba

v_yaw = GyZ / 131gydF4y2Ba

其中v_pitch为俯仰(X)轴上的角速度,v_roll为滚转(y)轴上的角速度,v_yaw为横摆(z)轴上的角速度。在三维空间中,一个物体的俯仰、滚转和偏航可以用下面给出的图来说明。gydF4y2Ba

陀螺仪arduinogydF4y2Ba

如果我们知道在一个轴上两个连续测量周期之间所经过的时间,我们可以简单地通过角速度(以°/秒为单位)乘以时间(以秒为单位)得到该轴上的角位移。因此,三个轴上的角位移可以用下面的方程来确定。gydF4y2Ba

a_pitch = v_pitch * 0.047gydF4y2Ba
a_roll = v_roll * 0.047gydF4y2Ba
a_yaw = v_yaw * 0.047gydF4y2Ba

其中a_pitch为x轴角位移,a_roll为y轴角位移,a_yaw为Z轴角位移,0.048为时间间隔。物体在三维空间中的当前方向可以由每个轴上角位移的累积相加来确定。它可以用下面的方程来证明。gydF4y2Ba

Pitch = Pitch + a_pitchgydF4y2Ba
Roll = Roll + a_rollgydF4y2Ba
偏航=偏航+ a_偏航gydF4y2Ba

线路图。gydF4y2Ba

gy521和arduinogydF4y2Ba

陀螺仪与arduino接口的电路图如图所示。GY521模块的+5V和GND连接取自arduino。GY521的SCL和SDA引脚分别连接到arduino的A5和A4引脚上。模块与arduino之间的I2C通信采用SCL和SDA引脚。gydF4y2Ba

程序。gydF4y2Ba

#include #include const int MPU=0x68;// MPU的I2C地址int GyX,GyY,GyZ;浮动距= 0;浮动辊= 0;浮动偏航= 0;浮动v_pitch;浮动v_roll;浮动v_yaw;浮动a_pitch;浮动a_roll; float a_yaw; void setup() { Wire.begin(); Wire.beginTransmission(MPU); Wire.write(0x6B); //power management register 1 Wire.write(0); Wire.endTransmission(true); Serial.begin(9600);
} void loop() {Wire.beginTransmission(MPU);Wire.write (0 x43);//从MPU寄存器43开始(GYRO_XOUT_H) Wire.endTransmission(false);Wire.requestFrom(微处理器6真实);//请求6个寄存器GyX=Wire.read()<<8|Wire.read();GyY = Wire.read () < < 8 | Wire.read ();GyZ = Wire.read () < < 8 | Wire.read ();v_pitch = (GyX / 131);if(v_pitch==-1) //错误滤波{v_pitch=0;} v_roll=(GyY/131);if(v_roll==1) //错误滤波{v_roll=0;} v_yaw=GyZ/131; a_pitch=(v_pitch*0.046); a_roll=(v_roll*0.046); a_yaw=(v_yaw*0.045); pitch= pitch + a_pitch; roll= roll + a_roll; yaw= yaw + a_yaw; Serial.print(" | pitch = "); Serial.print(pitch); Serial.print(" | roll = "); Serial.print(roll); Serial.print(" | yaw = "); Serial.println(yaw); }

笔记。gydF4y2Ba

  • GY521模块的电源从arduino本身打开。gydF4y2Ba
  • 参考的gydF4y2Ba数据表的MPU6050gydF4y2Ba更多的想法。gydF4y2Ba
  • 在将陀螺仪连接到arduino的过程中,串行监视器窗口的屏幕截图如下所示。gydF4y2Ba

连接陀螺仪到arduinogydF4y2Ba

  • 同样的程序可以修改添加一个LCD显示。我马上给你看。gydF4y2Ba
  • 程序中所示的值和方程为精确而略有修改。gydF4y2Ba
  • 在MPU6050中还有一个温度传感器。下面的程序展示了如何使用它。电路图是一样的。gydF4y2Ba
#include #include const int MPU=0x68;// MPU float temp的I2C地址;void setup() {Wire.begin();Wire.beginTransmission(微控制器);Wire.write (0 x6b);//电源管理寄存器1;Wire.endTransmission(真正的);Serial.begin (9600);} void loop() {Wire.beginTransmission(MPU);Wire.write (0 x41); //starts with MPU register 41(TEMP_OUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU,6,true); //requests 2 registers temp=Wire.read()<<8|Wire.read(); temp=(temp/340)+36.53; //equation for temperature from datasheet Serial.print(" Temperature = "); Serial.println(temp); delay(100); }
作者gydF4y2Ba

7gydF4y2Ba评论gydF4y2Ba

  1. sidharth.jeyabalgydF4y2Ba

    请帮助我那里显示了一个错误信息“注册1″在progydF4y2Ba

  2. ggydF4y2Ba

    # includegydF4y2Ba
    # includegydF4y2Ba
    const int微处理器= 0 x68;// MPU的I2C地址gydF4y2Ba
    GyY, int GyX GyZ;gydF4y2Ba
    浮动距= 0;gydF4y2Ba
    浮动辊= 0;gydF4y2Ba
    浮动偏航= 0;gydF4y2Ba

    浮动v_pitch;gydF4y2Ba
    浮动v_roll;gydF4y2Ba
    浮动v_yaw;gydF4y2Ba
    浮动a_pitch;gydF4y2Ba
    浮动a_roll;gydF4y2Ba
    浮动a_yaw;gydF4y2Ba

    无效的设置(){gydF4y2Ba
    Wire.begin ();gydF4y2Ba
    Wire.beginTransmission(微控制器);gydF4y2Ba
    Wire.write (0 x6b);//电源管理寄存器gydF4y2Ba
    Wire.write (0);gydF4y2Ba
    Wire.endTransmission(真正的);gydF4y2Ba
    Serial.begin (9600);gydF4y2Ba
    }gydF4y2Ba

    无效循环(){gydF4y2Ba
    Wire.beginTransmission(微控制器);gydF4y2Ba
    Wire.write (0 x43);gydF4y2Ba
    Wire.endTransmission(假);gydF4y2Ba
    Wire.requestFrom(微处理器6真实);gydF4y2Ba
    GyX = Wire.read () < < 8 | Wire.read ();gydF4y2Ba
    GyY = Wire.read () < < 8 | Wire.read ();gydF4y2Ba
    GyZ = Wire.read () < < 8 | Wire.read ();gydF4y2Ba
    v_pitch = (GyX / 131);gydF4y2Ba
    如果(v_pitch = = 1) {v_pitch = 0;}gydF4y2Ba
    v_roll = (GyY / 131);gydF4y2Ba
    如果(v_roll = = 1) {v_roll = 0;}gydF4y2Ba
    v_yaw = GyZ / 131;gydF4y2Ba
    a_pitch = (v_pitch * 0.046);gydF4y2Ba
    a_roll = (v_roll * 0.046);gydF4y2Ba
    a_yaw = (v_yaw * 0.045);gydF4y2Ba
    Pitch = Pitch + a_pitch;Roll = Roll + a_roll;gydF4y2Ba
    Yaw = Yaw + a_yaw;gydF4y2Ba
    系列。Print (" | pitch = ");gydF4y2Ba
    并同时(沥青);gydF4y2Ba
    系列。Print (" | roll = ");gydF4y2Ba
    并同时(卷);gydF4y2Ba
    系列。Print (" | yaw = ");gydF4y2Ba
    以偏航);}gydF4y2Ba

  3. karthigydF4y2Ba

    海,gydF4y2Ba

    v_pitch=GyX/131 131是多少?gydF4y2Ba

Baidu