19 Ocak 2015 Pazartesi

Complementray Filtresi, Gyroscope, Accelerometer


         Complementray Filtresi,  Gyroscope,  Accelerometer 

    Bu yazımda uzun zamandır araştırmaya planladığım fakat bir türlü yapamadığım çalışmamı, sömestr tatili sayesinde 7-8 gün içinde nerdeyse tamamlamış bulunmaktayım. Nerdeyse dememin sebebi, araştırdığım konu tam anlamıyla istediğim şeyleri bir türlü kavrayamadıysam bile belirli bir yere kadar getirdim. Bu yer şimdilik beni belli başlı projeleri yapmamda çok yardım etti. Çok uzun bir konuydu,  geçmişi çok olan bir konu.  Aslında bakarsanız kolay konu fakat benim amacım detayları öğrenmek olduğundan biraz karışık geldi. Ben bu yazımda ve çalışmalarımda bu detayı daha anlaşılır ve açık bir biçimde anlatmayı planlıyorum ve bunun yanında bu araştırmayla ilgili hazırladığım 2 veya 3 projeyi yayımlayacağım.
   Şimdi gelelim bu araştırma ne sorusuna.  Aslıdan günlük hayatımız da pek çok kez kullandığımız fakat nasıl çalıştıklarını bilmediğimiz ama onlarsız da olmayacağımız bildiğimiz iki adet elektronik sensörlerdir. Bunlar Gyroscope ve Accelerometer, türkçesi ile sırasıyla jiyroskop(cayro) ve ivmeölçer. Bu sensörler hayatımızın bildiğimiz ve bilmediğimiz her alanında çok sıklıkla kullanılmakta. Kullanıldıkları yerler; Birinci olarak, bilmiyorum farkında mıyız ama bu sensörler cep telefonlarında ve tabletlerde kullanılmakta. Basit olarak ne iş yaptığını gelecek olursak, bu sensörler telefonunuzun yönünü takip etmekle sorumludurlar ve bu günlerde her telefonda bu özellik mevcut. Yani cep telefonundaki bu sensörler, siz cep telefonunuzu sağa, sola, yukarıya ve aşağıya çevirdiğiniz anda cep telefonunuzun ekranı o yönde hareket eder, eğer bu özellik aktif ise telefonunuzda.  Aynı şekilde telefonunuzda eğer bir araba yarışı gibi oyunlar mevcut ise o oyunları telefondaki tuşları kullanmadan sadece telefonunuzun yönünü değiştirerek oynaya bilirsiniz. Bu sensörlerin telefonlardaki uygulaması bunlardır fakat daha fazla uygulama yapılabilir telefonlar ile ilgili. İkinci olarak kullanıma gelirsek, bu sensörler genel olarak uçaklarda ve bunun gibi askeri işlerde çok sıklıkça kullanılır. Kullanılmasının sebebi ise havada uçan helikopter, uçak artık ne olursa bir şeyi dengede tutmak istiyorsanız bunu bu sensörlerle yapabilirsiniz. Veya iki tekerlek üzerinde duran bir platform yapmak istiyorsunuz diyelim, iki tekerlekli üzerinde dengeli olarak sabit kalması için bu sensörleri kullanmanız şart. Ben o yüzden bu sensörlerin tam olarak nasıl çalıştığını anlamadığımdan dolayı böyle bir projeyi yarım olarak bırakmıştım(Balance Robot Hazırlıkları) ama en kısa zamanda ona tekrar dönüş yaparak bu araştırmamda öğrendiklerimi orada deneyeceğim.  Kullanıldıkları başka alanlara gelecek olursak; Hız, konum, çarpma, titreşim ya da yerçekimi ivmesinin de ölçülmesi amaçla da kullanılabilir. Gördüğünüz gibi bu sensörler hayatın bildiğimiz ve bilmediğimi her alanında sıkça tercih edilmekte. İşte bu sensörler bulunmuş olmasaydı, bu yazdığım kullanım alanların da bu sensörler kullanılmayacaktı. Kısacası, bu sensörler hayatın her alanında insanlara fayda sağlamaktadır.
    Sıklıkça, sıklıkla gibi kelimeleri bu yazımda şimdiye dek çok kullanmadım ve bu yüzden bu kelimeleri çok yazma ve düşünme sebebi beni bu araştırmaya çok fazla teşvik etti.  
   
  Bu sensörlerin nasıl çalıştıklarıyla başlamak istiyorum. İlk olarak Accelerometer ile başlayacağım sonra Gyroscopes ile devam edip ve sonra bunların aralarındaki benzerliklerinden ve farklılıklarından bahsedeceğim ve en son ise complementray(tamamlayıcı) filtresiyle bitireceğim.  

 Not: Bu yazımda bazı kaynaklardan alıntılara da yer verilmiştir.  
 

Accelerometer(İvme ölçer)


    Accelerometer  bulunduran sistemin, artık o sensör kaç eksene sahip ise örneğin 3 eksene sahip ve bunlar x,y,z eksenleri olsun, bu durumda o eksenlerden  koordinat bilgisi ve hareketin o anki ivmesini verir bize. Sisteme hangi yönde ivme kazandırırsanız o eksende sensörden bilgi alırsınız. Örneğin; bir sistem veya bir uçak düşünün z-ekseni boyunca hızlandırırsanız sensörün z-ekseninden o ivme ile ilgili veri alırsınız. Buradan da anlaşılacağı üzerine Accelerometer sensörü sahip olduğu eksen sayısı kadar çıkışlarından o sisteme ait ivme bilgisini alıyoruz.

  Accelerometer  sensörleri ile hem sistemden kaynaklanan ivmeyi hem de yerçekimi ivmesini ölçeriz ve bunları trigonometriyi kullanarak o ivmelenen sistemin yerçekimi ile yaptığı açıları sensörün x,y ve z eksenlerinden aldığımız datalar ile bulabiliriz. Örnek olarak bu sistem bir cep telefon olsun ve bu cep telefonda bir tane  Accelerometer bulunsun. Bu Accelerometer x,y ve z eksenden alığımız datalara göre belli başlı matematiksel işlemlerden geçirerek cep telefonunun 3 boyutlu uzayda nasıl durduğunu bilebiliriz.

    Tekrar söylecek olursak, Accelerometer üzerlerine düşen statik(yerçekimi) veya dinamik (aniden hızlanma veya durma) ivmeyi ölçmektedirler. Sensörden okunan değerler derece olarak ölçülmez. Sensörden okunan değer m/s^2 veya yer çekimi (g-Force) türünden belirtilir.



   Şimdi uzayda olduğunuzu düşünün. Herhangi bir çekim etkisi yok ve ağırlığınız 0 dır. Önünüzde de yukarıdaki bir kutu, kutunun ortasında da bir küre olduğunu hayal edin. Herhangi bir çekim veya kuvvet etkisi olmadığından küre herhangi bir yüzeye temas etmeden hareketsiz bir şekilde durmaktadır. Şekildeki kutu da x, y ve z eksenleri de gösterilmiştir. Küre sanki havada asılı halde duruyor, bir kuvvetin etkisi altında olmadığından dolayı. 



