MPU6050 İvmeölçer ve Jiroskop Sensörü
MPU6050, 3 eksenli bir ivmeölçer(accelerometer) ve 3 eksenli bir jiroskop(gyroscope) sensörünü tek bir çipte birleştiren 6 eksenli (6 DoF – üç boyutlu uzayda katı bir cismin altı mekanik hareket serbestliği anlamına gelir) bir hareket sensörüdür. İvmeölçerlerin özellikleri, yapısı ve çalışma prensipleriyle ilgili anlatımlar bir önceki konuda işlendiği için şu anki konuya jiroskop ile başlayacağız.
Jiroskop Nedir?
Açısal hız sensörü olarak da bilinen jiroskop, yönü algılamak ve korumak için kullanılan bir cihazdır. Fiziksel bir nesnenin kendi ekseni etrafındaki açısal hızını ölçen bir sensördür. X(yaw), Y(pitch), Z(roll) eksenlerinde açısal hızları ölçer. Basitçe söylemek gerekirse, bir nesne dönüyorsa, jiroskop bunu algılar. Bu dönüş hareketi, X, Y, Z olmak üzere üç farklı eksende ölçülebilir.
Jiroskopun çalışma prensibi, açısal momentumun korunumu ilkesine dayanır. Açısal momentum prensibini kullanarak dünya eksenine göre yönünü koruyan veya yönündeki değişikliklere direnen mekanik veya elektronik bir cihazdır.
Jiroskop ile İvmeölçer Arasındaki Farklar
Jiroskop ve ivmeölçer, çoğu zaman birlikte çalışsa da ölçtükleri şeyler farklıdır. Bu iki sensörü karıştırmamak, doğru projeler geliştirmek açısından önemlidir.
Jiroskop: Nesnenin dönüşünü ve açısal hızını ölçer.
İvmeölçer: Nesneye uygulanan ivmeyi yani doğrusal hareket bilgisini verir.
Örneğin bir telefonun ne kadar eğildiğini jiroskop söylerken, hareketin hızı ve yönü hakkında bilgi veren ivmeölçerdir. Çoğu akıllı cihazda bu iki sensör bir arada bulunur ve birlikte çalışarak çok daha hassas bir yön tayini yapılmasını sağlar.
Jiroskop Çeşitleri
1. Mekanik Jiroskoplar
Açısal momentumun korunumu ilkesi, hızlı dönen bir diskin, dönüş yönüne göre yapılan dış hareketler, cihazın dönme miktarını ortaya çıkarır. Dönme hareketi prensiplerinden yararlanarak uzaydaki yönlerini korumak üzere tasarlanmış cihazlardır. Dış kuvvetlere maruz kaldıklarında, jiroskoplar, eksenlerinin aniden eğilmek yerine kademeli olarak yön değiştirdiği, presesyon adı verilen bir davranış sergilerler. Bir diğer özelliği ise, aşağıdaki resimlerde görüldüğü gibi, eksenindeki değişikliklere direnen ve pozisyonunu koruyan dönen bir diske sahiptirler. Mekanik jiroskoplar, geleneksel tiptir. Dönen bir disk kullanarak fiziksel dönmeyi algılarlar. Uçaklarda ve denizcilikte hâlâ kullanılır.

Mekanik jiroskoplar Rigidity ve Precession olmak üzere iki prensipte çalışır. Rigiditiy; jiroskobun döndüğü düzlemde sabit bir konumda kalma yeteneğini ifade eder. Yukarıdaki resimlerdeki gibi bir gimbal halkasına monte edilen jiroskop, herhangi bir yönde serbestçe dönebilirken, hızla dönen disk başlangıçtaki düzlemini korur. Precession ise; dönen diske uygulanan kuvvet nedeniyle diskin ekseni etrafında dairesel hareket yapmasına denir.
Örnek video: https://www.youtube.com/watch?v=HmmbOVfHqcg (09:00 -11:00 arası)
Daha spesifik olarak, sadece z eksenindeki hareketleri algılamak için tasarlanmış Resim-A’daki gibi bir jiroskop olduğunu düşünelim. Merkezde dönen bir disk var ve bu disk burulma çubuklarıyla askıya alınmış olsun. Disk hızla dönerken sistem Resim-B’deki gibi z ekseni etrafında döndürülse precession, burulma çubuğunda bir tork oluşturacak ve disk resimdeki gibi eğilecektir. Bu durum ölçekte bir değer gösterecek ve sistemin açısal hızının bilinmesini sağlayacaktır.

Mekanik jiroskopların çalışma prensipleri ve bu prensiplerle ilgili fizik yasalarını detaylı olarak anlatan video linkleri aşağıda belirtilmiştir:
https://www.youtube.com/watch?v=XPUuF_dECVI
https://www.youtube.com/watch?v=V6XSsNAWg00
https://www.youtube.com/watch?v=YiQVna7UTiQ
https://www.youtube.com/watch?v=hVsx4XWafXg&t=79s
2. MEMS(Mikro Elektro Mekanik Sistem) Jiroskoplar
Titreşimli yapılar((vibrating structure)) üzerindeki Coriolis kuvveti ölçülerek açısal hızın(dönüş hızını) belirlendiği jiroskop türüdür. Günümüzde akıllı telefonlardan robotlara kadar hemen her alanda kullanılan, çok küçük boyutlara sahip jiroskoplardır. MEMS jiroskopları, yüksek hızlı dönen bir disk yerine yüksek hızlı titreşimli bir yapı (piezoelektrik) kullanır. Genellikle entegre sensör olarak (örneğin MPU6050 gibi) tasarlanır. MEMS teknolojisi sayesinde, jiroskoplar yalnızca birkaç milimetrekarelik alana sığdırılabilir hale gelmiştir. Bu da onları hem taşınabilir hem de uygun maliyetli kılar. Uygulamalarda kullanacağımız jiroskop MEMS jiroskoplardır ve çalışma prensipleri konunun ileriki kısmında detaylı anlatılacaktır.
3. Fiber Optik Jiroskop (FOG)
Optik fiberlerdeki ışık dalgalarının girişimini kullanarak dönüşü tespit eder; havacılık ve navigasyon alanlarında kullanılır.
4. Halka Lazer Jiroskopu (RLG)
Kapalı bir döngüde lazer ışığı girişimine dayanır ve uçaklarda ve denizaltılarda navigasyon için yüksek doğruluk sunar.
Jiroskop Sensörlerinin Kullanım Alanları
Jiroskop sensörü, yalnızca akıllı cihazlarda değil, birçok alanda kritik işlevler üstlenir. Gelişmiş hareket algılama ve yön kontrolü gerektiren tüm teknolojilerde jiroskoplar yer alır.
Başlıca kullanım alanları:
Akıllı telefonlar ve tabletler: Ekran yönünü belirleme, oyun kontrolleri, kamera dengeleme.
Drone ve insansız hava araçları: Denge sağlama, yön belirleme, oto-pilot sistemleri.
Oyun konsolları: Hareket sensörlü kontrolcüler (örneğin Nintendo Switch).
Sanal gerçeklik (VR) sistemleri: Kafa hareketlerini takip etme.
Araç içi güvenlik sistemleri: Denge kontrolü, ani yön değişikliklerinin algılanması.
Bu alanlar dışında robotik, savunma, spor ekipmanları ve hatta uzay teknolojilerinde bile jiroskop teknolojisi kritik rol oynar.
Coriolis Etkisi(Coriolis Effect)
Coriolis etkisi, basit bir tanımla kendi ekseni etrafında dönen bir sistem (örneğin Dünya ve diğer gezegenler) üzerinde hareket eden cisimlerin yörüngelerinde meydana gelen sapmadır. Diğer bir tanımla coriolis etkisi, bir şey hareket halindeyken onu aynı anda döndürmeye çalıştığınızda ne olduğunu açıklar. Bir dönme dolapta arkadaşınıza top attığınızı hayal edin. Topu düz bir şekilde atmış olsanız bile, dönme dolapla birlikte döndüğünüz için attığınız top kavis çizer. Bu kavis çizme kuvveti "Coriolis Etkisi (Coriolis Effect)"dir.
Coriolis kuvveti; yer çekimi, manyetik kuvvetler veya elektrik kuvvetleri gibi gerçek bir kuvvet değildir. Tıpkı dönen bir sistemde gözlenen ve gerçek olmayan merkezkaç kuvveti gibi. Merkezkaç kuvvet ile Coriolis kuvveti dönen sistemlerde gözlenen kuvvetler oldukları için aralarında benzerlikler ve farklılıklar vardır. Her iki kuvvet de gerçek kuvvetler olmayıp sadece hareketli (dönen) gözlem çerçevesinde gözlenen kuvvetlerdir. Merkezkaç kuvvetin büyüklüğü dönme hızının karesi ile, Coriolis kuvvetinin büyüklüğü ise dönme hızı ile orantılıdır. Ayrıca merkezkaç kuvvet, dönme eksenine olan uzaklığa bağlı iken Coriolis kuvveti cismin hızına bağlıdır.
Coriolis Kuvvetinin Oluşumu

