Arduino ile MPU6050 Kullanımı
Arduino ile MPU6050 Kullanımı
MPU6050, 3 eksenli ivmeölçer (accelerometer) ve 3 eksenli jiroskop (gyroscope) içeren popüler bir sensördür. Bu sensör, hareket algılamada oldukça yaygın olarak kullanılır ve özellikle robotik projeler, denge sistemleri ve oyun konsolları gibi alanlarda tercih edilir.
Bu makalede, Arduino ile MPU6050 sensörünü kullanmanın hem kütüphane kullanarak hem de kütüphane kullanmadan nasıl yapılacağını detaylı bir şekilde anlatacağız. Adım adım işlemleri takip ederek MPU6050’den veri okuyabilir ve bu verilerle uygulamalar geliştirebilirsiniz.
MPU6050’nin Arduino ile Bağlantısı
MPU6050, I2C iletişim protokolü ile çalışır. Bu nedenle, Arduino’nun SDA ve SCL pinlerine bağlanması gereklidir. Arduino ile MPU6050’yi aşağıdaki şekilde bağlayabilirsiniz:
Bağlantı Şeması:
- MPU6050 VCC -> Arduino 5V
- MPU6050 GND -> Arduino GND
- MPU6050 SCL -> Arduino A5 (UNO ve Nano modellerinde)
- MPU6050 SDA -> Arduino A4 (UNO ve Nano modellerinde)
- MPU6050 INT -> Bağlantı gerekmez (isteğe bağlı)
Not: Diğer Arduino modelleri için SCL ve SDA pinleri farklılık gösterebilir. Örneğin, Arduino Mega’da SDA ve SCL pinleri 20 ve 21 pinleridir.
1. Kütüphane Kullanarak MPU6050 ile Çalışma
Arduino ile MPU6050 sensöründen kolayca veri almak için hazır kütüphaneler kullanabilirsiniz. Bu yöntem, işlemleri oldukça kolaylaştırır.
Gerekli Kütüphaneler:
- MPU6050 veya MPU6050_light kütüphanesi
- Wire kütüphanesi (I2C protokolü için)
Bu kütüphaneler Arduino IDE içinde kolayca yüklenebilir.
Kütüphane Kurulumu:
- Arduino IDE’yi açın.
- Tools > Manage Libraries menüsüne tıklayın.
- MPU6050 araması yaparak uygun kütüphaneyi yükleyin.
Örnek Kod: MPU6050’den İvme ve Jiroskop Verilerini Okuma
#include <MPU6050.h>
MPU6050 mpu;
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.begin();
mpu.calcOffsets(true, true); // İvme ve jiroskop ofsetlerini kalibre ederSerial.println(“MPU6050 başlatıldı ve kalibre edildi.”);
}void loop() {
mpu.update(); // Sensör verilerini günceller// İvme verileri
Serial.print(“Ax: “); Serial.print(mpu.getAccX());
Serial.print(” Ay: “); Serial.print(mpu.getAccY());
Serial.print(” Az: “); Serial.print(mpu.getAccZ());// Jiroskop verileri
Serial.print(” Gx: “); Serial.print(mpu.getGyroX());
Serial.print(” Gy: “); Serial.print(mpu.getGyroY());
Serial.print(” Gz: “); Serial.println(mpu.getGyroZ());delay(500);
}
Açıklama:
- Wire.begin(): I2C iletişimini başlatır.
- mpu.begin(): MPU6050 sensörünü başlatır.
- mpu.update(): MPU6050’den ivme ve jiroskop verilerini sürekli günceller.
- mpu.getAccX(), getAccY(), getAccZ(): İvmeölçer eksen verilerini okur.
- mpu.getGyroX(), getGyroY(), getGyroZ(): Jiroskop eksen verilerini okur.
Kalibrasyon:
Bu kod, MPU6050’nin kalibrasyonunu yapar ve hassas veriler elde edilmesini sağlar. Kalibrasyon, sensörün açıldığı konumda sabit tutulmasıyla yapılır.
2. Kütüphane Kullanılmadan MPU6050 ile Çalışma
Kütüphane kullanmadan MPU6050 sensöründen veri okumak daha karmaşık olabilir. Ancak bu yöntem, daha derinlemesine bir anlayış sağlar ve bazı projelerde özel durumlar için gerekebilir.
MPU6050 ile doğrudan iletişim kurmak için I2C protokolünü ve sensörün iç register’larını manuel olarak kontrol etmeniz gerekir.
MPU6050 Register Adresleri:
MPU6050, içindeki veri register’larıyla I2C üzerinden haberleşir. Aşağıda bazı önemli register’lar verilmiştir:
- 0x3B: İvmeölçer X ekseni verisi yüksek bit (Ax)
- 0x3D: İvmeölçer Y ekseni verisi yüksek bit (Ay)
- 0x3F: İvmeölçer Z ekseni verisi yüksek bit (Az)
- 0x43: Jiroskop X ekseni verisi yüksek bit (Gx)
- 0x45: Jiroskop Y ekseni verisi yüksek bit (Gy)
- 0x47: Jiroskop Z ekseni verisi yüksek bit (Gz)
- 0x6B: Güç yönetim register’ı (Power management)
Örnek Kod: Kütüphane Kullanılmadan MPU6050’den Veri Okuma
const int MPU_ADDR = 0x68; // MPU6050’nin I2C adresi (varsayılan)
int16_t ax, ay, az, gx, gy, gz;
void setup() {
Wire.begin();
Serial.begin(9600);// MPU6050’yi uyandır (0x6B register’ını 0’a ayarla)
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
}void loop() {
// MPU6050’den 14 byte veri oku (6 ivme, 6 jiroskop ve 2 sıcaklık)
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B); // Başlangıç adresi: ivme verileri
Wire.endTransmission(false);
Wire.requestFrom(MPU_ADDR, 14, true);// İvme verileri
ax = (Wire.read() << 8 | Wire.read());
ay = (Wire.read() << 8 | Wire.read());
az = (Wire.read() << 8 | Wire.read());// Sıcaklık verisi (isteğe bağlı)
int16_t tempRaw = (Wire.read() << 8 | Wire.read());// Jiroskop verileri
gx = (Wire.read() << 8 | Wire.read());
gy = (Wire.read() << 8 | Wire.read());
gz = (Wire.read() << 8 | Wire.read());// Verileri seri porttan yazdır
Serial.print(“Ax: “); Serial.print(ax);
Serial.print(” Ay: “); Serial.print(ay);
Serial.print(” Az: “); Serial.print(az);
Serial.print(” Gx: “); Serial.print(gx);
Serial.print(” Gy: “); Serial.print(gy);
Serial.print(” Gz: “); Serial.println(gz);delay(500);
}
Açıklama:
- Wire.write(0x6B): MPU6050’nin uyku modundan çıkması için güç yönetimi register’ını (0x6B) sıfırlıyoruz.
- Wire.read() << 8 | Wire.read(): Yüksek ve düşük byte’ları birleştirerek 16-bit veriyi alıyoruz.
- ax, ay, az: İvmeölçer verileri.
- gx, gy, gz: Jiroskop verileri.
Bu yöntemde, kütüphane kullanmadan doğrudan MPU6050’nin iç yapısına erişerek verileri manuel olarak işliyoruz. Bu, daha düşük seviyede bir kontrol sağlar ve sensörü daha yakından anlamanıza yardımcı olur.
Sonuç
Arduino ile MPU6050 kullanarak hem kütüphane yardımıyla hem de manuel olarak veri okumayı öğrendiniz. Kütüphane kullanarak işleri kolaylaştırabilirken, kütüphanesiz kullanım size sensörün derinliklerine inme imkanı sunar.
Her iki yöntemi de öğrenmek, hem basit hem de daha karmaşık projelerde MPU6050’yi etkin bir şekilde kullanmanıza yardımcı olacaktır.