Yandaki şekilde göreceğiniz gibi eğer bu kutu dünyada herhangi bir noktada ve kutunu negatif z ekseni zeminle paralel halde ise dünyada ki yerçekimi kuvveti sayesinde küreye bir kuvvet etki ederek küreyi aşağıya yani zemine doğru gider. Yani bir ivmelenme olur zemine karşı ve bu ivme dünya da hep vardır. Bu kuvvet ise herkesin bildiği gibi 1g ve 9.8m/s2 olarak bilinir. Yerçekimi ivmesi dünyada her yerde mevcut olduğundan  ivme ölçerden sürekli olarak data alınabilir. Yandaki küreyi sabit bir hızla x-ekseni boyunca ittiğinizi düşünün çıkışta 0 görmeniz gerekir. Çünkü biz ivmeyi hızın türevini alarak buluruz. Eğer hız sabit ise türevi sıfırdır yani ivme sıfır olur.  Hızda bir değişlik olursa ivmelenme olur. Bu yüzden bu sensör aniden ivmelenmeyi veya durmayı ölçüyor.

Sonuç olarak; İvme ölçerin eksenlerinden verdiği dataya göre cismin açısal konumuna göre yerçekimi ivmesi ile yaptığı açı hesaplanarak oluşturulurlar.  Dolayısıyla yerçekimi her yerde mevcut olduğundan ivmeölçerler hareketsiz iken de açısal konuma göre çıktı üretirler.



Yandaki şekilde ivme ölçerin üzerine etkiyen kuvvetlerin vektörel olarak gösterimi görülmektedir. Buradaki R vektörü toplam kuvveti ifade eder yani ivme sensörünün üzerine etkiyen kuvvet vektörüdür ve bileşenleri Rx , Ry  ve Rz  dir.  Rx , Ry  ve Rz  bilindiği taktirde
Pisagor teoremini kullanarak R toplam vektörünün yeryüzüne göre konumu bulunabilir.
Daha önce de dediğim gibi ivme ölçer çıkış olarak g türünden ifade eder. Rx , Ry  ve Rz    g türünden ifade  edilir. Burada önemli olan ivme sensöründen   Rx , Ry  ve Rz   değerleri elde etmektir. Bu değerleri bildiğimiz taktirde trigonometrik fonksiyonları yardımı ile R vektörünün X,Y ve Z eksenleri ile yaptığı açılar hesaplanıp sensörün yeryüzüne göre konumu bulunabilir.
 




  Rx , Ry  ve Rz    değerleri sensörden direk olarak g türünden alınamaz. Örneğin ADXL335 adlı bir adet 3 eksende ivme ölçen bir sensör satın aldınız ve besleme gerilimimizin 5v olduğunu ve 10 bitlik bir ADC kullandığımızı varsayalım. Bu sensörün x, y ve z eksenlerinden g türünden değer alamazsınız. Bunun yerine bu sensör ADC ile bir mikrodenetleyici ile iletişim kurduğundan binary çıkış alırsın sensörün her bir ekseninden. Bu alınan binary değerleri besleme gerilimi ile çarpıp ve 210=1024 olduğundan  bu değer ile bölersek o çıkışlara ilişkin binary değil de gerilim olarak ifade edersiniz. Sonra bu değerden VzeroG den çıkarılır, bu değer ivmeölçerin 0g de vermiş olduğu bir gerilim değeridir. Bu da genellikle besleme gerilimimin yarısıdır. Son olarak elde edilen değeri sensörün hassasiyet  bölersek g türünden o çıkışları yani Rx , Ry  ve Rz   ifade ederiz ve açıları trigonometri ile bulabiliriz.
 
Not: Birimlere dikkat edin!
Rx = (AdcRx * 5v / 1024 - VzeroG) / Sensitivity =>   Birimi artık g     ------------à Axr = arccos(Rx/R) 
Ry = (AdcRy * 5v / 1024 - VzeroG) / Sensitivity = >  Birimi artık g      ------------
à Ayr = arcos(Ry/R)        
Rz = (AdcRz * 5v / 1024- VzeroG) / Sensitivity = >   Birimi artık g      ------------
à Azr = arccos(Rz/R)   











İvme ölçerin çalışması yapısı ; Konsept olarak, bir akselerometre kütle yay ve sönümden oluşan bir sistemdir. Sisteme ivmelenme uygulandığında yaya bağlı olan kütle ivmenin oluşturduğu kuvvetin etkisi ile yer değiştirir. Bu yer değiştirmenin ölçülmesi ile sistem üzerine uygulanan ivme elde edilir. Bu kuvvet yukarıdaki şekillerde gösterilen toplam R vektörüdür.


 
 
