Arduino I2C manyetometre hatalı çıktı veriyor

Katılım
18 Aralık 2022
Mesajlar
12
Daha fazla  
Cinsiyet
Erkek
Kod:
#include <Wire.h>
#define pi 3.14159265358979323846264338327950288
#define g 9.80665
//Registers
#define MpuAdress 0x68
#define WhoAmI 0x75
#define usercntrl 0x6A
#define I2Cmastrcntrol 0x24
#define powermgmt1 0x6B
#define powermgmt2 0x6C
#define int_pin_cfg 0x37
#define int_enable 0x38
#define int_status 0x3A
#define config 0x1A
#define gyroconfig 0x1B
#define accelconfig 0x1C
#define accelconfig2 0x1D
#define selftestgyrox 0x00
#define selftestgyroy 0x01
#define selftestgyroz 0x02
#define selftestaccelx 0x0D
#define selftestaccely 0x0E
#define selftestaccelz 0x0F
#define accelXoutH 0x3B
#define accelXoutL 0x3C
#define accelYoutH 0x3D
#define accelYoutL 0x3E
#define accelZoutH 0x3F
#define accelZoutL 0x40
#define TempoutH 0x41
#define TempoutL 0x42
#define gyroOutHx 0x43
#define gyroOutLx 0x44
#define gyroOutHy 0x45
#define gyroOutLy 0x46
#define gyroOutHz 0x47
#define gyroOutLz 0x48
#define magadress 0x0C
#define whoamimag 0x00
#define control1 0x0A
#define control2 0x0B
#define asax 0x10
#define asay 0x11
#define asaz 0x12
#define hxL 0x03
float rawAx, rawAy, rawAz, rawGx, rawGy, rawGz, rawMx, rawMy, rawMz, ax, ay, az, gx, gy, gz, asaX, asaY, asaZ, mx, my, mz;
void setup() {
 Wire.begin();
 Serial.begin(115200);
 Wire.beginTransmission(MpuAdress);
 Wire.write(powermgmt1);
 Wire.write(0); //sensörü başlattık
 Wire.endTransmission();
 delay(100);
 Wire.beginTransmission(MpuAdress);
 Wire.write(powermgmt1);
 Wire.write(0x80); //sensörü resetledik
 Wire.endTransmission();
 delay(100);
 Wire.beginTransmission(MpuAdress);
 Wire.write(int_pin_cfg);
 Wire.write(0x0F); //bypass modunu açtık
 Wire.endTransmission();
 delay(100);
 Wire.beginTransmission(MpuAdress);
 Wire.write(WhoAmI);
 Wire.endTransmission();
 Wire.requestFrom(MpuAdress, 1);
 uint8_t whoami = Wire.read();
 if (whoami == 0x71) {
 Serial.println("Baglanti Basarili"); //sensörün bağlantı kurduğundan emin olduk
 } else {
 Serial.println("Baglanti Basarisiz");
 }
 Wire.beginTransmission(MpuAdress);
 Wire.write(config);
 Wire.write(0x03); //dlpf_cfg ayarını yapıyoruz (decimal 3) gyro 41hz temp 42 hz
 Wire.endTransmission();
 delay(50);
 Wire.beginTransmission(MpuAdress);
 Wire.write(accelconfig2);
 Wire.write(0x03); //dlpf 41 hz
 Wire.endTransmission();
 /*Wire.beginTransmission(MpuAdress);
 Wire.write(gyroconfig);
 Wire.write(0xE8); //500 dps modunda ve self test açık
 Wire.endTransmission();
 delay(100);
 Wire.beginTransmission(MpuAdress);
 Wire.write(accelconfig);
 Wire.write(0xE8); //4g modunda ve self test açık
 Wire.endTransmission();
 delay(100);
 //Self Test acc-gyro
 int8_t selfgyrox, selfgyroy, selfgyroz, accx, accy, accz;
 Wire.beginTransmission(MpuAdress);
 Wire.write(selftestgyrox);
 Wire.endTransmission();
 Wire.requestFrom(MpuAdress, 1);
 selfgyrox = Wire.read();
 Wire.beginTransmission(MpuAdress);
 Wire.write(selftestgyroy);
 Wire.endTransmission();
 Wire.requestFrom(MpuAdress, 1);
 selfgyroy = Wire.read();
 Wire.beginTransmission(MpuAdress);
 Wire.write(selftestgyroz);
 Wire.endTransmission();
 Wire.requestFrom(MpuAdress, 1);
 selfgyroz = Wire.read();
 delay(100);
 Wire.beginTransmission(MpuAdress);
 Wire.write(selftestaccelx);
 Wire.endTransmission();
 Wire.requestFrom(MpuAdress, 1);
 accx = Wire.read();
 Wire.beginTransmission(MpuAdress);
 Wire.write(selftestaccely);
 Wire.endTransmission();
 Wire.requestFrom(MpuAdress, 1);
 accy = Wire.read();
 Wire.beginTransmission(MpuAdress);
 Wire.write(selftestaccelz);
 Wire.endTransmission();
 Wire.requestFrom(MpuAdress, 1);
 accz = Wire.read();
 Serial.println("Gyro Self-Test:");
 Serial.print("X: ");
 Serial.println(selfgyrox);
 Serial.print("Y: ");
 Serial.println(selfgyroy);
 Serial.print("Z: ");
 Serial.println(selfgyroz);

 Serial.println("Accel Self-Test:");
 Serial.print("X: ");
 Serial.println(accx);
 Serial.print("Y: ");
 Serial.println(accy);
 Serial.print("Z: ");
 Serial.println(accz);*/
 Wire.beginTransmission(MpuAdress);
 Wire.write(gyroconfig);
 Wire.write(0x08); //500 dps modunda ve self test kapalı
 Wire.endTransmission();
 delay(100);
 Wire.beginTransmission(MpuAdress);
 Wire.write(accelconfig);
 Wire.write(0x08); //4g modunda ve self test kapalı
 Wire.endTransmission();
 delay(100);
 //Manyetometre
 Wire.beginTransmission(magadress);
 Wire.write(whoamimag);
 Wire.endTransmission();
 Wire.requestFrom(magadress, 1);
 uint8_t whoamimagnet = Wire.read();
 if (whoamimagnet == 0x48) {
 Serial.println("Mag Baslatildi");
 } else {
 Serial.println("Mag Baslatilamadi");
 }
 Wire.beginTransmission(magadress);
 Wire.write(control1);
 Wire.write(0x00); //magı kapattık
 Wire.endTransmission();
 delay(100);
 Wire.beginTransmission(magadress);
 Wire.write(control1);
 Wire.write(0x0F); //Fuse rom mod
 Wire.endTransmission();
 delay(100);
 Wire.beginTransmission(magadress);
 Wire.write(asax);
 Wire.endTransmission();
 Wire.requestFrom(magadress, 3);
 asaX = Wire.read();
 asaY = Wire.read();
 asaZ = Wire.read();
 asaX = ((asaX - 128) / 256 + 1)*4912.0/32760.0; //sens adj değereleri(duyarlılık)
 asaY = ((asaY - 128) / 256 + 1)*4912.0/32760.0;
 asaZ = ((asaZ - 128) / 256 + 1)*4912.0/32760.0;
 delay(100);
 Wire.beginTransmission(magadress);
 Wire.write(control1);
 Wire.write(0x00); //magı kapattık
 Wire.endTransmission();
 delay(100);
 Wire.beginTransmission(magadress);
 Wire.write(control1);
 Wire.write(0x12); //sürekli ölçüm bir 16 bit
 Wire.endTransmission();
}
void loop() {
 //ham ivmeölçer değerleri
 Wire.beginTransmission(MpuAdress);
 Wire.write(accelXoutH);
 Wire.endTransmission();
 Wire.requestFrom(MpuAdress, 6);
 rawAx = (Wire.read() << 8) | Wire.read();
 rawAy = (Wire.read() << 8) | Wire.read();
 rawAz = (Wire.read() << 8) | Wire.read();
 ax = (rawAx / 8192) * g; //ham ivmeölçer verilerini g cincinden karşılığının bulunması
 ay = (rawAy / 8192) * g;
 az = (rawAz / 8192) * g;
 Serial.print("Accel: ");
 Serial.print(ax);
 Serial.print(", ");
 Serial.print(ay);
 Serial.print(", ");
 Serial.println(az);

 //ham jiroskop değerleri
 Wire.beginTransmission(MpuAdress);
 Wire.write(gyroOutHx);
 Wire.endTransmission();
 Wire.requestFrom(MpuAdress, 6);
 rawGx = (Wire.read() << 8) | Wire.read();
 rawGy = (Wire.read() << 8) | Wire.read();
 rawGz = (Wire.read() << 8) | Wire.read();
 gx = (rawGx / 65.5) * pi / 180; //ham verilerden rad/s cinsinden karşılıoğının bulunması
 gy = (rawGy / 65.5) * pi / 180;
 gz = (rawGz / 65.5) * pi / 180;
 Serial.print("Gyro: ");
 Serial.print(gx);
 Serial.print(", ");
 Serial.print(gy);
 Serial.print(", ");
 Serial.println(gz);
 //Manyetometre
 Wire.beginTransmission(magadress);
 Wire.write(hxL);
 Wire.endTransmission();
 Wire.requestFrom(magadress, 8);
 rawMx = (Wire.read() << 8) | Wire.read();
 rawMy = (Wire.read() << 8) | Wire.read();
 rawMz = (Wire.read() << 8) | Wire.read();
 mx = rawMx * asaX ;
 my = rawMy * asaY ;
 mz = rawMz * asaZ ;
 Serial.print("Mag: ");
 Serial.print(mx);
 Serial.print(", ");
 Serial.print(my);
 Serial.print(", ");
 Serial.println(mz);
 delay(100);
}

Bu kodda manyetometre okumaları doğru çıkmıyor diye düşünüyorum.
Örnek çıktı: MAG: -2385.65, 1920.72, 661.06
Sensör mpu9255, daha önceden mpu 9250 vs. çalışmış varsa bir bakabilir mi?
 
Son düzenleyen: Moderatör:

Geri
Yukarı