GY-521
Modülü
|
Yukarıdaki resim de GY-521 modülü gösterilmiştir. Bu modül için de bir adet MPU-6050
çipi mevcuttur
ve o çip içinde birer
tane MEMS accelerometer (ivme ölçer) ve bir tane MEMS gyro bulundurmaktadır. Bu yüzden Quadrotor veya bir denge robot gibi projelerde, bu modül çok
güvenli sonuçlar verir. Bu sensör aynı zaman 6 DOF olarak da adlandırabiliriz
çünkü 3 ekse cayro ve 3 eksen ivme ölçere sahip.
Bu modül kartı bir voltaj
regülesi devresine sahiptir. Bu nedenle 3.3V yada ile 5V birlikte
kullanılabilir. I2C-bus’ında 2k2 pull-up direnci vardır. 2k2 direnci çok düşüktür.
Eğer diğer pull-up direnci olan sensörlerle kombine yapılıp kullanılmak
istenirse toplam pull-up empedansı düşük olabilir. Bunun şemasını bulmak
zordur. O yüzden piyasa böyle çeşitli modüller bulanmaktadır. Ben başlıkta da
yazdığım gibi Gy-521 modülünü kullanıyorum.
MEMS(Mikro elektronik
mekanik sistem) yapıya sahiptir ve her kanalda 16 bit analoğu dijitale çeviren
donanım bulunmaktadır. Bu modül en güzel
yanlarında biri; Kullancı için şu seçimleri yapmamıza imkan sağlıyor, skala
aralığı gyro için ±250, ±500, ±1000, ve ±2000°/sec aynı şekilde ivme ölçer için ±2g, ±4g, ±8g, ve ±16g. Bunlar istenildiği değer
için seçilebilir.
İvme ölçer ve gyro için gerekli ham değerleri
okumak kolaydır. Önce uyku modu devre dışı bırakılmalı ve daha sonra ivme ve
gyro değerleri okunabilir. Modül, 1024 byte’lık FIFO tampon
bulundurmaktadır kullanıcıya düşük güç tüketimi sağlar ve okunan açı ve ivme
bilgileri FIFO tampon içerisinde saklanabilmektedir. Tampon, bir mikrodenetleyici
tarafından okunarak, FIFO tampon kesme sinyaliyle beraber kullanılabilmektedir.
Tamponda veri olduğunda sensörün “int” pininden kesme sinyali gönderilir ve kullanılacak
mikrodenetleyici (ben Ardiuno kullanacağım), okunacak bir veri olduğunu anlar.
Biraz daha karışık yöntem ise ikinci bir I2C
cihaz ile tespit etmektir. MPU-6050 her zaman I2C-bus a bağlı SDA ve SCL
pinleri ile bir mikrodenetletici‘ye
slave olur. Ama bunun yanında normal I2C kendi I2C sini kontrol etmek için
ikinci bir master I2C-bus’a sahiptir. İkinci I2C-bus için AUX_DA ve AUX_CL
pinlerini kullanır. Bir magnetometer ile kontrol edilebilir ve magnetometer
değerleri bir mikrodenetletici’ye
aktarılabilir.
Bazen hesaplanacak işlemler çok karmaşık olabilir. Fakat
sensör bir tane “Digital Motion Processor ” (DMP) (dijital hareket işlemci)’ye
sahiptir. Ve bu DMP ile karmaşık hesaplamaları yapmak mümkündür (DMP, firmware
ile programlanabilir). DMP nin nasıl programlandığı konusunda fazla bilgi
bulunmamakta piyasada fakat yine de tersine mühendislik ile firmeware’yi
bulmaya çalışanlar olmuştur ve deneyebilirsiniz. Bu DMP ile çip üzerinde
hızlı hesaplamalar da yapabilirsiniz. Bu işlem kullanılan mikrodenetleyicinizin
üzerindeki iş gücünü azaltır.
Benim amacım bu çalışmamda bu modül üzerindeki sadece ivme
ölçerin x-ekseninden datayı alıp servo motor kontrol edeceğim. Bunu yaparken Ardiuno Uno mikrodenetleyicisinden
yararlanacağım çünkü bu modül için nette
çok fazla kaynak vardır ve bu kaynaklar herkese açıktır. Bunlardan
biri ise şu linkteki kütüphanedir. Eğer benim yazdığım ardiuno kodu çalıştırmak isterseniz bu linkteki kütüphaneyi sizin ardiuno kütüphanenize eklemeniz gerekir.
Ardiuno Kod:
/*
http://muhhakanaydin.blogspot.com.tr/
PROJE: MPU6050 ILE SERVO KONTROL TEK EKSENDE
TARIH:12/01/2015
MPU6050 BAGLANTISI;
MPU6050 ARDIUNO
GND------- > GND
VCC--------> +3V3
SDA--------> A4
SCL-------- > A5
INT-------- >PIN 2
NOT: MPU6050 ÜZERİNDEKİ AD0 PINI GND 'ye BAĞLANIR.
*/
http://muhhakanaydin.blogspot.com.tr/
PROJE: MPU6050 ILE SERVO KONTROL TEK EKSENDE
TARIH:12/01/2015
MPU6050 BAGLANTISI;
MPU6050 ARDIUNO
GND------- > GND
VCC--------> +3V3
SDA--------> A4
SCL-------- > A5
INT-------- >PIN 2
NOT: MPU6050 ÜZERİNDEKİ AD0 PINI GND 'ye BAĞLANIR.
*/
//*********** KÜTÜPHANE DOSYALARI EKLENİR********************************
#include Servo.h
#include I2Cdev.h
#include MPU6050.h
#include Wire.h // MPU6050 I2C ILE ILETISIM KURDUGUNDAN BU KÜTÜPHANE GEREKLİ
//****************************************************************************************
#include Servo.h
#include
#include MPU6050.h
#include
//****************************************************************************************
MPU6050 ACC_GYR;
Servo S_K; // nesne yaratılır.
Servo S_K; // nesne yaratılır.
//16-BITLIK DEGISKEN KULLANILIR. ÇÜNKÜ GYRO VE IVME OLÇERDEN ALINAN DATALAR 16-BITLIK.
int16_t accx, accy, accz;
int16_t gyrx, gyry, gyrz;
int16_t accx, accy, accz;
int16_t gyrx, gyry, gyrz;
const int servocikis=9; // SERVO CIKIS PALS PINI. SINYAL
int deger, eskideger;
int deger, eskideger;
void setup(){
Serial.begin(9600);
Serial.println("MPU6050 HAKAN AYDIN");
Serial.println("http://muhhakanaydin.blogspot.com.tr/");
ACC_GYR.initialize(); //
Serial.println(ACC_GYR.testConnection() ? "BASARILI":"BASARISIZ");
// EGER BAGALANTI BASARILI ISE mpu.testConnection()=1 OLUR
// VE "BASARILI" AKTIF OLUR. DEGILSE "BASARISIZ" AKTIF OLUR
S_K.attach(servocikis);
S_K.write(90); // 90 DERECE KONUMUNA GETIR.
delay(50);
}
void loop(){
ACC_GYR.getMotion6(&accx, &accy, &accz, &gyrx, &gyry ,&gyrz); // HER BIRI 16-BIT OLANA DATALARI AL
deger=map(accx,-17000,17000,0,180);// SADECE X EKSENINDEKİ DEGEERİ 0 ILE 180 ARASINDA SINIRLA.
if(deger!=eskideger){ // EGER ILK DEGER VE BIR ONCEKİ DEGER AYNI ISE BURAYAI GIRME SERVO AYNI KONUMDA KALSIN
// FARKLI ISE SERVOYU ONA GORE AYARLA
S_K.write(deger); // SERVOY'A X EKSENDEN ALINAN DEGERİ GONDER VE ONA GÖRE KONUMLANSIN.
eskideger=deger;
Serial.println(deger);
}
delay(50);
}
Video
Kaynaklar
http://playground.arduino.cc/Main/MPU-6050#easy
Hiç yorum yok:
Yorum Gönder