6 Eksenli İvme ve Gyro Sensörü
MPU6050 Nedir?
MPU6050, 3 eksenli ivmeölçer (accelerometer) ve 3 eksenli gyroscope (jiroskop) içeren bir IMU (Inertial Measurement Unit) sensörüdür. Bu sensör ile hareket algılama, açı ölçümü, drone stabilizasyonu gibi birçok proje yapılabilir.
Özellikler
- 3 Eksenli İvmeölçer (X, Y, Z)
- 3 Eksenli Gyroscope (Dönüş açısı ölçümü)
- I2C Haberleşme Protokolü
- 16-bit ADC (Yüksek hassasiyet)
- 3.3V veya 5V ile çalışma
- Dahili sıcaklık sensörü
Bağlantı Şeması
| MPU6050 Pini | Arduino Pini | Açıklama |
|---|---|---|
| VCC | 5V (veya 3.3V) | Güç girişi |
| GND | GND | Topraklama |
| SCL | A5 (Uno) / 21 (Mega) | I2C Clock hattı |
| SDA | A4 (Uno) / 20 (Mega) | I2C Data hattı |
| XDA | - | Kullanılmıyor (harici sensör için) |
| XCL | - | Kullanılmıyor (harici sensör için) |
| AD0 | GND (veya VCC) | I2C adres seçimi |
| INT | - | Interrupt pini (opsiyonel) |
ÖNEMLİ NOT: AD0 pini GND'ye bağlıysa I2C adresi 0x68, VCC'ye bağlıysa 0x69 olur.
Kütüphane Kurulumu
Arduino IDE'de Sketch → Include Library → Manage Libraries menüsünden aşağıdaki kütüphanelerden birini yükleyin:
- MPU6050 by Electronic Cats
- Adafruit MPU6050 by Adafruit
Arduino Kodu
1. Basit Veri Okuma Kodu
#include <Wire.h> #include <I2Cdev.h> #include <MPU6050.h> MPU6050 mpu; unsigned long timer = 0; float timeStep = 0.01; float pitch = 0; float roll = 0; float yaw = 0; void setup() { Serial.begin(115200); Wire.begin(); mpu.initialize(); if (!mpu.testConnection()) { Serial.println("MPU6050 baglanti hatasi!"); while (1) { delay(1000); } } Serial.println("MPU6050 hazir!"); timer = millis(); } void loop() { int16_t ax, ay, az, gx, gy, gz; mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); float accelX = ax / 16384.0; float accelY = ay / 16384.0; float accelZ = az / 16384.0; float gyroX = gx / 131.0; float gyroY = gy / 131.0; float gyroZ = gz / 131.0; float accelPitch = atan2(accelY, sqrt(accelX * accelX + accelZ * accelZ)) * 180 / PI; float accelRoll = atan2(-accelX, accelZ) * 180 / PI; timeStep = (millis() - timer) / 1000.0; timer = millis(); pitch = 0.98 * (pitch + gyroX * timeStep) + 0.02 * accelPitch; roll = 0.98 * (roll + gyroY * timeStep) + 0.02 * accelRoll; yaw = yaw + gyroZ * timeStep; Serial.print("Pitch: "); Serial.print(pitch); Serial.print(" | Roll: "); Serial.print(roll); Serial.print(" | Yaw: "); Serial.println(yaw); delay(10); }2. Açı Hesaplama ile Gelişmiş Kod
#include <Wire.h> #include <MPU6050.h> MPU6050 mpu; unsigned long timer = 0; float timeStep = 0.01; float pitch = 0; float roll = 0; float yaw = 0; void setup() { Serial.begin(115200); Wire.begin(); mpu.initialize(); if (!mpu.testConnection()) { Serial.println("MPU6050 baglanti hatasi!"); while (1) { delay(1000); } } Serial.println("MPU6050 hazir!"); timer = millis(); } void loop() { int16_t ax, ay, az; int16_t gx, gy, gz; mpu.getAcceleration(&ax, &ay, &az); mpu.getRotation(&gx, &gy, &gz); // Ivme verilerini g'ye cevir float accelX = ax / 16384.0; float accelY = ay / 16384.0; float accelZ = az / 16384.0; // Gyro verilerini derece/saniye'ye cevir float gyroX = gx / 131.0; float gyroY = gy / 131.0; float gyroZ = gz / 131.0; // Ivme ile aci hesapla float accelPitch = atan2(accelY, sqrt(accelX * accelX + accelZ * accelZ)) * 180 / PI; float accelRoll = atan2(-accelX, accelZ) * 180 / PI; // Zaman farki timeStep = (millis() - timer) / 1000.0; timer = millis(); // Complementary filter pitch = 0.98 * (pitch + gyroX * timeStep) + 0.02 * accelPitch; roll = 0.98 * (roll + gyroY * timeStep) + 0.02 * accelRoll; yaw = yaw + gyroZ * timeStep; Serial.print("Pitch: "); Serial.print(pitch); Serial.print(" | Roll: "); Serial.print(roll); Serial.print(" | Yaw: "); Serial.println(yaw); delay(10); }Kalibrasyon Nasıl Yapılır?
MPU6050'yi daha hassas kullanmak için kalibrasyon yapmanız önerilir:
- MPU6050 sensörünü tamamen düz bir yüzeye yerleştirin
- Sensörü hareket ettirmeden kalibrasyon kodunu çalıştırın
- Elde edilen offset değerlerini ana kodunuza ekleyin (setXAccelOffset, setYAccelOffset vb.)
- Kalibrasyon için Arduino IDE'de "File → Examples → MPU6050 → IMU_Zero" örneğini kullanabilirsiniz
NOT: Her MPU6050 modülü için farklı offset değerleri gerekebilir.
Teknik Bilgiler
| Çalışma Voltajı | 3.3V - 5V |
| İletişim Protokolü | I2C |
| I2C Adresi | 0x68 veya 0x69 |
| İvmeölçer Aralığı | ±2g, ±4g, ±8g, ±16g |
| Gyroscope Aralığı | ±250, ±500, ±1000, ±2000 °/s |
| ADC Çözünürlüğü | 16-bit |
Uygulama Alanları
- Drone ve quadcopter stabilizasyonu
- Robot dengesi ve navigasyon sistemleri
- Hareket kontrollü oyun kumandası
- Akıllı cihazlarda pozisyon algılama
- Aktivite takibi ve adım sayıcı
- Araç eğim ve hız ölçümü
- Sanal gerçeklik (VR) uygulamaları
- Kamera stabilizasyon sistemleri
Sık Karşılaşılan Sorunlar ve Çözümleri
Problem 1: Sensör Algılanmıyor
- I2C bağlantılarını kontrol edin (SDA ve SCL)
- VCC ve GND bağlantılarının doğru olduğundan emin olun
- I2C Scanner kodu ile sensörün adresini kontrol edin
Problem 2: Veriler Sürekli Sıfır Gösteriyor
- initialize() fonksiyonunun setup içinde çağrıldığından emin olun
- Sensörün uyku modundan çıktığını kontrol edin
Problem 3: Veriler Sapmaya (Drift) Başlıyor
- Kalibrasyon yapın
- Complementary filter veya Kalman filter kullanın
- Sensörü titreşimlerden koruyun
Bu rehber, MPU6050 sensörünü Arduino ile kullanmaya başlamanız için temel bilgileri içermektedir. MPU6050 Modül bağlantımıza tıklayarak ürüne ulaşabilirsiniz.