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.
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ı:
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.
Raspberry üzerinden nasıl ekran videosu çekiyorsunuz ?
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
Kodlar python 2’de çalıyor. Python 3 te çalışması için yapılması gereken değişiklikler nelerdir?
python 2 kodunu python 3 koduna çeviren bir modül var ama her zaman işe yarıyor mu bilmiyorum. Allah kolaylık versin
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…
İ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.
what about z rotational ?
def get_z_direction(x,y,z):
radians=math.atan2(z,dist(y,x))
return math.degrees(radians)
is taht right ?
File “mpu6050.py”, line 21
return -((65535 – val) + 1)
^
IndentationError: expected an indented block
hatası alıyorum sebebi nedir? yardımcı olabilir misiniz?
Kodda yer alan boşlukların düzgün koyulmamasından dolayı bu hatayı almaktasınız.
Dediğiniz yerden kopyalayıp denedim ama yine hata verdi, başka hangi sebeple bu hatayı verebilir sizce?
İnternetten başka kodlara da bakabilirsiniz, bu kodda sıkıntı olabilir.
ben bazen şöyle çözüyorum o sorunu: 1 tab boşluğu büyüklüğü olan 4 boşluğu siliyorum, yerine 1 tab boşluğu koyuyorum
https://www.codecademy.com/en/forum_questions/541efb868c1cccb6ca004d03
BU sitede çöüzümünü gösteriyorben denedim oldu kodların düzensizliğinden kaynaklanan bir sorun 🙂
ÖRNEK OLARAK
Have you indented the if-statement, elif and else. And then indented the return inside there again. Like this:
def shut_down(s):
if s == “yes”:
return “Shutting down”
elif s == “no”:
return “Shutdown aborted”
else:
return “Sorry”
KODLARI BU ŞEKİLDE DÜZENLEMENİZ GEREKİYOR
aynı sorun bendede vardı bağlantıları değiştirmeden şu linkteki phyton kodunu kullan bende çalıştı
http://www.electronicwings.com/raspberry-pi/mpu6050-accelerometergyroscope-interfacing-with-raspberry-pi
İ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?
İyi günler. Orange Pi kartı ile Python kullanarak program oluşturmak istiyorsanız, bu örneğimizdekinin aksine OPi.GPIO isimli kütüphaneye ihtiyacınız olacaktır. Kurulum ve detaylı dökümantasyon için burada yer alan sayfayı inceleyebilirsiniz: https://opi-gpio.readthedocs.io/en/latest/
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.
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?
Merhaba,ardunio ile yapılan proje için kullanılan kodu python’ icin ceviren herhangi bir kaynak var mı?
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:)
name bus is not defined hatası alıyorum