2016-03-27 20 views
1

Yönlendirme verilerini toplamak için bir MPU9255 ve BMP180 ile 10 DOF IMU kullanıyorum. IMU'nun yeteneklerini test etmek için indirdiğim arduino için bir taslak çizdiğimde, ivmeölçerden ve jiroskop elemanlarından gelen verileri mükemmel bir şekilde toplar, ancak hiçbir zaman almamış olduğu manyetometreden veri istemekte kalır. Manyetometre verilerini bir kez başarıyla okur, ancak programı yeniden yüklemediğimde bir daha asla okuyamaz. Daha spesifik olarak, bitsel ve asla doğru olarak değerlendirilmez, bu nedenle program ilerleyemez, çünkü veri manyetometreden "hazır değil". Gerçek sorun bulunduArduino Sensörü 10DOF MPU9255 manyetometre verisini alamıyor

do 
    { 
    I2Cread(MAG_ADDRESS,0x02,1,&ST1); 
    } 
    while (!(ST1&0x01)); 

Ama burada

#include <Wire.h> 

#define MPU9250_ADDRESS   0x68 
#define MAG_ADDRESS    0x0C 

#define GYRO_FULL_SCALE_250_DPS 0x00 
#define GYRO_FULL_SCALE_500_DPS 0x08 
#define GYRO_FULL_SCALE_1000_DPS 0x10 
#define GYRO_FULL_SCALE_2000_DPS 0x18 

#define ACC_FULL_SCALE_2_G  0x00 
#define ACC_FULL_SCALE_4_G  0x08 
#define ACC_FULL_SCALE_8_G  0x10 
#define ACC_FULL_SCALE_16_G  0x18 



// This function read Nbytes bytes from I2C device at address Address. 
// Put read bytes starting at register Register in the Data array. 
void I2Cread(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data) 
{ 
    // Set register address 
    Wire.beginTransmission(Address); 
    Wire.write(Register); 
    Wire.endTransmission(); 
if(Register == 0x02){ 
    Serial.println("Data Not Ready"); 
} 
    // Read Nbytes 
    Wire.requestFrom(Address, Nbytes); 
    uint8_t index=0; 
    while (Wire.available()) 
    Data[index++]=Wire.read(); 
    Serial.println("Data: " + *Data); 
} 


// Write a byte (Data) in device (Address) at register (Register) 
void I2CwriteByte(uint8_t Address, uint8_t Register, uint8_t Data) 
{ 
    // Set register address 
    Wire.beginTransmission(Address); 
    Wire.write(Register); 
    Wire.write(Data); 
    Wire.endTransmission(); 
} 


// Initializations 
void setup() 
{ 
    // Arduino initializations 
    Wire.begin(); 
    Serial.begin(115200); 

    // Configure gyroscope range 
    I2CwriteByte(MPU9250_ADDRESS,27,GYRO_FULL_SCALE_2000_DPS); 
    // Configure accelerometers range 
    I2CwriteByte(MPU9250_ADDRESS,28,ACC_FULL_SCALE_16_G); 
    // Set by pass mode for the magnetometers 
    I2CwriteByte(MPU9250_ADDRESS,0x37,0x02); 

    // Request first magnetometer single measurement 
    I2CwriteByte(MAG_ADDRESS,0x0A,0x01); 


} 


