back to top

Raspberry Pi 3 İle MPU6050 İvmeölçer/Jiroskop Kullanımı #17

Raspberry Pi Dersleri serimizde kullanacağımız malzemelerin tamamına sizler için hazırladığımız setler ile kolayca sahip olabilirsiniz. Raspberry Pi’ye Uzaktan Bağlantı Yöntemleri (VNC,SSH,TTL) dersimize kadar olan malzemeler için Kombo Kit, Raspberry Pi 3 Röle Kartı İle Alarm Devresi Yapımı dersimize kadar olan malzemeler için Süper Başlangıç Seti, tüm derslerdeki malzemeler için Proje Seti tercih edebilirsiniz.

Merhaba arkadaşlar. Bu dersimizde Raspberry Pi’mize bir ivmeölçer/jiroskop kartı (MPU6050) bağlayacağız.

Gerekli malzemeler:

MPU6050 6-eksen Jiroskop/İvmeölçer Kartı Nedir?

MPU6050, 3-eksen jiroskop ve 3-eksen ivmeölçere sahip bir IMU (inertial measurement unit – ataletsel ölçü birimi) sensörüdür. Hareket ve ivme ölçümleri yapmak için oldukça yaygın olarak kullanılan MPU6050, özellikle insansız hava araçları, denge robotları, ve kamera stabilizasyon cihazları gibi hareket kontrolüne ve hassas dengeye ihtiyaç duyan uygulamalarda tercih edilmektedir. Bu sensör, kullanıcılarına tek bir entegre devre üzerinde üç eksende hareket ve üç eksende ivme ölçme imkanı tanır. Özellikle düşük maliyeti ve hassas ölçüm kapasitesi ile projelerde sıkça tercih edilen MPU6050, hareket analizinde kritik bir rol oynar.

mpu6050-breakout
MPU6050 breakout kartı

Jiroskop ile ivmeölçerin farkı:

Jiroskop ve ivmeölçer, bir cismin hareketini ve ivmesini farklı biçimlerde ölçen sensörlerdir. Jiroskop sensörü, cisimlerin hareketini ölçmek için kullanılırken, ivmeölçer ise cisim üzerindeki ivme değerini algılar. Örneğin, durgun haldeki bir cisme yalnızca yerçekimi ivmesi etki eder ve bu ivme üç boyutlu uzaydaki oryantasyonu belirlemede kullanılabilir. İvmeölçer, cismin üzerindeki ivme değerlerini m/s² veya g (yerçekimi kuvveti) cinsinden ölçerken, jiroskop hareket halindeki cisimlerde herhangi bir eksende gerçekleşen hareket hızını derece/saniye cinsinden bildirir. Bu iki sensörün birleşimi olan MPU6050, hareket kontrolü gerektiren sistemlerde kritik bilgiler sağlayarak denge ve konum ölçümlerini mümkün kılar.

MPU6050 ve I2C Haberleşme Arabirimi

MPU6050, I2C (inter-integrated circuit) haberleşme protokolünü kullanarak veri aktarımını sağlar. I2C, iki telli bir arayüz olup yüksek verimliliği ve pratik bağlantısı sayesinde geniş bir kullanım alanına sahiptir. Bu arayüz, Philips’in yarıiletken birimi tarafından geliştirilmiş olup, özellikle mikrodenetleyici tabanlı sistemlerde veri alışverişini kolaylaştırır. Raspberry Pi ve Arduino gibi platformlarda sıkça tercih edilen I2C arabirimi, seri clock (SCL) ve seri data (SDA) adı verilen iki hat üzerinden çalışır. Linux tabanlı sistemlerde I2C, SMBus (System Management Bus) protokolü olarak bilinir ve özellikle sensör verilerinin hızlı ve güvenilir bir şekilde aktarılması için idealdir. MPU6050 sensörünün projelerde sağlıklı bir şekilde çalışabilmesi için, cihazın bağlı olduğu sistemde I2C arayüzünün etkin olması gereklidir. Bu sayede sensörden alınan veriler anlık olarak işlenebilir ve gerçek zamanlı uygulamalar mümkün hale gelir.

