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. Cisimlerin hareket ve ivmelerini ölçmek için kullanılır. İnsansız hava araçlarının en temel sensörü bu ve benzeri IMU’lardır. Aynı zamanda denge robotları, kamera stabilizasyon aletleri gibi cihazlarda da kullanılırlar.

mpu6050-breakout
MPU6050 breakout kartı

Jiroskop ile ivmeölçerin farkı:

Jiroskop ile ivmeölçerin farkı; jiroskobun hareketi, ivmeölçerin ise ivmeyi ölçmesidir. Bildiğimiz üzere, durgun haldeki bir cisime etki eden tek ivme yerçekimidir. Bu sayede ivmeölçer ile cismin üzerine etki eden yerçekimi ivmesini ölçerek üç boyutlu uzaydaki oryantasyonunu elde edebiliriz. İvmeölçerden alacağımız bilgi, m/s2 veya yerçekimi kuvveti olan g’nin katları şeklinde olacaktır. Jiroskop ise, herhangi bir eksende cismin yaptığı hareketin ölçümünde kullanılır. Durgun konumdaki bir cisimde jiroskop sıfır yada çok yakın bir değeri ölçer. Cisim hareket ettiği sürece jiroskop sensörü, bu hareketin hızını bize derece/saniye gibi bir hız biriminde verecektir.

Ö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, I2C haberleşme arabirimine sahiptir. I2C haberleşme arabirimi, Philips firmasının yarıiletken birimi (şimdiki adı ile NXP) tarafından geliştirilmiş bir seri haberleşme arabirimidir. Çoğunlukla I2C (inter-integrated circuit), IIC ve TWI (two-wire interface) gibi kısaltmalar ile anılır. 1996 yılında Intel tarafından geliştirilen SMBus (System Management Bus) protokolü de I2C tabanlıdır, bu yüzden Linux tabanlı sistemlerde bu isimle anılmaktadır. 2 adet haberleşme hattı (SCL: serial clock ve SDA: serial data) kullandığından çok pratik bir kullanıma sahiptir.

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