İvmeölçerlerin çalışmasında pek çok farklı yöntem kullanılmaktadır;
 
 
Piezoelektrik olan akselerometreler, içerisinde bulundurduğu mikroskopik kristal yapı üzerinde ivmelenme oluştuğunda bir çıkış voltajı üretirler. Piezoelektik ivmeölçerler içerisindeki mikroskobik kristaller maruz kaldıkları stres sonucunda orantılı olarak gerilim üretir. Üretilen bu gerilim değeri, önceden tanımlanmış olan gerilim değeri ile kıyaslanır ve ivmenin etkisi bulunmuş olur.

 


Bunu yapmanın başka bir yolu da kapasitans ölçmektir. Eğer iki adet mikroyapı birbirine çok yakın bir şekilde duruyorsa, bunların arasında bilinen bir değerde kapasitans vardır. Bu yapılardan birinin üzerinde ivmelenme sonucu oluşan kuvveti uygulanırsa, mikroyapı yer değiştirir ve bu da kapasitansın değişmesine neden olur. Kapasitans voltaj değerine çevrildiğinde bir akselerometre elde edilmiş olur.
 


Modern akselerometreler genellikle mikro elektro-mekanik sistem olarak imal edilirler ve oldukça küçük boyutlardadırlar. Bir MEMS akselerometrenin yapısına ait şekil yanda gösterilmiştir. Gösterilen sistemde sönüm etkisi akselerometre içerisinde saklı tutulan gaz ile yapılmaktadır.

 



MEMS ivmeölçerler genellikle tek bir eksen üzerinde ivmelenme ölçecek şekilde imal edilirler. Birden fazla eksende ölçüm yapılmak istenirse bu ivmeölçerler birbirine dik eksenlerde bağlanılarak ölçüm alınır. 
 
MEMS ivmeölçerler genellikle tek bir eksen üzerinde ivmelenme ölçecek şekilde imal edilirler. Birden fazla eksende ölçüm yapılmak istenirse bu ivmeölçerler birbirine dik eksenlerde bağlanılarak ölçüm alınır.
 
MEMS ivmeölçerlerin bir diğer özelliği çok büyük bir ölçüm aralığına sahip olmalarıdır. Binlerce g ölçebilecek yapıda ivmeölçerler mevcuttur. Bunun karşılığında düşük g durumlarında hassasiyet azalmaktadır. Bu yüzden akselerometre seçiminde hassasiyet maksimum g ölçümü arasında uygulamaya bağlı olarak bir seçim yapılmalıdır.
 

Akselerometre seçiminde dikkat edilmesi gereken noktalar;
 
·         Digital veya analog çıkışlı
·         Eksen sayısı
·         Hassasiyet
·         Bant genişliği
·         Ölçü skalası
 
İvme ölçerler ölçü skalası olarak ± 1g, ± 2g, ± 4g… gibi değerlere sahiptir. Yerçekimi ivmesini ölçme amaçlı eğim sensörü olarak kullanılması halinde çıkış aralığının ±1.5g civarında olması yeterlidir. Çarpma sensörü olarak kullanılması halinde (en yaygın olanı müzikal uygulamalardır) ±5g yeterlidir.
 
İvme ölçer sensörlerin bir, iki ve üç eksende ölçüm yapabilen türevleri de mevcuttur. Örneğin ADXL335 üç eksende ölçüm yapar. 
 
Sensitivity sensörün hassaslık belirtir. Hassasiyetin  yüksek olması, ivmedeki çok küçük değişimleri bile çok büyük tepki verir. Birimi V/g[volt/g]. Yüksek hassasiyete sahip ivme ölçerler genellikle füzelerde, uçaklarda kullanılıyor.
 
Bant genişliği: Yavaş hareket eden bir sistemde ivme değişimlerini algılayabilmek için bant genişliğinin 50 Hz,  yüksek hızda ise 100 Hz olması gerekir.
 
        Bu link deki video izlemenizde yarar vardır ivme ölçerin çalışma yapısını anlamanız için. 

  

Gyroscope(Jiroskop, Cayro)

 



 



Jiroskoplar basitçe bir tekerleğin ekseni etrafında hızlıca döndürülmesi sonucu ortaya çıkarlar. Tekerleğin etrafındaki çembere dik açıyla kenetlenmiş başka bir çember ve bu çemberlere dik açıyla tutturulmuş başka bir çember jiroskopu modeller. Yandaki resimde de bu gösterilmiştir.


Jiroskopun dönmeye başladığı eksenin jiroskopun durduğu yüzey ne açıyla oynatılırsa oynatılsın jiroskopun dönüş ekseni sabit kalır. Bu özelliğinden dolayı uyduların sürekli olarak dünyaya dönük kalması, uçaklarda ve çeşitli araçlarda yapay ufuk oluşturulması ve oto pilot gibi uygulamalarda kullanılmaktadır.
Jiroskoplar basitçe bir tekerleğin ekseni etrafında hızlıca döndürülmesi sonucu ortaya çıkarlar. Tekerleğin etrafındaki çembere dik açıyla kenetlenmiş başka bir çember ve bu çemberlere dik açıyla tutturulmuş başka bir çember jiroskopu modeller. Yandaki resimde de bu gösterilmiştir.
Jiroskopun dönmeye başladığı eksenin jiroskopun durduğu yüzey ne açıyla oynatılırsa oynatılsın jiroskopun dönüş ekseni sabit kalır. Bu özelliğinden dolayı uyduların sürekli olarak dünyaya dönük kalması, uçaklarda ve çeşitli araçlarda yapay ufuk oluşturulması ve oto pilot gibi uygulamalarda kullanılmaktadır.
Jiroskop veya Cayro, yön ölçümü veya ayarlamasında kullanılan, açısal dengenin korunması ilkesiyle çalışan bir sensördür. Jiroskopik hareketin temeli fizik kurallarına ve merkezkaç ilkesine dayalıdır
Jiroskoplar açısal hız hesaplayan sensörlerdir.  Sensörlerin çıkışından alınan değer derece/saniye[deg./s] türünden ifade edilir. Bu demektir ki derecenin zamana göre türevini alırsak biz açısal hızı elde ederiz.
 
 
Biz bu sensörü, bir şeyin bir eksen etrafında ne kadar hızladöndüğünü (RPM)  başka bir deyişle açısal hızını öğrenmek için kullanırız. Yan taraftaki şekilde 3 eksen jiyroskop için gösterilmiştir, iki eksende ölçüm yapabilen modelleri vardır. Wx,Wy ve Wz eksenlerdeki açısal hızları verir bize.