Teknik olarak, bir m kütlesi belirli bir v hızıyla x ekseni yönünde hareket halindeyken, tüm sistemi açısal bir Ωz hızıyla döndürdüğünüzde, Coriolis Etkisi kütleyi orijinal yoluna dik olarak yana doğru iten bir FCoriolis kuvveti oluşturur. Dönme ne kadar güçlü olursa, FCoriolis kuvveti de o kadar güçlü olur.
Bir MEMS jiroskobunda ise durum şöyledir: Minik kütleler sabit bir hızda zıt yönlerde ileri geri titreşir. Titreşen bu sistemi döndürdüğünüzde, Coriolis etkisi her bir kütleyi zıt yönlere doğru iter. Bu, aralarındaki elektriksel özellikleri (kapasitans gibi) değiştirir. Jiroskop, bu değişiklikleri ölçerek açısal dönüş hızını hesaplar.

MEMS(Micro-Electro-Mechanical Systems) Jiroskobun Yapısı ve Çalışması

Görselde MEMS jiroskopunun basite indirgenmiş şekilde çalışma prensibi gösterilmektedir. Yaylar, kütleyi iç çerçeve içinde yerinde tutarak tahrik eksenini oluşturur. İç çerçeve, tahrik eksenine 90° açıyla yerleştirilmiş yaylar kullanılarak dış çerçeveden izole edilerek algılama ekseni oluşturulur. İç çerçevede hareketli, dış çerçevede sabit kapasitör plakaları bulunur. Bu sistemde Coriolis kuvvetini kullanabilmek için sabit doğrusal hıza ihtiyacımız vardır. Bu nedenle aşağıdaki resimdeki gibi kütle sabit bir hızla kırmızı ok yönünde sürekli salınım yapar.

Bu sistem aşağıdaki resimde görüldüğü gibi sağa doğru döndürülmeye başlandığında, Coriolis etkisi, salınım yapan kütlenin/iç çerçevenin, hareket yönüne bağlı olarak(yukarı-aşağı) sola ya da sağa doğru FCoriolis kuvvetinin oluşmasına neden olur. Kütle yukarı çıkarken sola doğru, aşağı inerken sağa doğru bir FCoriolis kuvveti oluşur. Bu durumda kütlenin hareketi artık sadece düz bir hat üzerinde değil, karmaşık bir sapma şeklinde, sağa-sola savrulma hareketi olarak gerçekleşir.
Bu hareket sonucunda kapasitör plakaları arasındaki mesafe değişir ve bu da kapasitans değişimine yol açar. Jiroskopun içindeki algılama bileşenleri bu kapasitans değişimini algılar ve bunu bir elektrik voltaj sinyaline dönüştürür. Bu sinyal, cihazınızın tam olarak ne kadar ve hangi yönde döndüğünü söyler. Bu yöntem kullanılarak açısal hız hesaplanabilir. Yani sistemin ne kadar hızlı (kaç derece/saniye hızla) sağa döndüğü hesaplanır.
Kütle yukarı giderken oluşan FCoriolis kuvveti:

Kütle aşağı giderken oluşan FCoriolis kuvveti:

Bu "yalpalama" hareketi o kadar küçüktür ki (nanometre seviyesinde), bunu ölçebilmek için kapasitör plakalarının çok hassas bir elektronik devreye (ASIC) bağlı olması gerekir.
MEMS jiroskoplar açısal hızları ölçmek için tasarlanmış olmalarına rağmen sistem büyük ivmelere maruz kaldığında doğrulukları tehlikeye girecektir. MEMS jiroskoplarının en büyük zorluğu "drift" (kayma) denilen hatadır. Zamanla küçük ölçüm hataları birikerek yön verisinde sapmaya neden olabilir. Bu yüzden genellikle bir ivmeölçer ile birlikte (IMU ünitesi olarak) kullanılırlar.
Modern bir cihazın (telefon, dron vb.) uzaydaki tam hareketini ve yönelimini anlayabilmesi için bu yapıdan her eksen (x, y ve z) için ayrı birer düzenek bulunur. Genellikle tek bir silikon çip üzerinde, birbirinden farklı yönlere bakan üç adet MEMS jiroskop birimi bir araya getirilir. Her bir jiroskop birimi sadece tek bir eksendeki dönüşü algılayabilir:
X Ekseni (Roll - Yuvarlanma): Cihazın kendi uzun ekseni etrafındaki sağa-sola yatışını ölçer.
Y Ekseni (Pitch - Yunuslama): Cihazın burnunun yukarı veya aşağı hareketini ölçer.
Z Ekseni (Yaw - Sapma): Cihazın bir zemin üzerinde sağa veya sola dönmesini ölçer.
Bu üç sensörün birleştiği yapıya genellikle 3-Eksenli Jiroskop (3-Axis Gyroscope) denir. Eğer bu yapıya 3 eksenli bir ivmeölçer (accelerometer) de eklenirse, ortaya 6 Eksenli IMU (Inertial Measurement Unit) dediğimiz o küçük siyah çipler çıkar.