long int cpt=0; 
// Main loop, read and display data 
void loop() 
{ 

    // _______________ 
    // ::: Counter ::: 

    // Display data counter 
    Serial.println(cpt++,DEC); 
    Serial.print ("\t"); 



    // ____________________________________ 
    // ::: accelerometer and gyroscope ::: 

    // Read accelerometer and gyroscope 
    uint8_t Buf[14]; 
    I2Cread(MPU9250_ADDRESS,0x3B,14,Buf); 


    // Create 16 bits values from 8 bits data 

    // Accelerometer 
    int16_t ax=-(Buf[0]<<8 | Buf[1]); 
    int16_t ay=-(Buf[2]<<8 | Buf[3]); 
    int16_t az=Buf[4]<<8 | Buf[5]; 

    // Gyroscope 
    int16_t gx=-(Buf[8]<<8 | Buf[9]); 
    int16_t gy=-(Buf[10]<<8 | Buf[11]); 
    int16_t gz=Buf[12]<<8 | Buf[13]; 

    // Display values 

    // Accelerometer 
    Serial.print (ax,DEC); 
    Serial.print ("\t"); 
    Serial.print (ay,DEC); 
    Serial.print ("\t"); 
    Serial.print (az,DEC); 
    Serial.print ("\t"); 

    // Gyroscope 
    Serial.print (gx,DEC); 
    Serial.print ("\t"); 
    Serial.print (gy,DEC); 
    Serial.print ("\t"); 
    Serial.print (gz,DEC); 
    Serial.print ("\t"); 


    // _____________________ 
    // ::: Magnetometer ::: 


    // Read register Status 1 and wait for the DRDY: Data Ready 
//Strong suspicion that this do while loop repeats to infinity 
    uint8_t ST1; 
    do 
    { 
    I2Cread(MAG_ADDRESS,0x02,1,&ST1); 
    //Serial.println("Reading"); 
    } 
    while (!(ST1&0x01)); 

    // Read magnetometer data 
    uint8_t Mag[7]; 
    I2Cread(MAG_ADDRESS,0x03,7,Mag); 


    // Create 16 bits values from 8 bits data 

    // Magnetometer 
    int16_t mx=-(Mag[3]<<8 | Mag[2]); 
    int16_t my=-(Mag[1]<<8 | Mag[0]); 
    int16_t mz=-(Mag[5]<<8 | Mag[4]); 


    // Magnetometer 
    Serial.print (mx+200,DEC); 
    Serial.print ("\t"); 
    Serial.print (my-70,DEC); 
    Serial.print ("\t"); 
    Serial.print (mz-700,DEC); 
    Serial.print ("\t"); 



    // End of line 
    Serial.println(""); 
    delay(100);  
} 

cevap

0

Aha ihtimale karşı tam kodudur: kodun kusurlu hatları bu olan her yeni okuma için manyetometre tek bir ölçüm başlamak gerekir :

// Create 16 bits values from 8 bits data 

    // Magnetometer 
    int16_t mx=-(Mag[3]<<8 | Mag[2]); 
    int16_t my=-(Mag[1]<<8 | Mag[0]); 
    int16_t mz=-(Mag[5]<<8 | Mag[4]); 


    // Magnetometer 
    Serial.print("MAG:\t"); 
    Serial.print (mx+200,DEC); 
    Serial.print ("\t"); 
    Serial.print (my-70,DEC); 
    Serial.print ("\t"); 
    Serial.print (mz-700,DEC); 
    Serial.print ("\t"); 

    // Request first magnetometer single measurement !!!!! 
    I2CwriteByte(MAG_ADDRESS,0x0A,0x01); 

Bu kodun ucundan, ben yeni bir okuma başlatır bir çizgi ekledi. Çalışıyor gibi görünüyor.

+0

Benim için çalışıyor ve aynı çip MPU9255 var. ... Yani, bu sizin için sorunu çözdünüz mü? – Martin

+0

Bu hala çalışmıyor. AK8975'teki kontrol kaydına ulaştığını görüyorum. \t Çözümünüz anlamlıdır, bu yüzden sorunun ne olduğundan ve kodun hala neden başarısız olduğundan emin değilim. – wfehrn

+0

Aslında şimdi çalışıyorum! Sadece düzenleme ile birlikte SDA ve SCL satırlarını değiştirmek zorunda kaldım. Aptal bana, sorun gidermek için geri döndüğümde yanlış yaptım. Bu yapacak! Yardımın için çok teşekkür ederim! – wfehrn