bu eşitliğin her iki taraf için integralini alırsak ;

 
elde ederiz.
 
. Görüldüğü gibi açısal hızdan dereceye geçiş yaptık. Yani eksenlerdeki açısal hızı bildiğimiz taktirde açıya geçiş yapabiliyoruz fakat burada önemli olan şu noktaya dikkat çekmemiz gerekir; Yukarıda yapılan integral işlemidir. Biz sürekli integral alamayız. Bu yüzden sayıların toplamından yararlanırız.
Yani bu 
Ts;örnekleme periyodudur. Bu eşitlik tabi yine bize hata getirecek çünkü jiyroskop’un datası örnekleme frekansından(Fs=1/Ts) daha hızlı değişirse biz bunu yakalamayacağız. Ve bu toplamamın sonucu doğru çıkmayacaktır. İşte bu hataya Drift denir. Bu yüzden bu örnekleme periyodunu doğru seçmeliyiz. Genellikle mekanik sistemlerde bu örnekleme frekansı 100Hz ile 200Hz arasındadır.

 
Gyroscope, anlık açı değişimi hesaplayabilirler fakat hareketsiz bir cisim için açısal hız 0 olacağından üretilen değer hep başlangıç değerine geri dönecektir. Yani sadece anlık o anda o eksende değişen değeri verir bize. Bizde o değeri yani açısal hızı bilirsek, o anlık değişen açıyı bulabiliriz. 

 


İki eksen X,Y cayro kullandığımızı düşünelim; Vektörlerin(Rxz, Ryz),  z ekseni ile yapmış olduğu açılar ise Axz ve Ayz dir. Jiyroskop açısal hız ölçer.  Bu açısal hızı zaman ile çarparsam o açısal hızın açısını elde ederim. Çünkü açısal hızın birimi derece/saniye‘dir.  Eğer ben zaman ile açısal hızı çarparsam dereceyi elde ederim.






t0 anındaki açımızın Axz0 olduğunu ve t1 anındaki açımızın ise Axz1 olduğunu düşünelim. O halde dönüş açımız;∆Q=(Axz1 – Axz0)=OkunanAçısalHız*( t1-t0) verir.

 
Örneğin elinizde bir eksen ölçen cayro var. Örnekleme periyodunuz da 0.01s olarak belirlediniz. Bu sensörün çıkışında okuduğunuz  değer yine derece/saniye olmayacaktır. Yine amacımız derece/saniye elde etmek olacaktır. Bunun için sensörümüzün çıkışında yine binary bir değer okuduğumuz varsayalım bu değeri volt türünden ifade etmek için o sensörü kaç volt(v) ile besliyorsak ve 10 bit ADC yardımıyla okuyarsak, binary değeri besleme gerilimi ile çarparak ve sonra 1024 bölerek gerilimi elde ederiz. Her jiyroskobun bir offset(V) gerilimi vardır sonra elde edilen bu gerilimi offset geriliminden çıkararak ve sonra sensörün hassasiyetine(V/deg/s) bölerek derece/saniyeye çeviririz. Artık elimizde o tek eksene göre istediğimiz değer var. Şimdi ise bu değeri örnekleme zamanı ile çarparak açıyı yani dereceyi elde ederiz. Bu açı sadece iki zaman arasında açıyı verir bize. Tek eksenli jiyroskoptan sürekli açı almak için ise; Bu iki zaman arasında bulanan açıyı, bir önceki bulanan açı ile toplarsak toplam açıyı elde etmiş oluruz. Not: Sensörlerin ofset gerilimi ve hassasiyetini o ilgili sensörün datasheet’in den öğrene bilirsiniz.
GyroToplamAçı    =   ÖncekiAçı    +   ŞimdikiAçı



GyroToplamAçı=ÖncekiAçı+((GyroBinaryDeğer*BeslemeGerilimi/1024)-Offset)*0.01/Hassaslık


Bu işlemlerde idealde iyi sonuç alabilirsiniz fakat  gerçek hayatta pekte bu mümkün sayılmıyor. Bunun çözümü ileride anlatacağım filtre sayesinde biraz daha iyi yapabiliyoruz


 


 

 

  Gyroscope bir sistemi dengede tutmak için kullanılır. Uçakların cayro durum göstergeli vardır. Burada o uçağın hava nasıl konumlandığını pilota gösterir. Yani, hava da düz mü uçuyor yan mı uçuyor gibi bilgileri pilot ondan alır. Aynı zaman da  cep telefonlarında da kullanılıyor uçaklarda olduğu gibi. Amacı yine uçaklarda olduğu gibi aynı dır. Cayroların bir diğer kullanım yeri ise; Quadrotorlardır. Amacı ise üç hareket ekseni olan ROLL,  PITCH ve YAW eksenlerindeki açısal değişimleri ölçmek. Bu ölçülen değerler Quadrotorların mikrodenetleyicilerine gelerek orada değerlendirilir. Eğer sizin talebiniz Quadrotorun veya uçağın havada dengeli şekilde kalmasını isterseniz bu sensör size çok yardımcı olacaktır. Son olarak bu sensörler, uçakların otomatik pilot sistemlerinde ve uyduların sürekli olarak dünyaya bakabilmelerinde kullanılmaktadır.
 
Gyroscope seçiminde dikkat edilmesi gerekenler; 