Tipik Bir MEMS Jiroskobunun Mikro Yapısı ve Çalışması Prensibi

Yapının çalışmasını linkteki videonun 1:33 – 1:46 dakikaları arasından ya da çizimler power point dosyası içerindeki 9. slayttan izleyebilirsiniz.
Link: https://www.youtube.com/watch?v=eqZgxR6eRjo
İvme Ölçer ve Jiroskobun Görev Dağılımı ve Birlikte Kullanımı
MEMS jiroskopları ve ivmeölçerler, tek başlarına eksik bilgi verirken bir araya geldiklerinde birbirlerinin zayıf yönlerini kapatırlar. Bu iki sensörün birleşimiyle oluşan sisteme IMU (Inertial Measurement Unit - Ataletsel Ölçüm Birimi) denir.
Sensörlerin Görev Dağılımı
İvmeölçer (Statik Referans): Yerçekimi ivmesini (g = 9.81 m/s2) kullanarak cihazın yere göre hangi açıda durduğunu (eğimini) belirler. Cihaz sabitken çok güvenilirdir ancak hareket halindeki sarsıntılardan (gürültüden) çok etkilenir.
Jiroskop (Dinamik Referans): Cihazın ne kadar hızlı döndüğünü ölçer. Hızlı hareketlerde çok hassastır ancak zamanla "sürüklenme" (drift) denilen bir hata biriktirir.
Neden Biri Yetmez? (Zayıf Yönler)
Sensör Füzyonu (Sensor Fusion)
Bu iki sensörden gelen veriler, Kalman Filtresi veya Tamamlayıcı Filtre (Complementary Filter) adı verilen matematiksel algoritmalarla birleştirilir.
Süreç şu şekilde işler:
Kısa Vadeli Karar: Hızlı bir hareket olduğunda sistem jiroskoba güvenir çünkü jiroskop ani tepkileri en iyi ölçen sensördür.
Uzun Vadeli Düzeltme: Hareket durduğunda veya yavaşladığında sistem ivmeölçere bakar. İvmeölçer, "Yerçekimi hala aşağıyı gösteriyor, jiroskopun biriktirdiği hatayı sıfırlayalım," diyerek sistemi kalibre eder.
Sonuç: 6-Eksenli Yönelim
Bu iki sensör üçer eksende (X, Y, Z) veri sağladığında toplam 6 serbestlik derecesi (6-DOF) elde edilir.
İvmeölçer: Ax, Ay, Az
Jiroskop: Gx, Gy, Gz
Bu veriler birleştiğinde, cihazın uzaydaki Roll (Yuvarlanma) ve Pitch (Yunuslama) açıları hatasız bir şekilde hesaplanır.
Önemli Not: Tam bir navigasyon için genellikle bu sisteme bir de Manyetometre (Pusula) eklenir. İvmeölçer "aşağıyı" bilirken, manyetometre "kuzeyi" gösterir ve böylece cihazın dünya üzerindeki tam yönelimi (Yaw/Sapma açısı dâhil) çözülmüş olur.
MPU6050 İvmeölçer ve Jiroskop Sensörünün Yapısı ve Çalışması

