20 Ocak 2015 Salı

MPU6050 İle Servo Motor Kontrolü

Bu çalışmamda, bir önce ki yazımda anlattığım ivme ölçer ve cayro sensörlerini Ardiuno ile nasıl bağlantı kurullacağını ve bunun ile ilgili bir servo motor kontrol çalışma yapacağım. Servo motor çalışmasına geçmeden önce bu çalışmada kullanılacak olan GY-521 modülünü sonra servo motor kontrolüne geçeceğim.



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.
*/
//*********** 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İ
//****************************************************************************************
MPU6050 ACC_GYR;
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; 
const int servocikis=9; // SERVO CIKIS PALS PINI. SINYAL
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