·         Dijital veya analog çıkışlı
·         Eksen sayısı
·         Hassasiyet
·         Bant genişliği
·         Ölçüm aralığı
·         Çalışma sıcaklığı
Ölçüm aralığı: Bu parametre maksimum ne kadar açısal hızı ölçtüğünü belirtir. Çalışma sıcaklığı: Çoğu elektronik cihaz belir bir sıcaklık arasında lineer olarak çalışır. Bu durum cayrolar içinde geçerlidir. Cayrolar için bu aralık oldukça geniş. Bu aralık genellikle; -40˚C ile 70˚C oldukça lineerliğie yöneliktir.

 

Gyroscope Ve Accelerometer Arasında Farklılıklar Benzerlikler


Aslında cayro ve ivme ölçerler aynı işi yapıyorlar, ikisi de hep bize matematiği kullanarak açı veriyorlar. Fakat bunu yaparken ikisi farklı şekilde yapıyor. Daha öncede bahsettiğim gibi cayrolar bize anlık açısal hızı verir. Burada şuna dikkat edin “anlık” ve sonra eksenlerde değişim yok ise sıfır olur. Bu durum ivme ölçerler için böyle değil çünkü ivme ölçer anlık değer ölçmez, her zaman çıkışlarından değer alabilirsiniz. Nedeni ise; sensör sürekli olarak yerçekimi ivmesi etkisi altında kaldığında her zaman çıkışlarından değer alabilirsiniz. Dolayısıyla yerçekimi her yerde mevcut olduğundan ivmeölçerler hareketsiz iken de çıktı üretirler. Örneğin bir denge robotunuz var ve o robot öne doğru eğilmeye başladı. Bunu iten bir kuvvettir. Kuvvet varsa ivme de vardır. Bu yüzden ivme ölçerden bir açı değişimi alırsınız ve haliyle bir eğilme olduğu için gyrodan da açı değişimi alırsınız çünkü açısal hız var eksenlerde. Fakat eğilme belli bir açıda bitti diyelim sonra kuvvet olmadığından gyroscopedan bilgi alamazsınız çünkü değişim yok fakat ivme ölçerden yine alabilirsiniz çünkü yer çekimi etkisi altında kaldığından sürekli değer alırısınız.


 
Kullanım farklılıkları ise;  Cayrolar gemileri, torpidoları, roketleri, kameraları yönlendirmek ve stabilizasyonlarını yapmak için kullanılır. İvme ölçerler ise yerçekimi ivmesini, sismik sinyalleri tespit etmek ve titreşimleri(vibrasyon) ölçmek için kullanılır.


 

   Gyro ve ivmeölçerler tek başlarına kullanılmaz. Genellikle birlikte kullanılırlar. Nedenleri ise şunlardır;

 


 

1.    İvmeölçerler;  kısa zaman da nesne üzerindeki çok küçük kuvvetler bile istenmeyen gürültüler yaratabiliyor.  Fakat uzun zaman sonra bu istenmeyen gürültüler yok olup gidiyor. Yani ivme ölçerler uzun zamanda daha kararlı bilgi veriyor,  kısa zamanda  ise istenmeyen gürültüler oluşuyor  veri üzerinde.


2.    Gyroscope;  Daha öncede bahsettiğim gibi bunlar açısal hız verir. Yani anlık değişimleri verir bize.  Bu yüzden anlık alınan bilgiler yani kısa zamanda alınan bilgiler daha doğrudur, kararlıdır jiyroskoplar için fakat uzun zaman sonra anlık değişim olmayacağında açısal hız sıfırdır idealde. Gerçekte ise bu böyle değil, çıkış da istenmeyen gürültülere sebep olabiliyor bu durum. Kısacası gyro dataları kısa zamanda daha iyi datalar veriyor uzun zaman göre.

3.    İvme ölçerler kuvvete karşı çok duyarlı olduğundan en ufak titreşimlerde dahi çok yüksek gürültüler oluşturmaktadırlar. Gyroların bu kuvvetlerden etkilenmez

İşte bu yüzden hassas iş yapmak istiyorsanız bu sensörler tek başlarına kullanılmaz. Bu yüzden bu iki sensörden alınan datalar birleştirilerek sanki tek bir tane sensör den alığımız data gibi yaparak daha net bir data alırız. İşte bu birleştirme çeşitli matematiksel formüllerle yapılır. Bunlardan bir tanesi de işte   Complementary(tamamlayıcı) Filtresidir.



Complemantry Filtresi





Bu filtre jiyroskop ve ivme ölçerden gelen dataları bir arada topluyor ve bu filtrelerinin çıkışında iki sensöre göre daha kararlı bilgi alabilirsiniz. İvme ölçer ve gyro bir arada olan ve çeşitli filtreler ile gürültüyü engelleyebilen gelişmiş sensörlere IMU adı veriliyor. Örneğin 3 eksen ivme ölçer ile 2 eksen cayroyu bu filtreye veya buna benzer filtreler ile bir araya getirirsek buna 5DOF(Degrees of Freedom) IMU diyoruz.

 

 
 







Yukarıdaki şekil-1 ve şekil-2 deki mavi sinyal ivme ölçerin datasından alınan datayı gösterir. Dikkat ederseniz şekil 2 de ivme ölçerden dolayı gürültüler oluşmuş fakat kırmızı sinyal ise bir filtre yardımıyla cayro ve ivme ölçer birleştirilerek oluşturulmuş. Bu sinyalde ise mavi sinyale göre daha kararlı bilgi alınmıştır.  




 

Complementray filtresi hem yüksek geçiren bir filtre hem de alçak geçiren bir filtreden oluşur. Bu filtrenin amacı; Kısa zamanda biz Gyroscope datasını kullanırız çünkü o kısa zamanda daha kararlı bilgi veriyor ve dış kuvvetlerden etkilenmiyor, uzun dönemde ise ivme ölçerlerin datasını kullanırız çünkü kısa dönemde ivme ölçerin çıkışında gürültüler oluşuyor. İşte bu filtre bu seçimi yapmamıza yarayarak sensörleri düzenli şekilde kullanmamızı sağlıyor.  