MPU6050 sensör modülü, 6 eksenli hareket izleme cihazıdır. Modülün kalbinde, MPU6050 adı verilen düşük güç tüketimli, düşük maliyetli 6 eksenli Hareket İzleme çipi bulunur. Bu çip, 3 eksenli jiroskopu (dönmeyi ölçmek için), 3 eksenli ivmeölçeri (ivmeyi ölçmek için) ve Dijital Hareket İşlemcisini (DMP) tek bir küçük 4 mm x 4 mm'lik pakette birleştirir. Modül, üç eksen etrafındaki dönüşü algılayabilirken, hem yerçekiminden kaynaklanan statik ivmeyi hem de hareket, şok veya titreşimden kaynaklanan dinamik ivmeyi de ölçebilir.
Bu modül, dahili bir LD3985 voltaj regülatörü ile birlikte gelir. Bu nedenle sensöre zarar verme endişesi duymadan Arduino gibi 5V mikro denetleyicilere güvenle bağlayabilirsiniz. MPU6050'nin en iyi özelliklerinden biri düşük güç tüketimidir. Aktif ölçümler sırasında 3,6 mA'den daha az akım kullanır ve boştayken yalnızca 5 μA kullanır. Bu da onu giyilebilir cihazlar veya robotlar gibi pille çalışan cihazlar için mükemmel kılar. Ayrıca, modülün açık olduğunu gösteren bir güç LED'i de bulunmaktadır.
İvmenin Ölçülmesi
MPU6050, Mikro Elektro Mekanik (MEMS) teknolojisine sahip 3 eksenli bir ivmeölçer içerir. İvmeölçer, nesnenin hızındaki değişimi ölçer. Bunu, yerçekimi (9,8 m/s²) gibi statik kuvvetleri veya titreşimler ve hareketler gibi dinamik kuvvetleri algılayarak yapar. İvmeölçer, X, Y ve Z eksenleri boyunca eğim veya meyil açısını tespit etmek için kullanılır. ±2g, ±4g, ±8g ve ±16g olmak üzere dört programlanabilir tam ölçek aralığında ivmeyi ölçebilir. ±2g gibi daha düşük aralıklar, küçük hareketler için daha hassas ölçümler sağlarken, ±16g gibi daha yüksek aralıklar daha yoğun kuvvetleri ölçmenize olanak tanır. MPU6050, X, Y ve Z eksenleri boyunca ivmeyi eş zamanlı olarak ölçmek için üç adet özel 16 bit analog-dijital dönüştürücüye sahiptir. Cihaz düz bir yüzeye yerleştirildiğinde X ve Y eksenlerinde 0g, Z ekseninde ise +1g ölçüm yapacaktır.
Dönmenin Ölçülmesi
MPU6050, Mikro Elektro Mekanik Sistem (MEMS) teknolojisine sahip 3 eksenli bir jiroskoptan oluşmaktadır. X, Y ve Z eksenleri boyunca dönme hızını tespit etmek için kullanılır. Titreşimli yapılar((vibrating structure)) üzerindeki Coriolis kuvveti ölçülerek açısal hız(dönüş hızını) ölçülür. Ölçüm sonucu elde edilen sinyal yükseltilir, demodüle edilir ve açısal hıza orantılı bir voltaj üretmek için filtrelenir. Modül, her eksen boyunca açısal hızı derece/saniye biriminde ölçer.
MPU6050, programlanabilir dört tam ölçekli aralıkta açısal dönüşü ölçebilir. Bunlar: ±250°/s, ±500°/s, ±1000°/s ve ±2000°/s’dir. Çip ayrıca, üç eksen boyunca dönüşü aynı anda örneklemek için üç adet ilave 16 bit analog-dijital dönüştürücüye sahiptir. Sensörün ölçüm alma sıklığını saniyede 3,9 örnekten saniyede 8000 örneğe kadar ayarlayabilirsiniz.
Her iki sensörden gelen bilgileri birleştirerek sensörün yönelimi hakkında daha doğru bilgiler elde edebiliriz.
Sıcaklık Ölçümü
MPU6050, -40°C ile 85°C arasındaki sıcaklıkları yaklaşık ±1°C doğrulukla ölçebilen bir sıcaklık sensörü içerir. Unutmayın ki bu sıcaklık sensörü ortam sıcaklığını değil, silikon çipin kendi sıcaklığını ölçer. Çipin sıcaklığı okumaların doğruluğunu etkilediği için, MPU6050 bu bilgiyi hesaplamalarını otomatik olarak ayarlamak ve doğruluğu korumak için kullanır.
DMP (Digital Motion Processor - Dijital Hareket İşlemcisi)
Gömülü Dijital Hareket İşlemcisi (DMP), hareket işleme algoritmalarını hesaplamak için kullanılır. Jiroskop, ivmeölçer ve manyetometre gibi ek üçüncü taraf sensörlerden veri alır ve bu verileri işler. Yuvarlanma, eğim, sapma açıları, yatay ve dikey algılama gibi hareket verileri sağlar. Hareket verilerinin hesaplanmasında ana bilgisayarın işlem yükünü en aza indirir. Elde edilen veriler DMP kayıtlarından okunabilir. DMP, modülün harici pinlerinden birine erişebilir ve bu pin kesme sinyalleri oluşturmak için kullanılabilir.
I2C Arayüzü
MPU6050, Arduino ile I2C ara yüzü üzerinden iletişim kurar. I2C, seri veri (SDA) ve seri saat (SCL) sinyallerinden oluşan iki telli bir arayüzdür. SDA ve SCL hatları genellikle VDD'ye çekme dirençlerine ihtiyaç duyar. Maksimum veri yolu hızı 400 kHz'dir.
Modülün 7 bitten oluşan iki farklı slave adresi vardır. Bu adres b110100X’dir. X’in 1 ya da 0 olma durumuna göre slave adres 0x68 veya 0x69 olur. Modülün iki ayrı slave adresinin olması, aynı I2C veri yoluna iki MPU6050 modülü bağlamak istediğinizde veya başka bir sensör zaten bu adreslerden birini kullanıyorsa faydalıdır. Modül herhangi bir mikro denetleyici ile iletişim kurarken her zaman köle (slave) olarak davranır.
7 bitlik slave adresin en düşük anlamlı biti (LSB) yani X, AD0 pinindeki mantık seviyesi tarafından belirlenir. Modül üzerindeki AD0 pini, hangi I2C adresinin kullanılacağını belirler. Bu pini LOW konumuna çekmek adresi 0x68 (b1101000) yaparken, HIGH konumuna çekmek adresi 0x69 (b1101001) yapar. Ancak, pin zaten yerleşik 4,7 kΩ'luk bir pull-down direnci aracılığıyla toprağa bağlı olduğundan, bağlantısız bırakmak adresi varsayılan olarak 0x68'e ayarlar. 0x69 adresine geçmek istiyorsanız, AD0 pinini YÜKSEK konuma çekmeniz yeterlidir.
Yardımcı I2C Arayüzü
MPU6050, ek sensörleri doğrudan MPU6050 modülüne bağlamak için yardımcı bir I2C veri yoluna sahiptir. Bu yardımcı veri yoluna XDA ve XCL pinleri üzerinden erişilir. MPU-6050, harici 3 eksenli dijital çıkışlı manyetometre veya diğer sensörlerle iletişim kurmak için yardımcı I2C veri yolunu kullanabilir. Bu yardımcı veri yolunun iki çalışma modu vardır:
I2C Ana Modu: MPU-6050, yardımcı I2C veri yoluna bağlı herhangi bir harici sensör için ana cihaz görevi görür. MPU-6050'nin manyetometre gibi harici dijital sensörlerin veri kayıtlarına doğrudan erişmesini sağlar. Bu modda, MPU-6050 yardımcı sensörlerden doğrudan veri alır ve çip üzerindeki DMP'nin mikro denetleyicinin müdahalesi olmadan sensör füzyon verileri oluşturmasına olanak tanır.
Geçiş Modu: MPU-6050, birincil ve yardımcı I2C veri yollarını doğrudan birbirine bağlayarak, mikro denetleyicinin master görevi görerek herhangi bir harici sensörle doğrudan iletişim kurmasını sağlar. Geçiş Modu, harici sensörleri yapılandırmak veya yalnızca harici sensörler kullanıldığında MPU-6050'nin düşük güç modunda tutulması için kullanışlıdır. Geçiş Modunda, mikro denetleyici yine de I2C ara yüzü aracılığıyla MPU-6050 verilerine erişebilir.
Yardımcı I2C ara yüzü genellikle, üç eksen boyunca manyetik alanları ölçen bir manyetometre eklemek için kullanılır. MPU6050 tek başına 6 Serbestlik Derecesi (DOF) sağlar; üçü ivmeölçerden, üçü jiroskoptan gelir. Bir manyetometre eklendiğinde, bu 9 DOF'a yükselir ve projenize uzaydaki konumu ve yönelimi hakkında çok daha ayrıntılı bilgi sağlar.
MPU6050’nin Teknik Özellikleri
Çalışma Gerilimi : 5V (tipik)
Mutlak Maksimum İvme : 10.000 g’ye kadar
Haberleşme Arayüzü : I2C maksimum 400 kHz
Boyutlar : 20.3mm X 15.6mm
16 bit Analog Digital Converter : 3 eksenli jiroskop ve 3 eksenli ivmeölçer’in her bir ekseni için 16 bit ADC bulunur. Eksenlerden ölçülen değeri dijital değere dönüştürür.
Low Pass Filter (Alçak Geçiren Filtre) : 5 – 260Hz. Yüksek frekanslı gürültüyü ortadan kaldırarak sinyali yumuşatmaya yardımcı olur.
MPU6050’nin Pin Özellikleri
VCC :Güç kaynağı pinidir. Bunu Arduino'daki 5V pinine bağlayabilirsiniz.
GND :Toprak pinidir. Bunu Arduino'nun GND pinine bağlayabilirsiniz.
SCL : I2C ara yüzü için kullanılan clock sinyali pinidir. Mikro denetleyicinin SCL pinine bağlanır. Arduino’da ise A5 pinine bağlanabilir.
SDA : I2C ara yüzü için seri veri pinidir. Mikro denetleyicinin SDA pinine bağlanır. Arduino’da ise A4 pinine bağlanabilir.
XDA :Yardımcı I2C ara yüzü için seri veri pinidir. Manyetometre gibi harici I2C sensörlerini MPU6050’ye bağlamak için kullanılır. Harici I2C sensörlerinin SDA pini bu pine bağlanır.
XCL :Yardımcı I2C ara yüzü için clock sinyali pinidir. Harici I2C sensörlerinin SCL pini bu pine bağlanır.
AD0 :Yukarıdaki konuda anlatıldığı üzere, modülün iki ayrı slave adresinden birinin seçilmesini sağlayan pindir. Bu adresler 0x68 veya 0x69’dur. Bu pini LOW konumuna çekmek adresi 0x68 (b1101000) yaparken, HIGH konumuna çekmek adresi 0x69 (b1101001) yapar. Ancak, pin zaten yerleşik 4,7 kΩ'luk bir pull-down direnci aracılığıyla toprağa bağlı olduğundan, bağlantısız bırakmak adresi varsayılan olarak 0x68'e ayarlar.
INT :Kesme çıkış pinidir. MPU6050'nin hareketler, dokunma, sallanma, kaydırma, yakınlaştırma veya gezinme gibi belirli olayları algıladığında bir kesme tetiklemesini sağlar.

