Robofun 機器人論壇

標題: 我目前使用L3G42000陀螺儀 關於他目前輸出的數據與角度 [打印本頁]

作者: ben3345678    時間: 2013-7-24 23:12
標題: 我目前使用L3G42000陀螺儀 關於他目前輸出的數據與角度
本帖最後由 ben3345678 於 2013-11-12 18:56 編輯

我是剛接觸的新手 還不是很懂程式 所以請問各位大大
針對這個陀螺儀所附的程式碼 讀取出來的數據 到底是甚麼數據 如何換算成角度 有公式嗎??
#include <Wire.h>

#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23

int Addr = 105;                             // I2C address of the L3G4200D gyro
int x, y, z,a;
int ledPinA=2;
int ledPinB=3;

void setup(){
  pinMode(ledPinA,OUTPUT);
  pinMode(ledPinB,OUTPUT);
  Wire.begin();
  Serial.begin(9600);
  writeI2C(CTRL_REG1, 0x1F);                // Turn on all axes, disable power down
  writeI2C(CTRL_REG3, 0x08);                // Enable control ready signal
  writeI2C(CTRL_REG4, 0x80);                // Set scale (500 deg/sec)
  delay(100);                               // Wait to synchronize
}

void loop(){
  getGyroValues();                         // Get new values
  Serial.print("Raw X:");  Serial.print(x /114);  // Divide by 114 reduces noise
  Serial.print(" Raw Y:"); Serial.print(y /114);
  Serial.print(" Raw Z:"); Serial.println(z /114);
  delay(300);                              // Short delay between reads
  if(x>=20520||y>=20520||z>=20520){
    //a=a+1;
    digitalWrite(ledPinA,HIGH);
    delay(400);
    //if(a>30)
      //digitalWrite(ledPinB,HIGH);
  }
  if(x<=-20520||y<=-20520||z<=-20520){
    //a=a+1;
    digitalWrite(ledPinA,HIGH);
    delay(400);
    //if(a>30)
      //digitalWrite(ledPinB,HIGH);
      
  }
   else{
    digitalWrite(ledPinA,LOW);
    delay(400);
    a=a+1;
    if(a>30){
      digitalWrite(ledPinB,HIGH);
    }
  }

}
void getGyroValues () {
  byte MSB, LSB;

  MSB = readI2C(0x29);
  LSB = readI2C(0x28);
  x = ((MSB << 8) | LSB);

  MSB = readI2C(0x2B);
  LSB = readI2C(0x2A);
  y = ((MSB << 8) | LSB);

  MSB = readI2C(0x2D);
  LSB = readI2C(0x2C);
  z = ((MSB << 8) | LSB);
}
int readI2C (byte regAddr) {
    Wire.beginTransmission(Addr);
    Wire.write(regAddr);                     // Register address to read
    Wire.endTransmission();                 // Terminate request
    Wire.requestFrom(Addr, 1);              // Read a byte
    while(!Wire.available()) { };           // Wait for receipt
    return(Wire.read());                 // Get result
}

void writeI2C (byte regAddr, byte val) {
    Wire.beginTransmission(Addr);           // Begin transmission
    Wire.write(regAddr);                     // Open communications
    Wire.write(val);                         //
    Wire.endTransmission();                 //  
}
作者: vegewell    時間: 2013-7-27 02:43
回復 1# ben3345678
>>針對這個陀螺儀所附的程式碼 讀取出來的數據 到底是甚麼數據 如何換算成角度 有公式嗎?

如果要換算成具體角度: angle = atan2(y, z) * (180/3.14)

陀螺儀的直接輸出值是相對靈敏軸的角速率,角速率對時間積分即可得到圍繞靈敏軸旋轉過的角度值。由於系統採用微控制器循環採樣程序獲取陀螺儀角速率信息,即每隔一段很短的時間採樣一次,所以採用累加的方法實現積分的功能來計算角度值:


    陀螺儀角度計算:


   式中angle(n)為陀螺儀採樣到第n次的角度值;
   angle(n-1)為陀螺儀第n-1次採樣時的角度值;
   gyron為陀螺儀的第n次採樣得到的瞬時角速率值;
   dt為運行一遍所用時​​間;

      angle_n += gyro(n) * dt
//積分計算

作者: ben3345678    時間: 2013-10-9 19:45
回復 2# vegewell


    如果現在 還有另一個計算的程式 可是 他出來的角度 幾乎都不準確 有其他方法可以解決嗎??
    能夠直接在程式裡面做修正 還是需要其他的硬體教準??
    #include <Wire.h>
#include <L3G4200D.h>
#define EMAoffset 0.05
//#define Gyr_Gain 0.076335877862595  // 1/131,250dps
float angleG;
float G_offset;
float gyroSpeed;
unsigned long timer = 0;


L3G4200D gyro;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  gyro.enableDefault();
  delay(500);
}

void loop() {
  long o_timer = timer;
  timer = millis();
  int dt = timer - o_timer;
  gyro.read();
  G_offset = EMAoffset *(gyro.g.y - 55) / 131 + (1-EMAoffset) * G_offset;
  gyroSpeed = (gyro.g.y - 55) / 131 - G_offset;
  angleG = angleG + gyroSpeed * dt / 1000;
  Serial.print("angle_x: ");
  Serial.print(angleG,6);
  Serial.println(";");   
  delay(500);
}




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2