Alçak geçiren filtre kullanılmasının amacı uzun-süreli değişimlere izin verip kısa-süreli dalgalanmaları filtrelemektir. Yüksek geçiren filtrenin görevine değinecek olursak yüksek geçiren filtre alçak geçiren filtrenin tersi olarak çalışır. Kısa süreli sinyallerin geçişine izin verirken durgun sinyalleri filtreleyen bir filtredir. Jiroskoplarda ölçümlerin doğruluğunu etkileyen en önemli faktör kayma oranı (drift rate) idi. Yüksek geçiren filtre kaymaları elimine etmek için kullanılır.



Filtreli Açı = a × (Gyro Açısı) + (1 − a) × (Accelerometer Açısı)



 t=(a*Ts)/(1-a)   ve  (Gyro Açısı) = (Önceki Gyro Açısı) + ω×Ts


Ts: Örnekleme periyodu, her bir program döngüsü arasında geçen zamandır. Eğer örnekleme oranı 100Hz ise örnekleme periyodu 0.01sn dir,  




a: Bu kat sayısı alçak geçiren ile yüksek geçiren filtreyi ayırt etmemize yarar. Genellikle 0.96 veya 0.98 gibi kat sayılar seçilir.



t: Zaman sabiti. Örneğin; t=(a*Ts)/(1-a)=(0.98*0.01)/(1-0.98) =0.49 bu sonuç jiroskoplara ve ivmeölçerlere güvenilecek sınırları ifade etmektedir. Ve şunu ifade etmektir; Yarım saniyeden kısa periyotlar için jiroskop verileri  önceliklidir ve gürültülü ivmeölçer verileri filtre edilmektedir. Yarım saniyeden uzun periyodlar içinse ivmeölçer verileri jiroskop verilerinden daha önceliklidir.


Şimdilik bu sensörler ve bu filtre hakkında yazacaklarım bu kadar. Her insanda olduğu gibi  yanlışlarım olabilir. Eğer yanlış bir şey görürseniz veya aklınıza ters düşen bir şeyler görürseniz bana mesaj atarak bunu sora bilirsiniz. Umarım sizin için yararlı olmuştur…                                                                                                                                                                                                      


                                                                            HAKAN AYDIN
                                                                           ELEKTRONİK VE HAB. MÜH.
                                                                           YILDIZ TEKNİK ÜNİVERSİTESİ


                                                                                           

Kaynaklar


1)    ADXL320 İVME SENSÖRÜ İLE DİJİTAL SU TERAZİSİ TASARIMI/Yavuz EROL, Murat SERHATLIOĞLU/Fırat Üniversitesi






9)    OTONOM ARAÇLAR için ATALETSEL NAVİGASYON SİSTEMİ GELİŞTİRİLMESİ
10) http://recepkaratas.com/2014/04/05/tamamlayici-filtre/


8 Ocak 2015 Perşembe

ARDIUNO İLE PROCESSİNG ARASINDA ADC UYGULAMASI

 
 
   Bu çalışmam da Ardiuno Uno kitini kullanarak ADC yardımıyla potansiyometreden alınan giriş sinyalini serial port yardımıyla bilgisayara gönderilerek orada Processing diliyle tasarlamış olduğum basit bir yazılım yardımıyla  alınan giriş sinyalini açılan pencerenin arka planın da renk dönüştürücü olarak tasarladım. Bu çalışmanın amacı aslında Processing dilinin nasıl çalıştığını anlamak basit bir böyle çalışma yaparak.
 
 
 

Devre şeması
 
 
 

 Aşağıdaki Processing kodun da yer alan ilk komut şu işe yarar, eğer siz tasarlamış olduğunuz ara yüzün dış ortamla bağlantıda olmasını istiyorsanız import komutuyla "processing.serial.*" kütüphanesi çağırılır.  Ayrıca bir çok kütüphane bu komut ile çağırılır. Sonra onun alt komutunda yer alan Serial port yazılır. Bu komut serial portumuzu tanımlı hale getirilir. Serial port üzerinden aldığımız datayı "parlaklik adlı" değişkenimiz içinde saklarız. " Size" komutu açılan pencerenin boyutunu bize verir. Şu komut "port=new Serial(this,"COM7",9600) " serial port için iletişim aralıkları belirlendi. Dikkat edilmesi gereken nokta Ardiuno'yu PC bağlayınca Ardiuno'nun com portunu doğru şekilde yazmak. Örneğin benim Ardiuno, bilgisayara COM7 diye tanımlı olduğundan  tırnak içinde "COM7" yazıldı. Amacım Processing'in play butonuna basıldığında açılan pencerenin potansiyometreden alınan sinyale göre değiştmirmek olduğundan " background(parlaklik*3,parlaklik/3,parlaklik)" komutu kullanıldı. Yani açılan pencerenin  arkaplanın rengi background ile kontrol edilir. Son olarak bu komut;

void serialEvent(Serial port){

      parlaklik=float(port.readStringUntil('\n'));

}

Serial port'dan verileri almak için kullanılır.  Alınan veri string ifade olduğundan float() komutu ile normal decimal sayıya çevrilir ve onun üzerinde işlem yapılır. Dikkat edilmesi gereken yer, ('\n') bu ifadedir. Her string null karakteri yada diğer ifadeyle "\n" böyle bitiğinden Ardiuno'dan farklı datalar geldiğinden bir önceki ve bir sonraki data bir birinden ayırt edilmesi için kullanılır.



Processing Kodu;

import processing.serial.*; // kütüphane dosyası eklendi
Serial port;

float parlaklik=0;

void setup(){

      size(500,500);
      port=new Serial(this,"COM7",9600);// COM PORT VE ONA UYGUN BAUDRATE AYARLANDI
      port.bufferUntil('\n');
     
}

void draw(){

     background(parlaklik*3,parlaklik/3,parlaklik);

}

void serialEvent(Serial port){

      parlaklik=float(port.readStringUntil('\n'));

}






Ardiuno Kod;

int potPin=0; // ANALOG GİRİŞ YAPILDI.

void setup(){
    Serial.begin(9600); // SERİAL PORT İÇİN İLETİŞİM KURULDU,
}