MPU6050 modülünün daha gelişmiş modeli olan MPU9250 modülünde, 3 eksenli ivmeölçer, 3 eksenli jiroskop ve 3 eksenli manyetometre tek bir pakette yer almaktadır. İletişim metodu I2C ve SPI’dır. Fiyatı daha pahalıdır.
MPU6050 Modülünün Arduino İle Bağlantısı

Kütüphanelerin İndirilmesi ve Komutların Kullanımı
MPU6050 modülünü kullanabilmek için farklı kütüphaneler yer almaktadır. Uygulamalarımızda 2 farklı kütüphane kullanacağız. Bu kütüphanelerin ilkinin içerisinde 3 farklı kütüphane yer alırken ikincisinin içerisinde tek kütüphane yer almaktadır.
1. Adafruit tarafından geliştirilen “Adafruit MPU6050” kütüphanesidir. Bu kütüphaneyi kullanmak için ayrıca “Adafruit Unified Sensor” kütüphanesini ve “Adafruit Bus IO” kütüphanesini de yüklemeniz gerekmektedir. Bu kütüphaneleri Arduino kütüphane yöneticisinde arama bölümüne yazarak aşağıdaki resimlerde gösterildiği gibi bulabilir ve yükleyebiliriz. Ayrıca klasör içerisine de bu kütüphaneler indirilmiştir.
Adafruit MPU6050

Adafruit Unified Sensor

Adafruit Bus IO

Adafruit Kütüphanesi Arduino Komutları
Uygulamanın başında aşağıdaki kütüphaneler programa dâhil edilir:
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
1. Adafruit_MPU6050 mpu;
"mpu" adlı bir nesne oluşturur. Bu nesne, MPU6050'yi kontrol etmek ve ondan veri okumak için ihtiyaç duyduğumuz tüm işlevlere erişmemizi sağlar.
2. mpu.begin();
Sensörü başlatır. 1 değeri döndürür. Sensörün başlayıp başlamadığını teyit etmek için aşağıda yer alan kısa fonksiyonu yazıyoruz. Sensör düzgün bağlanmamışsa veya bir sorun oluşursa, çipin bulunamadığını belirten bir mesaj yazdırıyoruz ve program sonsuz bir döngüde orada duruyor. Ancak her şey yolunda giderse, hazır olduğunu belirtmek için "MPU6050 Bulundu!" mesajını yazdırıyoruz.
if (!mpu.begin())
{
Serial.println("Failed to find MPU6050 chip");
while (1)
{
delay(10);
}
}
Serial.println("MPU6050 Found!");
3. mpu.setAccelerometerRange(ölçüm_aralığı);
İvmeölçerin ölçüm aralığını belirlememizi sağlar. “ölçüm_aralığı” değişkeni aşağıdaki değerleri alabilir:
MPU6050_RANGE_2_G : ±2g aralığı (varsayılan)
MPU6050_RANGE_4_G : ±4 g aralığı
MPU6050_RANGE_8_G : ±8g aralığı
MPU6050_RANGE_16_G : ±16g aralığı
4. mpu.setGyroRange(ölçüm_aralığı);
Jiroskobun ölçüm aralığını belirlememizi sağlar. Bu aralık sensörün algılayabileceği maksimum dönüş hızını belirler. “ölçüm_aralığı” değişkeni aşağıdaki değerleri alabilir:
MPU6050_RANGE_250_DEG : saniyede 250 derece aralığı (varsayılan)
MPU6050_RANGE_500_DEG : saniyede 500 derece aralığı
MPU6050_RANGE_1000_DEG : saniyede 1000 derece aralığı
MPU6050_RANGE_2000_DEG : saniyede 2000 derece aralığı
5. mpu.setFilterBandwidth(bant_genişliği);
Yüksek frekanslı gürültüyü ortadan kaldırarak sinyali yumuşatmaya yardımcı olan Dijital Alçak Geçiş Filtresinin bant genişliğini ayarlar. Bu fonksiyon aşağıdaki değerleri alabilir:
MPU6050_BAND_260_HZ : 260 Hz bant genişliği (bu, filtreyi devre dışı bırakır)
MPU6050_BAND_184_HZ : 184 Hz bant genişliği
MPU6050_BAND_94_HZ : 94 Hz bant genişliği
MPU6050_BAND_44_HZ : 44 Hz bant genişliği
MPU6050_BAND_21_HZ : 21 Hz bant genişliği
MPU6050_BAND_10_HZ : 10 Hz bant genişliği
MPU6050_BAND_5_HZ : 5 Hz bant genişliği
NOT: Ölçüm aralığı, MPU6050 cihazınızın okuyabileceği maksimum ivme veya açısal hızdır. Ne ölçmeye çalıştığınızı düşünün ve buna göre sınırlar belirleyin.
6. sensors_event_t ivmeolcer, jiroskop, sicaklik;
Bu komut MPU6050 modülünden aldığı ivmeölçer, jiroskop ve sıcaklık verilerini tanımladığımız değişkenlere atar.
“sensor_event_t” komutu birçok farklı sensör verisini tek bir yerde tutmak için tasarlanmış özel bir yapı türüdür. Tüm verileri tek bir 'sensors_event_t' türüne indirgeyerek ve her sensör ailesi için belirli, standartlaştırılmış SI birimlerini belirleyerek, aynı sensör tipleri diğer benzer sensörlerle karşılaştırılabilir değerler döndürür. Bu, sistemin geri kalanını çok az etkileyerek sensör modelleri arasında geçiş yapmanızı sağlar; bu da sensör bulunabilirliği ve kod tekrar kullanımıyla ilgili bazı riskleri ve sorunları azaltmaya yardımcı olabilir.
7. mpu.getEvent(&ivmeolcer, &jiroskop, &sicaklik);
Bu fonksiyon sensörden yeni bir değer kümesi okur. Bunları uygun birimlere dönüştürür ve değişkenlere kaydeder.
8. İvmeölçer, jiroskop ve sıcaklık değerlerini değişkenlere atama:
ivmeölçer_x = ivmeolcer.acceleration.x; :İvmeölçer X değeri (m/s2)
ivmeölçer_y = ivmeolcer.acceleration.y; :İvmeölçer Y değeri (m/s2)
ivmeölçer_z = ivmeolcer.acceleration.z; :İvmeölçer Z değeri (m/s2)
jiroskop_x = jiroskop.gyro.x; :Jiroskop X değeri (rad/sn)
jiroskop_y = jiroskop.gyro.y; :Jiroskop Y değeri (rad/sn)
jiroskop_z = jiroskop.gyro.z; :Jiroskop Z değeri (rad/sn)
sicaklik_degeri = sicaklik.temperature; :Sıcaklık değeri (⁰С)
2. Jarzebski tarafından geliştirilen “MPU6050.h” kütüphanesidir. Bu kütüphaneyi Arduino kütüphane yöneticisinde arama bölümüne yazıp bulamadık fakat https://github.com/jarzebski/Arduino-MPU6050 linkinden indirebilirsiniz. Ayrıca bu kütüphane dosyası klasör içerine indirilmiştir. Bu kütüphane ile ilgili uygulama yapılmamıştır. Aşağıdaki linklerde bu kütüphanenin kullanımı ile ilgili bilgiler yer almaktadır:
MPU6050 Modülünün Kütüphanesiz Kontrolü
MPU6050 modülünü kütüphane kullanmadan I2C iletişim ile doğrudan kontrol edebiliriz. Bunun için modülün register’larına erişmemiz gerekmektedir. Böylelikle gerekli ayarları yapıp ivmeölçer, jiroskop ve sıcaklık verileri alabiliriz. Bunun yanında kesme ayarları, harici ek sensör kontrolü vb. birçok ayar yine register’lara erişerek yapılabilir.
1. Register 117 – Who Am I
Bu register, modülün slave adresini tutan register’dır. Bu slave adresler 0x68 ve 0x69’dur. Register’daki Bit0’ın durumunu değiştirerek modülün slave adresini değiştirebiliriz. Ancak Bit0’ın durumunu buradan değil modülün AD0 pininden değiştirebiliriz. Bu pini LOW konumuna çekmek adresi 0x68 (b1101000) yaparken, HIGH konumuna çekmek adresi 0x69 (b1101001) yapar. Modülün slave adresi varsayılan olarak 0x68’dir.
2. Register 27 – Gyroscope Configuration
Bu register jiroskobun kendi kendini test etmesini ve jiroskobun ölçek aralığını belirlememizi sağlar. Ölçek ayarı varsayılan olarak ±250 deg/sn’dir. FS_SEL, aşağıdaki tabloya göre jiroskop çıkışlarının tam ölçek aralığını seçer:

Örnek:
Wire.beginTransmission(0x68); //0x68 slave adresli modül ile iletişime başla.
Wire.write(0x1B); //0x1B adresli register’a git.
Wire.write(0x10); //Register içeriğini 00010000 yap. Ölçek ayarı ±1000deg/s olsun.
3. Register 28 – Accelerometer Configuration
Bu register ivmeölçerin kendi kendini test etmesini, jiroskobun ölçek aralığını belirlememizi ve Yüksek Geçiş Filtresini (DHPF) yapılandırmamızı sağlar. Ölçek ayarı varsayılan olarak ±2g’dir. AFS_SEL, ivmeölçer çıkışlarının tam ölçek aralığını aşağıdaki tabloya göre seçer.
Örnek:
Wire.beginTransmission(0x68); //0x68 slave adresli modül ile iletişime başla.
Wire.write(0x1C); //0x1C adresli register’a git.
Wire.write(0x10); //Register içeriğini 00010000 yap. Ölçek ayarı ±8g olsun.
Register 107-Power Management 1

Bu register, kullanıcının güç modunu ve saat kaynağını yapılandırmasına olanak tanır. Ayrıca, tüm cihazı sıfırlar ve sıcaklık sensörünü devre dışı bırakır. MPU6050, saat kaynağı olarak dahili 8MHz osilatör, jiroskop tabanlı saat veya harici kaynaklar seçilebilir. Cihaz açıldığında, MPU6050'nin saat kaynağı varsayılan olarak dahili 8MHz osilatöre ayarlanır. Saat kaynağı aşağıdaki tabloya göre seçilebilir.

Örnek:
Wire.beginTransmission(0x68); //0x68 slave adresli modül ile iletişime başla.
Wire.write(0x6B); //0x6B adresli register’a git.
Wire.write(0x00); //Register’ın içeriğini 0 yap. Register sıfırlansın.
5. Registers 67 to 72 – Gyroscope Measurements

Bu register, en son jiroskop ölçümlerini saklar. Jiroskop ölçümleri, 25 numaralı register’da tanımlanan Örnekleme Hızı'nda bu register’a yazılır. Bu jiroskop ölçüm kayıtları: ivmeölçer ölçüm kayıtları, sıcaklık ölçüm kayıtları ve harici sensör veri kayıtlarını içerir.
Örnek:
Wire.beginTransmission(0x68); //0x68 slave adresli modül ile iletişime başla.
Wire.write(0x43); //0x43 adresli register’a git.
Wire.endTransmission(false); //Modül ile olan iletişimi durdurma, iletişime devam et ve Wire.write() ile belirtilen 0x43 adresli register’a gidilmesini onayla.
Wire.requestFrom(0x68, 6, true); //0x68 slave adresli modülün 0x43 adresinden itibaren sıralı olarak 6 baytlık veri iste. (true)İstekten sonra veri yolunu serbest bırak.
GyroX = Wire.read() << 8 | Wire.read(); //1 bayt veri oku. 8 bit sola kaydır. Sonra 1 bayt veri daha oku. İlk okunan 1 bayt veri ile “veya” işlemine tabi tut ve sonucu GyroX değişkenine ata.
GyroY = Wire.read() << 8 | Wire.read(); //1 bayt veri oku. 8 bit sola kaydır. Sonra 1 bayt veri daha oku. İlk okunan 1 bayt veri ile “veya” işlemine tabi tut ve sonucu GyroY değişkenine ata.
GyroZ = Wire.read() << 8 | Wire.read(); //1 bayt veri oku. 8 bit sola kaydır. Sonra 1 bayt veri daha oku. İlk okunan 1 bayt veri ile “veya” işlemine tabi tut ve sonucu GyroZ değişkenine ata.
NOT: Wire.endTransmission(false); komutu sensörle iletişime devam edilmesi ve iletişim kesilmeden sıralı olarak register’lardan veri okunması için kullanıldı. Aynı zamanda, Arduino'da Wire.write(); komutunu kullanıldığında, veri o an kablodan dışarı çıkmaz. Sadece Arduino'nun içindeki bir tampon belleğe (buffer) yazılır. Verinin gerçekten sensöre iletilmesi ancak Wire.endTransmission(); komutu çağrıldığında gerçekleşir. Eğer endTransmission komutu requestFromdan önce çağrılmazsa, MPU6050'nin dahili işaretçisi (pointer) Wire.write(); ile belirlenen adrese konumlanmaz. Bu da sensörün istenilen verilerin yerine, hafızasındaki alakasız veya rastgele verileri göndermesine neden olur.
Her ölçüm için hassasiyet tablosu aşağıda verilmiştir:

“Gyroscope Configuration” kayıtçısında ölçüm aralığının ±250’ye ayarlandığını varsayarsak:
GyroX_deger=GyroX/131, GyroY_deger=GyroY/131, GyroZ_deger=GyroZ / 131.
olur.
6. Registers 59 to 64 – Accelerometer Measurements

Bu register, en son ivmeölçer ölçümlerini saklar. İvmeölçer ölçümleri, 25 numaralı register’da tanımlanan Örnekleme Hızı'nda bu register’a yazılır. Bu ivmeölçer ölçüm kayıtları: sıcaklık ölçüm kayıtları, jiroskop ölçüm kayıtları ve harici sensör veri kayıtlarını içerir.
Örnek:
Wire.beginTransmission(0x68); //0x68 slave adresli modül ile iletişime başla.
Wire.write(0x3B); //0x3B adresli register’a git.
Wire.endTransmission(false); //Modül ile olan iletişimi durdurma, iletişime devam et ve Wire.write() ile belirtilen 0x3B adresli register’a gidilmesini onayla.
Wire.requestFrom(0x68, 6, true); //0x68 slave adresli modülün 0x3B adresinden itibaren sıralı olarak 6 baytlık veri iste. (true)İstekten sonra veri yolunu serbest bırak.
AccX = Wire.read() << 8 | Wire.read(); //1 bayt veri oku. 8 bit sola kaydır. Sonra 1 bayt veri daha oku. İlk okunan 1 bayt veri ile “veya” işlemine tabi tut ve sonucu AccX değişkenine ata.
AccY = Wire.read() << 8 | Wire.read(); //1 bayt veri oku. 8 bit sola kaydır. Sonra 1 bayt veri daha oku. İlk okunan 1 bayt veri ile “veya” işlemine tabi tut ve sonucu AccY değişkenine ata.
AccZ = Wire.read() << 8 | Wire.read(); //1 bayt veri oku. 8 bit sola kaydır. Sonra 1 bayt veri daha oku. İlk okunan 1 bayt veri ile “veya” işlemine tabi tut ve sonucu AccZ değişkenine ata.
Her ölçüm için hassasiyet tablosu aşağıda verilmiştir:

“Accelerometer Configuration” kayıtçısında ölçüm aralığının ±2g olarak ayarlandığını varsayarsak:
AccX_deger= AccX/16384, AccY_deger= AccY/16384, AccZ_deger= AccZ/16384.
olur.
Registers 65 and 66 – Temperature Measurement

Bu register, modül çipinin en son sıcaklık sensörü ölçümünü saklar. Sıcaklık ölçümleri, 25 numaralı register’da tanımlanan Örnekleme Hızı'nda bu kayıtlara yazılır. Bu sıcaklık ölçüm kayıtları: ivmeölçer ölçüm kayıtları, jiroskop ölçüm kayıtları ve harici sensör veri kayıtlarını içerir.
Örnek:
Wire.beginTransmission(0x68); //0x68 slave adresli modül ile iletişime başla.
Wire.write(0x41); //0x41 adresli register’a git.
Wire.endTransmission(false); //Modül ile olan iletişimi durdurma, iletişime devam et ve Wire.write() ile belirtilen 0x41 adresli register’a gidilmesini onayla.
Wire.requestFrom(0x68, 2, true); //0x68 slave adresli modülün 0x41 adresinden itibaren sıralı olarak 2 baytlık veri iste. (true)İstekten sonra veri yolunu serbest bırak.
Temp = Wire.read() << 8 | Wire.read(); //1 bayt veri oku. 8 bit sola kaydır. Sonra 1 bayt veri daha oku. İlk okunan 1 bayt veri ile “veya” işlemine tabi tut ve sonucu Temp değişkenine ata.
Sıcaklık (⁰С) = [Temp(işaretli sayı olarak)] / 340 + 36,53.
8. Register 25 – Sample Rate Divider

Örnekleme Hızı Bölücü register’ıdır. Örnekleme hızı, jiroskop çıkış hızının SMPLRT_DIV'e bölünmesiyle oluşturulur:
Örnekleme Hızı = Jiroskop Çıkış Hızı / (1 + SMPLRT_DIV)
Burada Jiroskop Çıkış Hızı, 26. Register’daki Dijital Alçak Geçiş Filtresi (DLPF) devre dışı bırakıldığında (DLPF_CFG = 0) 8 kHz ve DLPF etkinleştirildiğinde 1 kHz'dir. İvmeölçer çıkış hızı ise 26. Register’da görüldüğü üzere 1 kHz'dir. SMPLRT_DIV[7:0] işaretsiz 8 bitlik tam sayı değerini ifade eder (0 ile 255 arası).
9. Register 26 – Configuration

Bu kayıtçı, hem jiroskoplar hem de ivmeölçerler için harici Çerçeve Senkronizasyonu (FSYNC) pini örneklemesini ve Dijital Alçak Geçiş Filtresi (DLPF) ayarını yapılandırır. DLPF, DLPF_CFG ile yapılandırılır. İvmeölçer ve jiroskop, aşağıdaki tabloda gösterildiği gibi DLPF_CFG değerine göre filtrelenir.

Örnek:
Wire.beginTransmission(0x68); //0x68 slave adresli modül ile iletişime başla.
Wire.write(0x1A); //0x1A adresli register’a git.
Wire.write(0x02); //Register içeriğini 00000010 yap. İvmeölçer band genişliği 94 Hz ve jiroskop bant genişliği 98 Hz olsun.
MPU6050 Sensörü İle Açı Hesabı
İvmeölçer İle Açı Hesabı
“ADXL335 İvmeölçer Kullanımı” konumuzda yandaki matematiksel model ile açı hesabı yapmıştık. Bu teorik olarak tamamen doğrudur. Fakat bu yöntem pratikte, robotik ve stabilizasyon projelerinde genellikle tercih edilmez. Çünkü:
Hassasiyet Kaybı: İvmeölçer verileri gürültülüdür. Sadece bu formülleri kullanırsak, sensör en ufak bir titreşimde (örneğin bir motor çalıştığında) R değerini değiştireceği için açıların çok fazla "zıpladığını" görürüz.
Yön Belirsizliği: cos fonksiyonu 0° ile 180° arasında değer üretir. Ancak biz genellikle bir uçağın burnunun yukarı mı (+) yoksa aşağı mı (-) baktığını, yani -90° ile +90° arasındaki farkı anlamak isteriz.

Bu ve benzeri nedenlerden dolayı, Yaw(Z ekseni) doğrultusunda yer alan yer çekimi vektörü ile Roll(X ekseni) ve Pitch(Y ekseni)’in yaptığı açıları hesapladığımız aşağıdaki formülleri kullanırız. Bu formüller, üstteki resimdeki açı hesabı mantığının daha optimize edilmiş, daha kararlı ve "yön duyarlı" (yukarı/aşağı ayrımı yapabilen) versiyonudur. Kod yazarken atan2 fonksiyonunu kullanmak bizi "yön tayini" zahmetinden kurtaracaktır. İvmeölçerden okunan ham veriler, hassasiyet çarpanına (AFS_SEL) bölünerek "Yerçekimi İvmesi" (g) cinsine çevrilir ve aşağıdaki formüllerle Roll ve Pitch hesaplanır.

Pratikte ivmeölçer ile Yaw(Z ekseni) açısı hesaplanamaz. Bunun nedeni ADXL335 ve MPU6050 gibi 3 ve 6 eksenli sensörlerin en büyük "eksiği" veya teknik limitidir. Açı hesaplarken sensörün bir referans noktasına ihtiyacı vardır. Roll ve Pitch yerçekimi vektörüne 90º iken, Yaw ise yerçekimi vektörü doğrultusundadır. Yukarıdaki resimde uçağın Z ekseni etrafında dönmesi ivmeölçer tarafından algılanmaz.
İvmeölçer ile açıların bu şekilde hesaplanması cihaz hareket etmiyorken (statik durumda) çok doğrudur ancak titreşimlerden çok etkilenir. Eğer hassas bir dengeleme robotu veya drone yapıyorsanız sadece ivmeölçer kullanırsanız robot titrer.
NOT: “ADXL335 İvmeölçer Kullanımı” konumuzda açı hesabı yaparken, Rx, Ry ve Rz eksen değerlerini “g” yerçekimi ivmesi türüne dönüştürmeden açı hesabı yapmıştık. Sonuç matematiksel olarak doğru çıkar. Eğer amaç sadece açı değerine ulaşmaksa, ham değerleri doğrudan formüle koymak sonucu değiştirmez. Ancak kodun okunabilirliği ve jiroskopla uyumlu olması için birim dönüştürmesi yapmak daha uygundur.
Jiroskop İle Açı Hesabı
Jiroskop, ivmeölçerden farklı olarak doğrudan bir "eğim açısı" vermez. Jiroskop, açısal hızı (angular velocity) ölçer. Yani cihazın o an hangi eksende, saniyede kaç derece hızla döndüğünü söyler. Bu hız verisinden açıya ulaşmak için jiroskoptan okunan ham veri, hassasiyet çarpanına (FS_SEL) bölünerek "Derece/Saniye" (º/s) cinsine çevrilir. Ardından açısal hızı açıya çevirmek için geçen süreyi de (Δt = t2 – t1) bilmemiz gerekir. Temel fizik kuralı olan "Yol = Hız x Zaman" mantığını kullanırız:
Açıeski : Bir önceki döngüde hesaplanan açı.
Gyrohız : Sensörden okunan anlık dönüş hızı (º/s).
Δt : İki ölçüm arasında geçen süre (saniye cinsinden).
Bu yöntemle Roll(X ekseni), Pitch(Y ekseni) ve Yaw(Z ekseni) açıları hesaplanabilir. Jiroskopta açı için referans noktası, sensörün çalışmaya başladığı (besleme aldığı) veya kodun başladığı andaki konumudur. İvmeölçer dünyayı "yerçekimine göre nerede duruyorum?" diye algılarken; Jiroskop dünyayı "ilk açıldığım andaki konuma göre ne kadar ve hangi hızla döndüm?" diye algılar. Yani cihazı açtığınızda cihaz yan duruyorsa, jiroskop o anki açıyı 0 derece kabul eder.
Jiroskoplar mükemmel değildir. Cihaz masada sabit dursa bile jiroskop çok küçük bir hata payı verebilir. Zamanla bu küçük hata toplanarak (integral nedeniyle) devasa bir açı sapmasına yol açar. Buna Gyro Drift denir. Bunu engellemek için kodun başında (setup kısmında) cihaz sabitken 500-1000 örnek alıp ortalamasını bulmalı ve bu Ofset (hata payı) değerini her ölçümden çıkarmalısınız:
Gyrohız_net = Gyrohız – Gyroofset
O zaman yeni formül şöyle olur:
Açıyeni = Açıeski + (Gyrohız_net x Δt)
Tüm eksenler için açı formülleri aşağıdaki gibi olur:

Eğer hassas bir dengeleme robotu veya drone yapıyorsanız sadece jiroskop kullanırsanız robot zamanla devrilir.
Tamamlayıcı Filtre (Complementary Filter)
İvmeölçer, cihaz hareket etmiyorken (statik durumda) çok doğrudur ancak titreşimlerden çok etkilenir. Jiroskop çok hızlıdır ve titreşimden etkilenmez ama zamanla "kayma" (drift) yapar. Yani cihaz sabit dursa bile açı kendi kendine artmaya başlar. Bu nedenle en sağlıklı sonuç, ivmeölçerin kararlılığı ile jiroskopun hızını birleştiren Tamamlayıcı Filtre (Complementary Filter) ile alınır. Bu filtre, kısa vadede jiroskoba, uzun vadede ivmeölçere güvenir. Jiroskopun kısa vadeli hızını, ivmeölçerin uzun vadeli kararlılığını birleştiren formül aşağıdaki gibidir:

Roll ve Pitch açılarında hem ivmeölçerden hem de jiroskoptan veri gelir. Bu yüzden bu iki eksende Tamamlayıcı Filtre kusursuz çalışır. Tamamlayıcı Filtre formülü Yaw için uygulanamaz. Çünkü elimizde jiroskopun hatasını düzeltecek bir "referans ivmeölçer açısı" yoktur.
Bu formül sayesinde:
Jiroskopun zamanla kayması engellenir (%4'lik ivmeölçer desteği ile).
İvmeölçerin anlık titreşimleri temizlenir (%94'lik jiroskop desteği ile).
Yaw Nasıl Hesaplanır? (9 Eksenli Sensörler)
Yaw açısının tam doğrulukta (yani pusula gibi yön tayini) hesaplanmasını istiyorsanız, sisteme bir Magnetometre (Manyetometre) eklemeniz gerekir. MPU9250 gibi 9 eksenli sensörlerin içinde MPU6050'ye ek olarak bir pusula çipi bulunur. Bu çip, Dünya'nın manyetik alanını (Manyetik Kuzey) referans alır. Böylece jiroskopun Z eksenindeki kayması, pusula verisiyle sürekli olarak düzeltilir.

