21 Ocak 2015 Çarşamba

Arduino UNO ile Quadcopter Yapmak Mümkün mü? -7-

                   
                      Image Hosted by ImageShack.us
(Resim alıntı olup, temsilidir.)

Merhaba arkadaşlar bu gün kü paylaşımımız da hava aracı ile ilgili yön hareketlerden bahsedeceğim. Daha önce de hava aracımızın iki motorumuzun CW, diğer iki motorumuzun CCW yönde hareket etiğini ve böylece merkezkaç kuvvetinin sıfırlanarak havada dengede kaldığını söylemiştik. Şimdi bu dört motorun hız kontrollerinden ve hava aracımızı sağa, sola, ileri, geri, kendi ekseni etrafında dönme ve yükselme gibi noktalardan bahsedeceğim.

                                          

Limitasyonlar ve Sonrası
  • Öncelikle quadımızın uçuşa hazır hale gelmesi için motorlarımızın arm olması gerekmektedir. Bunu yapmak için iki yol vardır. Birincisi motorları kontrol edeceğimiz min. ve max. pwm değerlerinin motora göndermek. İkincisi ise motorlara küçük bir sinyal göndermek, peki bunu nasıl yapacağız? Şimdi farz edelim ki motorları 0-255 arası kontrol ediyoruz ve motorları pot ile kontrol edeceğiz. Pot'u yavaş yavaş çok az çeviriyoruz ve motordan bir kaç kez bipleme sesi duyduktan sonra duruyoruz sonrasında pot'u çevirdiğinizde motorlar çalışacaktır. Buradaki nokta başlangıçta bipleme sesini duyduğumuz ana kadar olan değeri öğrenmek. Bunun içinde pot ile kontrol ederken pot değerinin ayn zamanda serial monitorde görüntülersek bu değere ulaşabiliriz. Artık bu değeri uçuş öncesi motorları arm yapmak için kullanacağız.
  • Hava aracın yükselmesi için dört motorumuz üretmiş olduğu thrust yani kaldırma kuvveti, hava aracı ağırlığından fazla olmalıdır. Örneğin hava aracı toplam 1 kg ağırlığında olsun. Motorlarımızın da her biri 500 gr thrust üretmiş olsun, dört motor ile toplam 2 kg thrust alabiliyoruz ve motorları 0-255 arası kontrol edelim. Motorlara 255 değerini gönderirsek ne olur, full thrust alırız bu durumda quad fırlayıp hemen yükselişe geçecektir. Bu değer çok fazla oldu tabi bizim için önemli nokta en az hava aracının ağırlığından fazla elde edebileceğimiz thrust değerini bilmek. Bunun içinde en güzel yöntem deneme yanılma yöntemini uyguluyoruz. Nasıl yapıyoruz peki? Şöyle hava aracına 100 den itibaren değer gönderiyoruz ve bi değerden sonra hava aracı yükselmeye başlayacaktır ve bu değeri not ediyoruz atıyorum örneğin 130 dan sonra havalanmaya başladı ve 130'dan itibaren verdiğiniz büyük değerlere göre quad yükselmeye devam edecektir.
  • Hava aracının havada asılı kalması için biraz önce motorlara gönderdiğimiz pwm değerlerinden quad'ın ağırlığına eş değer gelen pwm değerini buluyoruz. Bunun içinde biraz önce 130'dan sonra havalanmaya başladı demiştik, demek ki quad ağırlığına eş değer gelen pwm değeri 125-130 arası bir şey ve bu değeri tam olarak net alıp yine not ediyoruz. Şimdi örneğin hava aracımız havada ve üzerinde mesafe ölçerim iz var, yerden iki metre yükseldiğinde havada asılı kalmasını istiyoruz. Bunun içinde ne yapıyoruz, mesafe ölçer den aldığımız değer 2 metre ise motorlardan biraz önce not aldığımız quad'ın ağırlığına eş değer gelen pwm değerini gönderiyoruz. Böylece quad ağırlığı ile motorların üretmiş olduğu thrust aynı olduğu için hava aracı yükselmeye devam edemeyecek. Alçalmak içinde aynı şekilde motorlar quad'ın ağırlığından daha az thrust üretmeye başladığında alçalmaya başlayacaktır. Yani pwm değerini <125-230 'dan itibaren düşürmeye başladığımızda.
  • Hava aracımızın kendi etrafında dönmesi için dönülmek istenen yöndeki motorların hızı arttırılırken diğer iki yönde dönen motorların hızı azaltılır.Örneğin sağa dönülmek isteniyorsa yukarıda çizmiş olduğum resme baktığımızda sağ yani saat yönünde dönen motorlarımız 2 ve 3 nolu motorlar, dolayısıyla 2 ve 3 nolu motorların hızlarını biraz arttırıyoruz, diğer 1 ve 4 nolu motorlarımızın hızını biraz düşürüyoruz.
  • İleriye, geriye,sağa ve sola hareket ettirmek için de hangi tarafa gidilmek isteniyorsa diğer tarafın motorlarının hızları arttırılır. Nasıl yani? Şöyle örneğin quad'ın ileriye gitmesini istiyoruz, 1 ve 2 nolu motorların olduğu taraf bizim önümüz olsun . 1 ve 2 nolu motorların hızlarında değişme olmaz iken 3 ve 4 nolu motor hızlarını arttırıyoruz ve quad'ta 0-45 derece arası bir eğilme oluyor ve ileriye gitmemizi sağlıyor.
  • Geriye gitmek isteseydik nasıl olacaktı bu kez tam tersi 1 ve 2 nolu motorların hızları arttırılırken diğer motorlar hızlarını koruyacaktı.
  • Sağ ve sol yönde hareket etmede aynı şekilde gerçekleşmektedir. Sağa hareket için 1 ve 3 nolu motorlaın hızları arttırılırken  2 ve 4 nolu motorların hızında değişme olmayacak. Sola hareket ise bunun tam tersi olacaktır.
  • Kendi ekseni etrafında, sağa ve sola dönme ile ilgili şöyle farklı bir tasarım yapabilirsiniz aynı helikopterlerde olduğu gibi quad'ın arkasına bir kuyruk motoru ekleyerek  kullanabilirsiniz, aşağıdaki çizmiş olduğum resimde görüldüğü gibi. Böyle ilginç bir tasarım olabilir.
                                                           
  • Bir diğer farklı tasarım ise quad'ın ileri ve geri haretini yapmak için motor hızları ile hiç uğraşmamak için quad içerisine yerleştireceğiniz  bir servo, dişli, kayiş-kasnak sistemi ile quad'ın her iki tarafını 0-45 yada farklı açılarda kontrol edebilirsiniz. Tabi bunun için motorlar boru profile montajı yapılmalıdır, fazladan servo, dişli, kayiş-kasnak, rulman kullanılmaldır ve kayiş tek parça olmalıdır. Aslında bu biraz fazladan maliyet olarak görünse de biraz ölçü olarak büyük qua'lar için güzel bir yöntemdir.
  
  • Quad havada iken rüzgar vs. çeşitli sebeplere karşı dengesini koruması için imu'u kullanacağız. Quad yerde iken imu kalibrasyon işlemi yapılarak roll, pitch, yaw açı değerleri tam şekilde yapılmalıdır.
  • Örneğin havada quad rüzgardan dolayı sağa doğru yatmaya çalışıyor bu durumda ne yapmamız gerekir?
  • Biraz önce ne demiştik quad'ın hangi tarafa gitmesini istiyorsak diğer taraftaki motorların hızını arttırılır. Bu durumda quad sağa doğru yatmaya zorluyor ise sağa daki motorların hızını arttırılarak dengelenmelidir. Bunu da imu ile kod içerisinde atıyorumeğer sağa doğru 10 derecelik bir yatma olursa sağa daki motorun hızlarını o anki değerinden +30 arttır diyereke quad'ı denegede tutmaya çalışacağız. Bu durum tüm yönler için geçerlidir.
  • Burada önemli olan bir diğer nokta imu kalibrasyon işlemi her uçuş öncesinde düz bir zeminde yapılmalıdır.
  • IMU ile düzgün bir ölçüm yapılarak motor hızları sürekli bu imu verilerle birlikte hareket etmelidir. Hangi yöne doğru bir eğilme, yatma olursa bunu imu'muz hemen ölçüp kod içerisinde yazdığımız koda göre hareket etmelidir. Artık bu noktadan sonrası biraz önce sırasıyla not ettiğimiz verileri kullanarak iyi pid algoritması ile kod yazmaktır. Biraz önce ettiğimiz notlar pid'de bizim set point'lerimizi oluşturmaktadır.