Önemli Not: Bu dersimizde kullandığımız sensör I2C bağlantısı kullanmaktadır. Devrenin çalışabilmesi için Raspberry Pi’mize ait I2C arayüzünün açık olması gereklidir.

MPU6050 Kullanım Alanları

MPU6050, sahip olduğu jiroskop ve ivmeölçer özellikleri sayesinde geniş bir uygulama alanına sahiptir. İnsansız hava araçlarından denge robotlarına, mobil cihazlardan spor ekipmanlarına kadar birçok alanda kullanılır. Özellikle drone gibi uçuş kontrolü gerektiren cihazlarda, bu sensör hareket, hız ve ivme analizinde büyük avantaj sağlar. Denge robotlarında, ivmeölçer ve jiroskop verileriyle cihazın düşme eğilimleri algılanarak hızla denge sağlanır. Kamera stabilizasyon sistemlerinde de, hareketli çekimlerde cihaz sarsıntılarının minimize edilmesi için MPU6050’nin jiroskop verileri kullanılır.

Raspberry Pi – MPU6050 devre şeması:

rpi-mpu6050
Raspberry Pi – MPU6050 bağlantı şeması

Devremizin bağlantısını yaptıktan sonra Raspberry Pi’mizi çalıştırıyoruz. İşletim sistemi açılınca bir terminal ekranında

i2cdetect -y 1

komutunu vererek sisteme bağlı olan tüm I2C cihazların listelenmesini sağlıyoruz. Bağlantımız doğru ise aşağıdaki gibi 68 nolu adreste sensörümüzün görünmesi gereklidir:

Not: Eğer Raspberry Pi’nin 256MB RAM belleğe sahip Model B sürümünü kullanıyorsak kodu i2cdetect -y 0 olarak değiştirmemiz gereklidir.

Sensörümüz sistem tarafından sorunsuzca algılandıysa Python kodumuzu çalıştırmaya hazırız demektir:

import smbus
import math
import time
# Guc yonetim register'lari
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c
def read_byte(adr):
 return bus.read_byte_data(address, adr)
def read_word(adr):
 high = bus.read_byte_data(address, adr)
 low = bus.read_byte_data(address, adr+1)
 val = (high << 8) + low
 return val
def read_word_2c(adr):
 val = read_word(adr)
 if (val >= 0x8000):
 return -((65535 - val) + 1)
 else:
 return val
def dist(a,b):
 return math.sqrt((a*a)+(b*b))
def get_y_rotation(x,y,z):
 radians = math.atan2(x, dist(y,z))
 return -math.degrees(radians)
def get_x_rotation(x,y,z):
 radians = math.atan2(y, dist(x,z))
 return math.degrees(radians)
bus = smbus.SMBus(1)
address = 0x68 #MPU6050 I2C adresi
#MPU6050 ilk calistiginda uyku modunda oldugundan, calistirmak icin asagidaki komutu veriyoruz:
bus.write_byte_data(address, power_mgmt_1, 0)
while True:
 time.sleep(0.1)
 #Jiroskop register'larini oku
 gyro_xout = read_word_2c(0x43)
 gyro_yout = read_word_2c(0x45)
 gyro_zout = read_word_2c(0x47)
 print "Jiroskop X : ", gyro_xout, " olcekli: ", (gyro_xout / 131)
 print "Jiroskop Y : ", gyro_yout, " olcekli: ", (gyro_yout / 131)
 print "Jiroskop Z: ", gyro_zout, " olcekli: ", (gyro_zout / 131)
 
 #Ivmeolcer register'larini oku
 accel_xout = read_word_2c(0x3b)
 accel_yout = read_word_2c(0x3d)
 accel_zout = read_word_2c(0x3f)
 accel_xout_scaled = accel_xout / 16384.0
 accel_yout_scaled = accel_yout / 16384.0
 accel_zout_scaled = accel_zout / 16384.0
 print "Ivmeolcer X: ", accel_xout, " olcekli: ", accel_xout_scaled
 print "Ivmeolcer Y: ", accel_yout, " olcekli: ", accel_yout_scaled
 print "Ivmeolcer Z: ", accel_zout, " olcekli: ", accel_zout_scaled
 print "X dondurme: " , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
 print "Y dondurme: " , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
 time.sleep(0.5)