void loop(){
 
  int val=map(analogRead(potPin),0,1023,0,255);
  //MAP FONKSİYONU İLE POT İLE OKUNAN ADC DEGERİ 0 İLE 1023 ARASINDADIR FAKAT
  //BİZİM İHTİYACIMIZ 0 İLE 255 ARASINDA OLMASI BUNUN İÇİN MAP FONK. KULLANARAK
  //ADCDEN OKUNAN DEĞERİ 0 İLA 255 ARASINDA EŞİT PAYLAŞTIRIR.

  Serial.println(val);// DEĞERİ YAZ.

  delay(50);// ADC BİRAZ YAVAŞ İŞLEM YAPTIGI İÇİN BİRAZ GEÇİKME EKLENDİ.

}

 


Çalışma Videosu;







7 Ocak 2015 Çarşamba

ARDİUNO VE PROCESSING İLE BASİT BİR RADAR YAPMA



Günümüz teknolojisi her gün kendini yenilemekte ve bu nedenle çevremizde olan bütün elektronik eşyaların hepsi akıllı hale geldi. O eşyaları akıllı yapan şey yani onlara zekayı veren mikrodenetleyicilerdir. Eğer onlar olmasa o eşyalara şimdi olduğu gibi akıllı olmazlardı. Aslında akıllı diyoruz ama mikrodenetliyiclere aklı veren de yapması gereken görevleri veren de bizleriz. Onlar bizsiz bir hiçler aslında. Sadece onlar bizden çok daha hızlıdırlar iş yapma konusunda. Bu özelliği sayesinde etrafımızı bu elektronik eşyalar sardı.   

Piyasada bir çok Ardiuno kiti mevcuttur. Ben bu çalışmamda Ardiuno Uno kitini tercih ettim.
      

 Son zamanlarda en çok kullanılan bir mikrodenetleyici kiti olan Ardiuno ile basit radar projesi tasarladım. Bu çalışmada Ardiuno kullanmamın sebebi programlama dili basit ve kolay anlaşılır oluşu ve Ardiuno'nun kaynaklarına kolayca erişilebilir oluşundan dolayı bu çalışmamda Ardiuno kullanmayı tercih ettim. Aynı zaman da yeni keşfettiğim ara yüz tasarlama programı sayesinde bilgisayar ile Ardiuno arasında görsel iletişimi sağladım. Ardiuno kadar oldukça Processing programının dili basittir. Tabi zor yanları da vardır.



  Radar yapmak için nesne ile mesafe sensörü  arasında mesafe ölçmek lazım bunun için bize gerekli olan sensörümüz SRF04. Aşağıdaki resimde olan sensör SRF04 için bir örnektir. Üzerinde bir alıcı bir de verici sensör vardır. Mesafe sensörü mesafeyi ölçerken verici kısımdan bir ses sinyali gönderir ve sonra o ses sinyali nesneye çarpar ve alıcı sensöre geri döner işte bu ses sinyalinin nesneye gidiş ve geliş süresini ardiuno ile hesaplayarak nesne ile sensör arasındaki mesafeyi ölçeriz.

    
 
 

  Bu sensörün 4 adet pini mevcuttur. İkisi GND ve VCC dir. +5V ile beslenmiştir. Diğer ikisi ise TRIG ve ECHO pinidir. Bu pinler bize mesafeyi söyler. Çalışma yapısı şöyledir;


Zaman çizelgesi

  Yukarıdaki zaman diyagramında da görüldüğün gibi ilk olarak Ardiuno'dan mesafe sensörünün TRİG pinine 10us saniye zaman aralığında bir tane tetikleme sinyali gönderilir sonra sensörün verici kısmı sayesinde 8 darbelik 'sonic burst' ses sinyali ortama, ileriye doğru gönderilir. Sonraki kısım mesafe sensör'ün Echo pininden Ardiuno sayesinde dinlemesi gerekiyor sensör ile nesne arasındaki süreyi. Bu süre en erken 100us ile 10ms arasında olamalıdır. Eğer değilse mesafe sensörün önünde herhangi bir engel yok anlamına geliyor. Eğer engel ise Echo pininden aldığımız mesafeye dönüştürme zamanı geliyor demek. Verilecek olan kodda bu işlem verilmiş olacaktır.

  Buraya kadar sadece nesne ile mesafe sensörü arasında olan mesafeyi nasıl bulacağımız anlatmaya çalıştım. Şimdi biz eğer bir radar yapmak istiyorsak etrafa hakim olmalıyız yani etrafı 360 derece taramalıyız ve bunun için bize gerekli olan şey bir servo motor. Bu motor hakkında daha önce nasıl çalıştığını anlatmıştım SERVO MOTOR KONTROL-1 çalışmamda. Mesafe sensörü servo motor üstüne doğru şekilde yerleştirilmiştir. Benim elimdeki servo 180 derece döndüğünden sadece etrafı 180 derece tarayabildim.

Artık şimdi elimde hem nesne ile mesafe sensör arasındaki uzaklık sinyali hem de servonun hangi açıda durduğu hakkında bilgi var işte bunları Ardiuno Serial Port yardımıyla bilgisayara oradan Processing dili ile tasarlamış olduğum ara yüze gönderdim.


Ardiuno kodu;


#include<Servo.h>
#define ECHOPIN 7  // Pinleri önceden tanımladım
#define TRIGPIN 8

const int servoCikis=9;
int servosagsol=0;
Servo servoMotor ;
unsigned long anlik_mesafe=0;

void setup(){
      Serial.begin(9600);
      pinMode(ECHOPIN, INPUT);
      pinMode(TRIGPIN, OUTPUT);
      servoMotor.attach(servoCikis);
}

void loop(){

    servoMotor.write(0); // servo başlangı. konumına getirildir yani 0 dereceye.

    for(servosagsol=0;servosagsol<=179;servosagsol++){
         servoMotor.write(servosagsol); //servo soldan sağa git
         GonderPc(mesafem() , servosagsol);   // alt programa gönderdi.
         delay(5);
    } 

    for(servosagsol=179;servosagsol>=0;servosagsol--){
         servoMotor.write(servosagsol);//servo sağadan sola git
         GonderPc(mesafem() , servosagsol);   
         delay(5);
    }
         
}