14 Ocak 2015 Çarşamba

[ Arduino & C#.Net & SQL Uygulamaları #15 ] Pot Okuma, Gösterme ve SQL Veri Tabanına Kaydetme

 
Merhaba arkadaşlar bu günkü uygulamamız daha önce sizlerle paylaştığım bir uygulamanın aynısı olacak sadece ufak bir değişiklik olacak. Uygulamamız Arduino'muzun analog 0.pinine bağlı olan pot'tan 0-1023 arası analog degerleri alıp form üzerinde göstermekle birlikte bu değerleri SQL veri tabanına kaydetmek. Verilerin kayıt edilebilirliği her zaman büyük önem taşımaktadır. Çoğu zaman Arduino ile çalışmalarımızı, projelerimizi özellikle sensor projelerimizde belki istediğimiz değerleri alıyoruz ama bu değerleri saklamakta zorluk çekiyoruz.. Bu yüzden önemli bir uygulama, burada pot'tan verileri alıp kayıt edebiliyorsak  hangi sensor olursa olsun verilerimizi aynı şekilde Sql veri tabanına saklayabiliriz. İlerleyen zamanlarda Access veri tabanında uygulamalar ve MS Excell veri tabanı uygulamaları da sizlerle paylaşacağım.

  • Arduino'a bağlandıktan sonra pot'tan okuduğumuz değerler textbox üzerinde görüntülenip aynı zamanda SQL veri tabanına kayıt edilmektedir ve Göster butonuna tıklandığında alt kısımda yer alan datagridview de görüntülenmekte dir.
  • Veriler 1 saniye aralıklarla gelmektedir.
Video birazdan eklenecektir.


 

11 Kasım 2014 Salı

[ Arduino & C#.Net Uygulamaları #14 ] Trackbar ile Led'in Parlaklığını Ayarlama

 

Merhaba arkadaşlar bu günkü uygulamamız eminim daha önce hepimizin yaptığı bir uygulamayı yaptık. Potansiyometre ile led parlaklığını ayarlama, tabi burada pot kullanmadık, onun yerine trackbar kullandık C#.Net üzerinde oluşturduğumuz trackbar ile Arduino'muzun digital 11. pinine bağlı olan Led'in parlaklığını ayarladık ve 0-255 değerlerini de trackbar yanında yer alan textbox ile görüntüledik.Trackbar max. ve min. değerleri 0-255 olarak ayarlandı, bu değer Arduino tarafında val isimli integer tipinde değişkende tutulmaktadır. Timer interval değeri 100 ms olarak ayarlanmıştır. Bu ne demek her 100 ms'de timer_tick eventi gerçekleşiyor.

  • Arduino ve C# kodlarına ulaşmak için buraya tıklayın;
   

20 Ekim 2014 Pazartesi

Arduino UNO R3 - C# Arayüzü ve Araba Kontrolü

 


Merhaba arkadaşlar bugünkü Arduino- C# uygulamamız arabayı C#.Net üzerinden ileri, geri, sol,sağ ve dur şeklinde kontrol etmek. Kısaca ayrıntılardan bahsedeyim;
  • Bu uygulama Arduino UNO R3 ve  L298 Motor sürücü ile iki, yada dört tekerlekli bir araba yaptığınızı düşünerek yapılmıştır.
  • Bağlantı portunu girip Bağlan butonuna tıklayıp, bağlantı sağlandıktan sonra arayüzde gördüğünüz üzere yön kontrolleri ile ilgili 5 adet buton bulunmaktadır, ve bu butonlardan herhangi birine tıkladığınızda Arduino'a bir karakter göndermektedir.
  • Arduino'da bu karakter x isminde char tipindeki değişkende tutulmaktadır.
  • Bu değişkenler alındıktan sonra Arduino tarafında dc motorları kontrol etmek için gerekli  "HIGH- LOW" verilmelidir.
  • L298 Motor Sürücü ile iki adet dc motor kontrol edilmektedir.
  • İki dc motor için dört adet input pini vardır, bunlardan ikisi birinci motor, diğer ikisi de ikinci motor içindir ve bu pinlere gerekli high, low'lar verilerek cw, ccw yönünde hareket sağlanmaktadır.
  • Entegre etmek için bu pinleri Arduino'da tanımlayın, setup kısmında çıkış olarak atayın ve son olarak ta aşaıdaki resimde gördüğünüz üzere if'li kısımlar içine gerekli HIGH LOW'lar yazın yapmanız gereken şey bu kadar. Kolay gelsin..
  • Arduino ve C# kodlarına ulaşmak için buraya tıklayın;



  

14 Ekim 2014 Salı

Arduino UNO R3 - Analog Input ( Potansiyometre) Okuma, GUI Tasarımı ve Anlık (Reel Time) olarak C#' ta Gösterilmesi ve "Map Fonksiyonu" Kullanımı

 

Merhaba arkadaşlar, daha öncede benzer paylaşımlar yapmıştım, linkleri yukarıda mevcut. Kısaca önceki uygulamaları ve bu uygulamayı açıklayayım. Önceki uygulamalarda;
  • Arduino'muzun analog 0. pinine bağlı pot'tan 0-1023 arası adc değerlerini okuyup C#'a aktarmıştık ve C# üzerinde bu değerleri textbox üzerinde görüntülemiştik ve bu değerlere bağlı olarak progressbar üzerinde de görmüştük.
  • Bu uygulamada aynı şekilde 0-1023 adc değerleri textbox'ta ve progressbar da gösterilmiş olup buna artı olarak Arduino'da sık sık kullanmış olduğumuz map fonksiyonu kullanılarak 0-1023 arası adc değerleri 0-255'e çekilerek yine aynı şekilde ayrı birer textbox'ta ve progressbar üzerinde gösterilmiştir.
  • Progressbar1 maksimum ve minimum değerleri 0-1023 olarak ayarlanmış olup, diğer progressbar2 ise 0-255 olarak ayarlanmıştır.
  • Sonuç olarak Arduino'muzun analog 0. pinine bağlı olan pot'tan okumuş olduğumuz 0-1023 adc değerlerini C# map fonksiyonu kullanarak 0-255'e çektik ve gösterdik.
  • Bunu direkt Arduino üzerinden 0-255'e çekipte gönderemez miydik? Tabiki yapabilirdik, buradaki amaç C# üzerinde bunu yapabilmek.C# üzerindeki map fonksiyonu kod yapısı aşağıdaki resimde görülmektedir.
  • Video'u kısa süre içerisinde eklenecektir.
  • Arduino ve C# Kodlarına ulaşmak için buraya tıklayın;