Kodumuz çalışırken bilgileri bize aşağıdaki gibi vermesi gerekli:

Raspberry Pi Hakkında Daha Fazlasını Öğrenmeye Devam Et

Raspberry Pi pek çok yönüyle avantaj sahibi ve geliştiriciler tarafından çok sevilen bir platform. Elektronik projelerinde, bilgisayar bilimlerinde ve robotik çalışmalarında sağladığı destek ve rahatlık ile öğrenmeyi sevdiren Raspberry Pi hergün daha da çok gelişiyor. 

Peki siz de daha fazla gelişmek istemez misiniz? Linux bilginizi geliştirmek, elektronik dünyasına atılmak ve eğlenceli projelere imza atmak için sizi Raspberry Pi ile yolculuğa çıkarıyoruz! Sizler için hazırladığımız Raspberry Pi eğitim serisine devam edin :

Sese Duyarlı Alarm Devresi Nasıl Yapılır?

Raspberry ile 16. dersimizde ise çok daha basit yapıya sahip bir mikrofon sensörü ile ses şiddeti algılayıp, bu şiddetin seviyesine göre sesli bir alam tetiklemeyi ve “Sese Duyarlı Alarm Devresi Nasıl Yapılır?” öğreneceğiz.

Son Çıkan Yazılar