void GonderPc (int DISTANCE , int POS){
   Serial.print("b");Serial.print(DISTANCE);
   Serial.print(","); Serial.println(POS);
   delay(100);
}

float mesafem(){
 
        digitalWrite(TRIGPIN,LOW);
        delayMicroseconds(2);
        digitalWrite(TRIGPIN,HIGH);
        delayMicroseconds(10);// Kaynaklara göre en az 10us saniye olamalı
        digitalWrite(TRIGPIN,LOW);
   
        float echo_zamani=pulseIn(ECHOPIN,HIGH);// 1 kalma süresi ölçüldü
                                                //engelle  arasındaki zaman   
       anlik_mesafe=echo_zamani/58; //cm çevirmek için 58 bölündü.
                                  
  return(anlik_mesafe);   

}

Processing Kodu;


import processing.serial.*;// serial port kütüphanesi eklendi

Serial benimport;  // tanımlama yapıldı.
int servpozisyon = 0; // SERVODAN GELEN DEĞER
int nesneMesafe = 0; // MESAFE SENSÖRÜNDEN GELEN DEĞER

void setup(){
  int r;
  int S_L = 1000;
  r = S_L / 2;
 
   size(1040,550);// AÇILAN PENCERENİN BOYUTU
     
   PFont benimFontum;
   benimFontum = createFont("Verdana", 16); // TEXT için yapılandırmalar. Karekterin boyutu ayarlanır değer degiştirilerek.
   textFont(benimFontum);
 
   benimport = new Serial(this, "COM7", 9600); // ÖN AYARLAR HABERLEŞME İÇİN
   benimport.bufferUntil('\n');
  
   background(100,0,255);   // ARKA PLAN RENGİM
   fill(10,200,300);
   ellipse(500,500,1000,1000);
   ellipse(500,500,900,900);
   ellipse(500,500,800,800);
   ellipse(500,500,700,700);
   ellipse(500,500,600,600);
   ellipse(500,500,500,500);
   ellipse(500,500,400,400);
  

   for (int i = 0; i <= 6; i++) {
     strokeWeight(2); // çizgileri kalınlaştırma
     stroke(0,120,0); // çizgilerin rengini ayarla
     line(r, r, r + cos(radians(180+(30*i)))*S_L /2, r + sin(radians(180+(30*i)))*S_L /2);
     fill(255, 255, 255);
     noStroke();
     text(Integer.toString(0+(30*i)), r + cos(radians(180+(30*i)))*S_L /2, r + sin(radians(180+(30*i)))*S_L /2, 60, 60); 
  }
 

  text("0 cm",   500, 480, 250, 50);
  text("10 cm",  500, 430, 250, 50);
  text("20 cm",  500, 380, 250, 50);
  text("30 cm",  500, 330, 250, 50);
  text("40 cm",  500, 280, 250, 50);
  text("50 cm",  500, 230, 250, 50);
  text("60 cm",  500, 190, 250, 50);
  text("70 cm",  500, 140, 250, 50);
  text("80 cm",  500, 90, 250,  50);
  text("90 cm",  500, 40, 250,  50);
 
   fill(247, 240, 25);//http://www.rapidtables.com/web/color/RGB_Color.htm
   noStroke(); //çizelecek nesnenin çizim rengini belirler
   text("http://muhhakanaydin.blogspot.com.tr", 335, 500, 400, 50);
   text("MUH. HAKAN AYDIN", 335, 520, 500, 40);
  
  fill(0);
  text("HEDEF", -450, -450);
  fill(30,20,30);
  ellipse(-460,-456,10,10);

}


void draw(){
         
        fill(255);
        text("AÇI: "    +Integer.toString(servpozisyon), 40, 500, 400, 25);   text("DERECE", 200, 500, 400, 50);   //Integer.toString(A); A sayınını Stringe çevir
        text("MESAFE: "+Integer.toString(nesneMesafe), 40, 520, 400, 25);  text("cm", 200, 520, 400, 50);       // text(string, x, y, genişlik, yükseklik)
       
 
        fill(30,20,30);// çizilecek oland daire içini fill komutu ile renklendir.
        translate(500,500);// yarım daire için merkezlendirme yapıldı
        point (0,0);
        ellipse(nesneMesafe * -1*cos(servpozisyon*PI/180) , -1*nesneMesafe * sin(servpozisyon*PI/180) , 5,5);  /* Mesafe ile sensöründen yansıyan engelin yeri daire belirlenir */   
      
    
}
void serialEvent (Serial benimport) {   // PC İLE ELEKTRONİK KARTIN HABERLEŞME PROGRAMI
 
  String gelen_datam = benimport.readStringUntil('\n');//Genellikle string ifadeler null(\n) karakteriyle sonlanır
                                                       // yeni string ifadesi geldiğinde eskiyle yeninin arasında bir ilişki kurmak için  
 
  if (gelen_datam != null) { // eger bitiş yoksa. String karakterleri null ile biter.
   
    gelen_datam = trim(gelen_datam); // whitespace kurtulmak için.
   
    String nesMesafe = gelen_datam.substring(1, gelen_datam.indexOf(",")); // STRİNG İÇİN BAŞLANGIÇ VE BİTİŞ PARAMETRESİ.    
                                                                  
    String servoPos = gelen_datam.substring(gelen_datam.indexOf(",")+1, gelen_datam.length()); //indexOf(","); virgül karakterin nerde oldugunu bulur. 
   
    servpozisyon = Integer.parseInt(servoPos);//Stringleri integere bir sayıya çervirmek

    nesneMesafe = 5*Integer.parseInt(nesMesafe);//için bu komutlar yazıldı yoksa üzerinde
                                              //işlem yapamazdık. 
                                         
                                        
  } 
  
}

Çalışma Videosu