system16
Üye
- Katılım
- 21 Şub 2009
- Mesajlar
- 308
- Puanları
- 1
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 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 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ı:
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:
maker.robotistan.com dan alıntıdır.Örnek uygulama olması için paylaşılmıştır.
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 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 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ı:
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:
maker.robotistan.com dan alıntıdır.Örnek uygulama olması için paylaşılmıştır.