GY-521 – MPU6050 IMU (İvmeölçer-Jiroskop-Sıcaklık) Sensör Modülü Nasıl Kullanılır?

Bu yazımızı okuduktan sonra Arduino ile nasıl kullanıldığını öğrenmek için buraya tıklayınız.

MPU6050

MPU6050 6 eksen açıölçer ve jiroskop sensörü olarak bir çok projede kullanılan, piyasada çok rahat bulabileceğiniz bir modüldür. Açıölçer ve jiroskop özelliklerinin dışında sıcaklık bilgisi de vermektedir. Arduino ve benzeri geliştirme kartlarıyla yapılan çeşitli ev ve okul projeleri için idealdir. Uygun fiyatı ve kolay kullanılabilir olması sayesinde en çok kullanılan sensörlerden bir haline gelmiştir. Sadece ev ve okul projelerinde değil, endüstride de kullanılan bir modüldür. I2C protokolü ile haberleşmektedir. Her eksen için 16 bit register ayrılmıştır. (+) ve (-) yönde değer okunabilmektedir. Aynı özelliklere sahip olan MPU6000 SPI ile haberleşmektedir. I2C daha az pin kullandığı için MPU6050 daha popülerdir. 2 modelde piyasadaki neredeyse bütün mikrodenetleyici ve işlemcilerle birlikte kullanılabilir. Datasheetleri => MPU-6050_DataSheet_V3 4 RM-MPU-6000A

GY-521

GY-521, üzerinde MPU6050 bulunan bir modüldür. MPU6050 referans tasarımına göre gerekli devre elemanlarıyla en uygun şekilde çalışması için MPU6050’nin board haline getirilmiş halidir. Kullanıcıya gerekli olan pinleri dışarı verilmiştir. Hem 5V hem de 3.3V ile çalışabilir hale getirilmiştir. Aynı zamanda çalıştığı durumda aktif olan bir LED kart üzerinde mevcuttur. Kart üzerindeki pinler ve açıklamaları şu şekildedir:

VCC => Besleme pinidir. 5V veya 3.3V kullanılabilir.

GND => Toprak pinidir.

SCL => I2C clock pinidir. Kullanmak istediğiniz kartın SCL bacağına bağlayınız.

SDA => I2C data pinidir. Kullanmak istediğiniz kartın SDA bacağına bağlayınız.

XDA => Dışarıdan modüle başka sensör bağlanabilmektedir. Bu sensörün SDA bacağı için kullanılır.

XCL => Dışarıdan bağlanan sensörün SCL bacağı için kullanılır.

AD0 => I2C slave adresi için kullanılır.

INT => Sensör kesme bacağıdır.

REGISTER HARİTASI

Yukarıda verilen datasheet’lerden bir tanesi Register Map dokümanıdır. Burada I2C ile hangi register’dan ne okuyacağımız belirtilmiştir. Burada en önemlileri WHO_AM_I, ivmeölçer ve jiroskop register’ları, GYRO_CONFIG, ACCEL_CONFIG register’larıdır.

WHO_AM_I: Adresi 0x75’tir. Default değeri 0x68’dir. I2C haberleşme için gerekli olan slave adresidir. En düşük değerlikli biti AD0 pinine göre belirlenir. I2C kullanan modüllerin testinde genellikle bu register kullanılır.

ACCEL_?OUT_H ve ACCEL_?OUT_L:  İvmeölçerden okunan değerlerdir. Register adresleri 0x3B ile 0x40 aralığındadır. Burada ? yerine X, Y ve Z eksenleri gelmektedir. H yüksek ağırlıklı[15:8], L ise düşük ağırlıklı[7:0] byte’ı göstermektedir. Bu iki register değerinin yanyana getirilmesiyle gerçek değer elde edilmektedir.

ACCEL_CONFIG: Register adresi 0x1C’dir. İvmeölçerin hassasiyeti ve ölçüm aralığı belirlenir.

