Yavuz Selim Güler
Centipat
- 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: