You are here: Home » Elektronik » Arduino ile Analog Gyro Kontrolü (LISY300AL)

Arduino ile Analog Gyro Kontrolü (LISY300AL)

Mikrokopter, quadrokopter ya da aeroquad gibi çok motorlu uçan bir sistem için birşeyler yapmaya başladıysanız sensörlerin ne kadar önemli olduğunu anlamışsınızdır. Her bir sensörün ayrı bir görevi olsa da böyle bir sistem tasarımı için gyro ve ivme ölçer (accelerometer kısaca accel yazacağım bundan sonra) kesinlikle öncelikli olarak sisteme dahil edilmesi gereken sensörlerdir.

İlk olarak böyle uçan bir sistem yapmayı istediğim zamanlarda hangi sensörlere ihtiyaç duyacağımı bile bilmiyordum. Gyro ve accel sensörlerinin öncelikli olduğuna kanaat getirdikten sonra aralarındaki farkı öğrenip, böyle bir sistemin sadece gyrolar ya da sadece ivmeölçerler ile uçup uçmayacağını anlayıp ona göre yatırım yapmak istiyordum. Tabiki böyle bir bilgiye ulaşmak kolay olmadı. Tecrübe kazanmak için bazen extra parayı gözden çıkarmanız gerekiyor 🙂 Ama neyseki bu yazıyı okuduktan sonra böyle bir yatırım yapmayı planlıyorsanız siz daha az para harcayacaksınız…

Öncelikle eğer böyle uçan bir sistem yapmak istiyorsanız kaynak olarak kullanabileceğiniz open-source bir proje olduğunu belirtmek isterim. http://www.aeroquad.com adresinden ilgili tüm kaynaklara erişebilirsiniz. Eğer bu projeyi yapmak istiyorsanız bu projede kullanılan tüm sensörler için gerekli kodlara ulaşmak mümkün. Dolayısıyla böyle bir yol izleyecekseniz mutlaka ilgili sensörlerden temin etmelisiniz. Çünkü eğer sizin temin ettiğiniz sensörler bu projede desteklenmiyorsa ya o sensör için gerekli kodları kendiniz yazmalısınız ya da o sensörü kullanmamalısınız.

Bu yazıda bahsedeceğim sensör için (yani LISY300AL için) aeroquad projesinin desteği yok. Ben bu sensör için bazı geliştirmeler yapıyorum. Yeterince stable bir duruma gelirse bu kodları topluluk ile paylaşıp projeye eklenmesini sağlayacağım. Bu yazıyı yazmamdaki amaç gyrolar hakkında temel bilgiyi Türkçe bir kaynak ile sağlamak (çünkü inanın ben bu aşamaya gelene kadar epey zaman  harcadım) ve bir örnek uygulama ile nasıl kullanabileceğinizi göstermek.

Evet öncelikle gyro ve ivmeölçerin tam olarak ne iş yaptığını anlamalıyız. Gyro’lar “açısal hızı” hesaplayabilen sensörlerdir. Yani anlık açısal hız hakkında sizi bilgilendirebilirler. Şöyle bir örnek ile açıklamaya çalışayım, diyelimki bir aeroquadınız var,  aracınızın ön kısmını (yani pitch eksenini) 30 derece aşağı 30 derece de yukarı bakacak şekilde toplam da 60 derece hareket ettirdiğinizi ve bunu da 1 saniyede gerçekleştirdiğinizi varsayalım. Bu durumda gyro sensörünüzün saniyede açı değişim hesaplama kabiliyeti ve analog olarak ne kadar hassaslıkla çıkış verdiği değerlerine göre bir değer üretecektir (yani dakikada 300 derece hassaslıkta, 3.3V referans değeri ile çalışan ve derece başına 2.2mv üreten bir gyro,  10 bit bir analog-dijital dönüşüm ile  hareketsiz iken 512 değerini, saniyede 30 derece eksi yönde 30 derece artı yönde bir hareket için yaklaşık 460 ve 560 değerlerini üretecektir) ve hareket bittiğinde gösterdiği değer tekrardan 0 ya da ilk çalışmaya başladıgındaki değer olacaktır. (yani örneğimiz için 512 değeri) Çünkü daha önce de söylediğim gibi gyrolar anlık açı değişimi hespalayabilirler, hareketsiz bir cisim için açısal hız 0 olacagından üretilen değer hep başlangıç değerine geri dönecektir.

İvmeölçer sensörleri için ise bu durum biraz daha farklı. Anlık açısal hız söz konusu olmadıgından ivmeölçerlerin ürettiği analog değerler cismin açısal konumuna göre yerçekimi ivmesi ile yaptığı açı hesaplanarak oluşturulurlar. Dolayısıyla yerçekimi heryerde mevcut olduğundan ivmeölçerler hareketsiz iken de açısal konuma göre çıktı üretirler ve gyrolardan farklı olarak bu değer hiç bir zaman (hareketsizken dahi) önce bir değere ulaşıp daha sonra ilk değerine dönmez, o değerde sabit kalır. (ya da hareket sonucu bir ivmelenme varsa ivmelenme bitene kadar artıp/azalbilir ama  sonra hangi açıdaysa o değeri verir, kesinlikle ilk değerine dönmez)

Aşağıda bu durumu gözlemleyeceğiniz bir video ekliyorum. Aynı zamanda bu videoda aeroquad için uçuştan önce yapılması gereken kontroller ve ayarlar anlatılıyor. Zaman zaman ekrana zoomlandığında gyro ve accel için kullanılan grafiklerin hangileri olduğunu görebiliyorsunuz.

Evet biraz da DOF kavramından bahsetmekte yarar var. DOF, Degrees of Freedom kelimelerinin kısaltması aslında. Yani kaç eksende ölçüm yapıp bu eksenlerde ne kadar özgür olduğunuzla alakalı bir kavram. Gyro ve İvmeölçer almak istediğinizde kullanacağınız uygulamaya göre birden fazla eksen için ilgili sensörü almak mümkün ve hatta ivme ölçer ve gyro bir arada olanlar var. İvme ölçer ve gyro bir arada olan ve çeşitli filtrelemeler ile gürültüyü engelleyebilen gelişmiş sendörlere IMU adı veriliyor. (Inertial Measurement Unit)  Örneğin 6 DOF dendiğinde ya da 6 DOF’luk bir IMU dendiğinde şu 3 eksen gyro ve 3 eksen ivmeölçer kastedilmektedir aslında ve yaw,pitch,roll eksenlerinde hem gyro hem de ivmeölçer toplam 6 serbestlik derecesi olduğu anlaşılmalıdır.

Benim aşağıda örnek kodunu verdiğim uygulamada tek bir eksende açı ölçümü yapılıyor. Yani sizin saniyede sensörü döndürme hızınıza göre bir oluşan analog değer alınarak dereceye dönüştürülüyor. Dolayısıyla uygulamayı ilk başlatmanızdaki duruma göre sensörün kaç derece döndüğünü hesaplayarak başlangıç durumuna göre sensörün pozisyonunun hangi açıda olduğunu seri porta yazıyor. Bu uygulamada kullandığım sensör LISY300AL. Sparkfun’ın entegresini kullanıyorum (http://www.sparkfun.com/products/9373 bu adresten detaylı bilgi alabilirsiniz.) Bağlantı için GND ucunu Arduino Uno kitinizin GND bacağına, 3.3V ucunu yine Arduino’nun 3.3V bacağına ve OUT bacağını da Arduino Uno kitinizin analog portunun A3 bacağına bağlamanız yeterli olacaktır. Bu arada sadece 3 eksenli gyro kullanarak bir aeroquad yapabilirsiniz. İvmeölçerler “stable mode” için kullanılıyor ve ilk uçuş denemeleriniz için ivmeölçer sahibi olmak zorunda değilsiniz.

ÖRNEK UYGULAMA


#define GYRO_SENSITIVITY 0.0033;
//LISY300AL için 3.3mV/derece/saniye
//(yani kısaca her derece değişim için 0.0033V değişim olur)

#define ANALOG_SENSITIVITY 0.0047
// Arduino USB'Ye baglandıgında 4.575 V ile
//çalışıyor. (Aref=4575) Analog çözünürlük
//10bit dolayısıyla hassaslık=4575/1024

int sensor = A3; // analog gyro port
int change = 0; // ATD conversion change
float position = 0.0; // current cardinal position
unsigned long timetook = 0; //sample time taken
unsigned long lasttook = 0; //last sample time

void setup(){

  Serial.begin(9600);
}

void loop(){

  //Döngüde o an oluşan analog değeri gyro_x değişkenine atıyoruz.
  int gyro_x = analogRead(sensor);

//Gyro Hareket etmez ikenki değeri ile
// hareket sonrası değişim ditital olarak
// 3 birimin üstünde değilse bunu yok sayıyoruz.
//Değişim dijital olarak 3 birimin üstünde ise
//change değişkenine değişimi atıyoruz.
//Bendeki gyro şu anda hareket etmez iken
//dijital olarak 352 değerini gösteriyor.

  if(abs(gyro_x-358)>3)
    change = gyro_x-358; 

  //Son döngüde harcanan zamanı hesaplamak
  //için lasttok ve timetook degerlerini güncelliyoruz.
  lasttook = timetook;
  timetook = millis();

    float time = (float(timetook)-float(lasttook))/1000.0;                             
    //Son döngüde geçen zamanı hesaplıyoruz (saniye cinsinden)

    float degchange = change * time *  ANALOG_SENSITIVITY / GYRO_SENSITIVITY ;
    //Derece olarak değişim miktarını hesaplıyoruz. 

    position = position+degchange;
  //position değerinin değerini derece cinsinden
  //buldugumuz değer kadar arttırıyoruz.

    position = makecardinal(position);
  //360 dereceden büyük 0 dereceden küçük olma
  // durumları için dönüşümleri yapıyoruz.

  Serial.println(position);  //Derece bilgisini seri porta yazdırıyoruz.

  change=0;

  delay(10);
}

//Derece Dönüşüm fonksiyonu
float makecardinal(float position){
  if(position > 360.00){
      position = position-360.00;
    }else if(position < 0){
      position = 360+position;
    }
    return position;
}

Umarım faydalı bir paylaşım olmuştur.

Yeni bir yazıda görüşmek dileğiyle…

Filed under

Elektronik

| Tags:

Leave a comment ?

20 Comments.

  1. Merhaba Hakan Bey,

    Öncelikle sizi kutlarım bu tür deneyimlerinizi bizlerle paylaştığınız için. Çünkü bu tür konularda türkçe kaynak bulmak gerçekten çok zor ve bir çok kişi bu konuda tecrübe kazanmak için çok para harcamak zorunda kalıyor. Sizin tecrübeleriniz sayesinde sanıyorum biz bu işe 1-0 önde başlıyacağız.
    Konu ile ilgili bir kaç sorum olacak size;
    Kullandığınız gyroscope da anladığım kadarıyla tek bir çıkış mevcut. Peki bu 3 eksen hareketi tek bir çıkıştan mı okuyorsunuz yoksa bu tek eksen ölçüm yapan bir gyro mu?
    Diğer bir sorumda yazmış olduğunuz kod neyin kodudur? Bu iş için hangi uC kullanıyorsunuz?
    Bunları cevaplayabilirseniz sevinirim. Tekrar tebrik ediyorum ve çalışmalarınızda başarılar diliyorum.

    • Hakan Çakıroğlu

      Merhabalar;

      Kullandığım gyro tek eksen, yani aslında yazıda bahsettiğim tek eksen ama bende 6 eksenli olan mevcut.

      – 1 adet Main Board (Üzerinde 3 eksen accel ve 1 eksen gyro mevcut ) ve bu board üzerinde 2 gyro için slot ayrılmış durumda.
      – 2 adet Daughter Board (Her biri tek eksen gyro yani LISY300AL)

      Aşağıdaki linklerden ilgili sensorlere ulaşabilirsiniz.
      http://www.sparkfun.com/products/9372 (Main)
      http://www.sparkfun.com/products/9373 (Daughter)

      Eğer Aeroquad projesi için IMU alacaksanız bu sensorleri değil uyumlu olan i2c sensorlerden temin etmelisiniz.

      Kullandığım IDE aslında Arduino’nun kendi IDE’si. Arduino open-source atmel tabanlı mikroişlemci programlama platformu ve gerçekten kütüphane ve kolay kullanımı ile öne çıkıyor. Şu linkten daha detaylı bilgi temin edebilirsiniz : http://www.arduino.cc

      Yazının şu bölümü aslında diğer sorularınza cevap verebilir sanırım :

      Benim aşağıda örnek kodunu verdiğim uygulamada tek bir eksende açı ölçümü yapılıyor. Yani sizin saniyede sensörü döndürme hızınıza göre bir oluşan analog değer alınarak dereceye dönüştürülüyor. Dolayısıyla uygulamayı ilk başlatmanızdaki duruma göre sensörün kaç derece döndüğünü hesaplayarak başlangıç durumuna göre sensörün pozisyonunun hangi açıda olduğunu seri porta yazıyor.

  2. Merhabalar,

    İstanbulda, marmara üniversitesi son sınıf öğrencisiyiz. tez konumuzu yetiştiremediğimizden bu projede bize yardımcı olmak isteyen birilerini arıyoruz.

    Aynı anda bir çok projemiz oldugundan ilgili projeyi yapmaya vaktimiz yok ve bu konuda gerekli ücreti de vereceğiz. 3 haftalık bir süermiz var yardımcı olabilirseniz ve ya birine yonlendirebilirseniz çok seviniriz.

    Genel içerik: Depo yönetim sistemi .
    Herhangi bir lojistik firmasının deposundan çıkan RFID etiketli ürün pc tarafından algılanır ve ilgili rafa bilgi gönderilir ürün geliyor bilgisi xbee ile. Ürün rafa girdigiğinde feedback yapılarak database ‘e işlenir.
    Projenin genel şeması, çalışma prensibi her şey hazırdır sadece programlama kısımları yapılacaktır.
    “Sistem Arduino temelli olacağı için mikrodenetleyici programı zaten Arduino kütüphaneleri ile tasarlanacak. Baskı devre kısmı ise çok az sadece arduino/rfid modül/xbee modül arası bağlantıları içeren pcbler hazırlanacak (bunlar arduino shield olarak tasarlanması lazım ). PC kısmında ise visual basic veya c#.net database olarak sql veya access.

    Nolur yardımcı olmaya çalışın. Aksi takdirde okulumuz uzayacak ve bizim icin kotu olacak…

    Sevgiler…

    • Hakan Çakıroğlu

      Merhabalar;

      Yardımcı olmak isterdim ama kendi projelerim için bile zaman ayıramıyorum bu aralar. Bir arkadaşım var, ben bu bilgiyi kendisi ile paylaşacağım. Eğer ilgilenirse sizinle irtibata geçecektir.
      Şimdiden Başarılar & İyi Çalışmalar…

  3. bu sisteme havada iken yere yaklaştığında etrafdaki cisimler ile arasında mesafe ölçüp mesafeye göre çarpmamak için frenleme veya yön değiştirme eklenebilirmi?. 5 mt gibi kısa mesafelerde ultrasonik (Radar), daha uzun mesafelerde lazerli ölçüm yapılabilir diye düşünüyorum. bunu becerebilirsek almanlarla 1-1 oluruz:)

    • Hakan Çakıroğlu

      Yapabilecekleriniz hayallerinizle sınırlı aslında. Ve geleceği olan bir konu olarak görüyorum çok rotorlu uçan robotları… Dolayısıyla öne geçmek yine bizim elimizde 🙂

  4. furkan okcu

    Slm.Öncelikle vediğiniz bilgiler için çok teşekkürler…Bir proje olarak quadrocopter yapmayı planlıyoruz. Bu konuda elinizde yapılmış bir proje varsa bize çok yardımcı olacaktır.Paylaşırsanız memnun oluruz.tşkkrler.

  5. Hakan Çakıroğlu

    Merhaba;
    http://www.hakancakiroglu.com/wordpress/?p=335 burada bir yazım var. Bunu okuyarak başlayabilirsiniz. Ayrıca kendi yaptıgım aeroquadın bir videosu da o linkte mevcut. http://www.teknotronik.org adresindeki ürünlerden yararlanabilirsiniz….

  6. Merhaba..
    Diyelim ki gyro x ekseni etrafında 300 derece/sn. hızla dönüyor. Biz hareketin bittiği anı nereden bileceğiz? Hareketin devam ettiği süreyi nasıl hesaplayacağız? Bir de hareket hep aynı hızda olmaz ise bunu nasıl algılatacağız?
    İyi çalışmalar..

    • Hakan Çakıroğlu

      Merhaba,
      Aslında yukarıdaki kod parcacagı bu soylediklerin için başlangıç diyebiliriz. Döngüde geçen zamanı buluyoruz ve bu zaman içerisindeki derece değişimini buluyoruz ve hassasiyete göre önceki pozisyonuna bu buldugumuz degeri ekliyoruz. Eğer hareket bitmişse zaten gyro hep aynı değeri verecektir, hareketin devam ettiği süreyi gyro’nun değerinin değişmeye başladığı andan değişmediği ana kadar olan sureyi bularak hesaplayabiliriz. Aslında yukarıda bunu döngü süresi dedigimiz time değişkeni ile buluyoruz. Change değişkeninin 0 oldugu durumlarda her ne kadar time değişse de position’da değişim olmuyor (positionchange=time * change). Hareketin aynı hızda olmaması durumunun hassasiyetini değiştirebilirsiniz. Yani dongu bizim için değişim hesaplama parametrelerinden birisi oldugu için hassasiyeti arttırmak ve hız değişimlerini daha iyi yakalamak için dongu içerisindeki delay suresini azaltabilirsiniz. Tabi sensörümüzün yani LISY300AL’nin hassasiyeti de bu durumda unutulmamalıdır. (300 derece/saniye)

  7. Hakan bey çalışmalarınız harika. Arduino ile ilgili birkaç soru sormak istiyorum. Kullandığınız millis() fonksiyonunu biraz detaylı anlatırmısınız ingilizce kaynaklardan pek bişey anlamadım bunun ccs c deki karşılığı nedir? bu bir nevi timer görevi mi görüyor?

    Saygılarımla…

  8. Hakan Çakıroğlu

    Merhaba,
    CCS C’deki karşılığını tam olarak bilmiyorum ama millis() fonksiyonu Arduino’ya enerji verdiğiniz andan itibaren geçen zamanı milisayine cinsinden size döndürüyor kısaca. Overflow olma süresi yaklaşık olarak 50 gün. 50 gün sonra da tekrardan 0’dan başlıyor saymaya.

  9. çok faydalı bir paylaşım olmuş, elinize sağlık.

  10. Hocam, güzel bir konuya değinmişsiniz.
    Bir sorum var.
    Saniye cinsinden demişsiniz ama döngü zaten çok kısa süren birşey.
    Bu kadar kısa süre içinde saniye değeri hep sıfır olmaz mı?
    float time = (float(timetook)-float(lasttook))/1000.0;
    //Son döngüde geçen zamanı hesaplıyoruz (saniye cinsinden)

    • Hakan Çakıroğlu

      Merhaba,

      Evet aslında cok kısa bir süre geçiyor ancak LISY300AL sensörünün katalog değerlerinde birimler saniye cinsinde oldugundan milisaniye degerini saniyeye çevirmek için 1000’e bölerek devam ediyoruz işlemlere. Ama çıkan sonuc 0.002 0.003 gibi bir değer oluyor aslında.

      • Teşekkürler, sizin yönteminizle başka bir sensörde(MPU6050) deneme yaptım. Sonuç başarılı sayılır, ama sensör hareketsizken 2 ila 3 arasında değişen bir dönüş yapıyori, sizin şu satırda:
        if(abs(gyro_x-358)>3) change = gyro_x-358;
        yaptığınız gibi 3’ten büyükse dikkate alıyorum
        Ama döndürürken gerçek açı tutmuyor bias kayması oluyor, yani başlangıç pozisyonuna getirdiğimde başka bir açı gösteriyor.
        Bildiğiniz kaliteli, bol örnekli(bias kayması için) bir gyro sensör önerebilir misiniz?

  11. 30 derece aşağı 30 derece de yukarı bakacak şekilde toplam da 60 derece hareket ettirdiğinizi ve bunu da 1 saniyede gerçekleştirdiğinizi varsayalım. Bu durumda gyro sensörünüzün saniyede açı değişim hesaplama kabiliyeti ve analog olarak ne kadar hassaslıkla çıkış verdiği değerlerine göre bir değer üretecektir (yani dakikada 300 derece hassaslıkta, 3.3V referans değeri ile çalışan ve derece başına 2.2mv üreten bir gyro, 10 bit bir analog-dijital dönüşüm ile hareketsiz iken 512 değerini, saniyede 30 derece eksi yönde 30 derece artı yönde bir hareket için yaklaşık 460 ve 560 değerlerini üretecektir)

    BU NASIL OLUYIR ACABA ? TEKRAR DAHA AÇIK ANLATIRMISINIZ ?

  12. Hocam benim proje denge robotu ile ilgili..6 eksenlik IMU aldim.
    Fakat değerleri neye gore hesaplamam gerekiyor bunu bilmiyorum yardımcı olurmusunuz..yanı mekanik akşamı yaptıktan sonrami değerlerin bulunması gerekiyor

  13. Hocam iyi günler.Bir sorum olcaktı benim bir proje ödevim var.hareket ettiğinde ve karanlık bir ortamda yanacak bisiklet farı devresi yapmam gerekiyor.Bu durumda benim ivme ölçer mi kullanmam lazım yoksa gyro mu hangisi daha mantıklı yoksa her ikisini ihtiva eden bir sensörmü.pil ömrü hangisinde en uzun olur ? şimdiden teşşekkür ederim.

  14. orkut göküş

    öncelikle çok teşekkürler.ürünü türkiyede bulma şansımız var mı ben bulamadım belki bilginiz vardır diye yazıyorum.teşekkürler

Reply to Burcu bektas ¬
Cancel reply


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

This site uses Akismet to reduce spam. Learn how your comment data is processed.