GYRO_?OUT_H ve GYRO_?OUT_L:  Jiroskoptan okunan değerlerdir. Register adresleri 0x43 ile 0x48 aralığındadır. Burada ? yerine X, Y ve Z eksenleri gelmektedir. H yüksek ağırlıklı[15:8], L ise düşük ağırlıklı[7:0] byte’ı göstermektedir. Bu iki register değerinin yanyana getirilmesiyle gerçek değer elde edilmektedir.

GYRO_CONFIG: Register adresi 0x1B’dir. Jiroskobun hassasiyeti ve ölçüm aralığı belirlenir.

İVMEÖLÇER HESAPLAMALARI

İvmeölçer register’ları her eksen için 2 adet 8 bitlik olmak üzre toplamda 16 bittir. Hem negatif hem pozitif ölçüm yapabilmektedir. Burada önemli olan register’dan okunan değerleri anlamlı hale getirebilmektir.

Tabloda ACCEL_CONFIG register’ı ile hassasiyeti ve aralığı nasıl ayarlayacağımız gösterilmiştir. Burada aralık arttıkça aynı oranda hassasiyetin azaltığı görülmektedir. AFS_SEL register’ının 0 olması durumunda 16 bit okunan ivmeölçer değerinin 16384’e bölünmesiyle g değeri bulunmaktadır.

İvmeölçerin çalışma mantığı oldukça basittir. Bir kutunun içerisinde bir top olduğunu düşünelim. Bu topun küp içerisindeki duvarlara uyguladığı kuvvete göre ivmeölçer bize ivme değerlerini verecektir. Kutuyu şu şekilde düşünebiliriz:

İvmeölçer sabit durduğunda sadece yerçekimi ivmesinden etkilenmektedir. Bu sayede sabit duran bir ivme sensöründen sensörün yere göre yaptığı açı hesaplanabilir. Örneğin X ekseninde 90 derece küpü döndürürsek bütün kuvvet +X duvarına binecektir. Burası X ekseninde okunacak en büyük değeri bize verecektir. Bizim durumumuzda bu +16384 yapar. Aynı yönde döndürmeye devam edersek 180 derece olduğunda tekrar 0 okunacaktır. Yani aslında bütün değerlerin 2 kere okunduğu durumlar mevcuttur. X ekseni için bu durumlarda Z ekseni farklılık gösterecektir. Örneğin X ekseninde +8000 değerini okunduğu iki durum vardır fakat bu durumlarda Z ekseninden okunan değerler birbirinin negatifi olacaktır. Bu sayede her durum için ivme sensörü farklı sonuçlar verecektir.

İvmeölçerden ölçülen değerin 90 derecede ölçülen değere oranı bize X ekseninde yapılan açının sinüsünü vermektedir. Yani:

sin(αx) = ölçülen g değeri/maksimum ölçülebilen g değeri

olacaktır.

Daha sağlıklı açı hesabı için Euler Açı hesabı kullanılabilir. Bu hesaba göre X ve Y ekseninde yapılan açılar:

Şeklinde olacaktır.

Yerçekimi ivmesinin dışında sensörün hareket ettirilmesi durumundan da ivme sensörü etkilenecektir. Genellikle bu tip sensörlerin içerisinde hem jiroskop hem de ivmeölçer kullanılmasının sebebi iki sensörün birbirini düzeltebilmesi ve bu sayede çok daha sağlıklı değerler okunabilmesidir. İvmeölçer sabit durduğu durumlarda yere göre açıyı ölçebilmektedir fakat sadece eksenlerde yapılan ivme ölçülmek istendiği zaman yerçekimi sıkıntı yaratmaktadır. Bu yüzden jiroskop’tan okunan açı değerine göre ivmeölçerden okunan değer düzeltilip sadece eksenler üzerinde yapılan hareketin ivme değerleri elde edilmektedir.

JİROSKOP HESAPLAMALARI