27 YORUMLAR

    • sudo apt-get install xrdp yukle sonra bilgisayarından Uzak masaüstü baglantısı (mstsc.exe) calıştır. Raspbery ip adresini vererek baglana bilirsin
      veya putty programi ile SSH baglantısı yaparak Terminal ekranı olarak bağlana bilirsiniz

    • Aslında doğrudan Pi üzerinden kayıt almıyoruz, Raspberry Pi üzerinden VNC sunucu çalıştırıp diğer bilgisayardan VNC istemcisi ile bağlanarak o ekranın görüntüsünü kaydediyoruz.

      • onun yerine terminal ekranından “scrot -d 10” kullanılabilir. “scrot” screenshot almak için kullanılan aracın adı. “-d” delay için kullanılan alt komut. “10” ise 10 saniye bekle demek. neden 10 saniye peki. terminal ekranını kapatabilip görüntüsünü almak istediğimiz ekranı açmak için yeterli bi zaman. Nasıl ss aldığını anlarız: 1- 10 saniye sayabilirsin, 2- ss aldıktan sonra mouse imlecinde ufak bi göz kırpma, titreme oluyor. SS aldığınız görüntüyü hali hazırda bulunduğunuz terminal directory’ sinde bulabilirsiniz. Yarım yamalak ingilizce-türkçe olan yazı için kusura bakmayın. Aklıma ilk gelen isimlerini yazmış bulundum. Sağlıcakla kalın

    • def read_word_2c(adr):
      val = read_word(adr)
      if (val >= 0x8000):
      return -((65535 – val) + 1)
      else:
      return val

      if ve else bloğuna girinti yapın

      print “Jiroskop X : “, gyro_xout, ” olcekli: “, (gyro_xout / 131)
      print “Jiroskop Y : “, gyro_yout, ” olcekli: “, (gyro_yout / 131)
      print “Jiroskop Z: “, gyro_zout, ” olcekli: “, (gyro_zout / 131)

      print “Ivmeolcer X: “, accel_xout, ” olcekli: “, accel_xout_scaled
      print “Ivmeolcer Y: “, accel_yout, ” olcekli: “, accel_yout_scaled
      print “Ivmeolcer Z: “, accel_zout, ” olcekli: “, accel_zout_scaled

      print “X dondurme: ” , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
      print “Y dondurme: ” , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)

      printden sonraki kısımları parantez içine alın düzelecektir…

  1. İvme ölçer için m/s2 yada g kuvvetinin katı, jiroskop için derece/saniye olarak birimlendirdik. Aşağıdaki değerleri açıklayabilir misiniz? Ekrana basılan print “Jiroskop X : ” ve print “Ivmeolcer X: ” değerleri bu birimlerden mi? Ölçeklendirmeyi neye göre yapıyoruz 131 sayısı neye göre geliyor?

    print “Jiroskop X : “, gyro_xout, ” olcekli: “, (gyro_xout / 131)
    print “Ivmeolcer X: “, accel_xout, ” olcekli: “, accel_xout_scaled
    print “X dondurme: ” , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)

    Yardımcı olursanız sevinirim.

    • Sensörün datasheet‘ini inceleyecek olursak, jiroskop ve ivmeölçer verisini 16-bit’lik 2’li tümleyen şeklinde sakladığını görüyoruz. Öncelikle ham veriyi normal şekilde elde edebilmek için gerekli çevrim işini yapıyoruz (return -((65535 – val) + 1) satırı bu işlemi yapmaktadır). Jiroskop ve ivmeölçer için varsayılan olarak seçilen hassasiyetlerde sırasıyla 1 °/s’lik dönüş verisini elde etmek için gerekli bölüm sayısı datasheet’in 31 numaralı sayfasından ve ivmeölçerin 1g’lik ivmeyi algılaması için gerekli sayıyı yine datasheet’in 29 numaralı sayfasından öğreniyoruz. Yani öncelikle ham veriyi, daha sonra bu ham verinin hassasiyete göre ölçeklendirilmiş halini ekrana yazdırmış oluyoruz. Umarım açıklayıcı olmuştur.

      • Hocam çok teşekkür ederim çok güzel anlatmışsınız. Sensör ve kullanımında başlangıçta olduğum için mazur görün. 1 °/s hassasiyet için =>0 ± 250 °/s 131 LSB/°/s, 1g hassasiyet için=> 0 ±2g 16384 LSB/g satırındaki değerleri kullanıyoruz. Burada 2 °/s veri hassasiyeti için ± 500 °/s olarak ayarlayacağız sanırım bu 250,500,1000,2000 değerleri nereden geliyor? Birde Jiroskop dan üretilen 74 71 -81 verilerinin birimi derece/saniye, İvmeÖlçerden elde edilen -716 320 15360 değerlerinin birimi m/s2 mi?

        • Jiroskop, açısal dönüş hızını ölçtüğü için ürettiği değerin birimi °/s cinsindendir. İvmeölçer ise isminden de anlaşılacağı üzere ivmedeki değişimi yerçekimi ivmesi (g) katları cinsinden ölçmektedir. Datasheet’te belirtilen ölçüm hassasiyetleri ise sensörün yapabileceği ölçüm limitlerini belirtir. Örneğin ivmeölçeri için seçmiş olduğumuz ±2g aralığı, sensörün pozitif ve negatif yönlerde en fazla 2g (yerçekimi ivmesinin iki katı) kadar ölçüm yapabileceğini gösterir. Daha yüksek ivmelerin ölçülebilmesi için uygun bir aralık seçmek gerekir, buna karşın ölçülecek değer küçük dahi olsa, ölçüm aralığının büyümesi hassasiyeti arttıracağı için buna göre hassasiyet tercihi yapılabilir.

  2. File “mpu6050.py”, line 21
    return -((65535 – val) + 1)
    ^
    IndentationError: expected an indented block
    hatası alıyorum sebebi nedir? yardımcı olabilir misiniz?

  3. İyi günler. Bu projedeki kodu Orange pi kartlarından herhangi birisine burda yazıldığı gibi yazarak kullanbilir miyiz? Yoksa farklı bir kod mu kullanmak gerekiyor?

  4. merhaba, ben el hareketini tanıyan bir sistem yapmak istiyorum.Örneğin; A harfini havada MPU6050 sensörüyle çizip ekranda A harfini görmek istiyorum.Bu konuda bana yardımcı kaynak önerir misiniz?
    teşekkürler.

  5. Burdan aldığımız veri çok sağlıklı olmuyor. mesela 0 derece gelmesi gereken yerde -2 ile 2 arasında açılar geliyor. Bunları nasıl filtreleriz. Önerebileceğiniz örnek bir site var mı acaba?

  6. Sensör sabit duruken bile X, Y ve Z ivmelenme dğerleri değişiyor?!
    Bir de sensörün X veya Y konumunda hareket halinde olduğunu anlamak için bir formül var mıdır?

    Bir araca bağladığınızı düşünün. Şu an sağa/sola veya ileri/geri gidiyor bilgisine ulaşmak istiyorum?

    Koly gelsin,
    Mucip:)

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz