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);
}
Benim için çalışıyor ve aynı çip MPU9255 var. ... Yani, bu sizin için sorunu çözdünüz mü? – Martin
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
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