Jiroskop register’ları her eksen için 2 adet 8 bitlik olmak üzre toplamda 16 bittir. Hem negatif hem pozitif ölçüm yapabilmektedir. Burada önemli olan register’dan okunan değerleri anlamlı hale getirebilmektir.

Tabloda GYRO_CONFIG register’ı ile hassasiyet ve aralığın nasıl ayarlandığı gösterilmiştir. Burada aralık arttıkça hassasiyet azalmaktadır. FS_SEL değerinin 0 olması durumunda ±250 °/s aralığında ölçüm yapılabilmektedir. Ölçülen değerin 131’e bölünmesi ile açısal hız bulunmaktadır. Bazı projelerde açısal hız değeri kullanılsa bile çoğu durumda bu sensörün kullanım amacı sensörün o anki yere göre açısını bulmaktır. İvmeölçer eksen üzerindeki hareketlerden etkilendiği için açı hesaplaması doğru olmamaktadır. Fakat jiroskop sadece dönme hareketinden etkilendiği için bulunan açı değeri gerçeğe daha yakındır. Peki açısal hız yardımıyla açı nasıl bulunabilir?

Bu soru aslında hareket hızı bilinen bir aracın aldığı yol nasıl bulunabilir sorusu ile aynı sayılabilir. Belirli aralıklarla ölçüm yaptığımızı düşünürsek aslında %100 olmasa bile çok yüksek doğrulukta açıyı bulabiliriz.

Yukarıdaki grafik bir hız-zaman grafiğidir. Bu grafiğin altında kalan alan bize alınan yolu vermektedir. Aynı grafiğin açısal hız-açı grafiği olduğunu düşünelim. Belirli aralıklarla hız ölçümleri yapıyoruz. Bu zaman aralığı çok kısa olduğu için ölçümlerin arasında kalan bölgeyi lineer olarak düşünülebilir. Bu durumda alınan yol formülü şu şekilde olacaktır:

Δ° = [(t2-t1)x(y1)]+[((t2-t1)x(y2-y1))/2]

Burada:

Δ° => Taranan açı

t2-t1 => Ölçüm zaman aralığı

y2 => Güncel okunan hız değeri

y1 => Önceki hız değeri

Sistemi ne kadar lineer olarak düşünsek de aslında lineer değildir. Lineere çok yakın bile olsa uzun süreli kullanımda açıda kayma meydana gelecektir. Bunun sebebi her ölçüm yapıldığında alınan yolun bir önceki açı değerine ekleniyor olmasıdır. Aynı zamanda belirlenen aralık dışına çıkıldığında da aynı kayma yaşanacaktır. Burada ivmeölçer devreye girmektedir. İvmeölçerden 0 okunması durumunda yere göre sabit durduğu söylenebilir. Bu durumlarda jiroskobun açı değeri de sıfırlanarak sistem kendi içerisinde bir dengeye sokulmuş olur. Aynı zamanda jiroskoptan ölçülen açı değerine göre ivmeölçerden okunan değer düzeltilip sadece eksenlerde yapılan hareketlerin ivmesi okunan değerden elde edilebilir. Bu sayede iki sensör düzenli olarak birbirini düzeltmiş olur.

SİNYAL İŞLEME

Sensörden ölçülen değerler her zaman gerçeği yansıtmamaktadır. Bunun gibi dijital olarak değer veren (I2C) sensörlerde sayısal işaret işleme kullanılmalıdır. Kalman, median veya hareketli ortalamalar gibi sayısal filtrelerle ölçülen değerler düzeltilmelidir. Özellikle hassas sistemlerde özellikle sensörlerin birbirini etkilediğini düşünürsek bu sıkıntı yaratabilmektedir. Filtreler hakkında daha fazla bilgi alabilmek için filtre yazılarımızı okuyabilirsiniz:

Median Filtre

Kalman Filtresi

Hareketli Ortalamalar Filtresi

 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.