15 Şubat 2014 Cumartesi

İnsansız Hava Araçları (İHA)


İnsansız hava aracı (İHA) hava akımı ve tahrik kuvvetlerinden yararlanarak uçabilen yerden kumanda edilen ya da otonom yani belli bir uçuş planı üzerinden otomatik hareket eden, uçuş için içerisinde bir pilota ihtiyaç duymayan hava aracı tipidir. İHA’lara yerden kumandalı hava aracı manasına gelen “drone” da denilmektedir. İlk İHA 1916 senesinde Archibald Low tarafından geliştirilmiştir. İlk kez 1. Dünya Savaşı’nda sınırlı sayıda üretilen  Hewitt-Sperry otomatik uçakları savaş alanlarında kullanılmıştır. Günümüzde özellikle savunma alanında talebin arttığı bir sistem olmakla birlikte, üzerine olan çalışmalar gün geçtikçe artmaktadır. Esas olarak keşif amaçlı üretimleri yapılan İHA’lar saldırı görevini de yerine getirerek ülkelerin ana araştırma konusu arasına girmiştir. Fakat birçok sivili vurması başarısız yanlarının olduğunu, üzerine daha fazla çalışılması gerektiğini göstermektedir. Bu tarz araçlar başta askeri araştırmalarda keşiflerde olmak üzere uzaktan algılama, jeofizik araştırmaları, güvenlik, taşıma ve yangın söndürme gibi birçok farklı alanda kullanılabilmektedir. İnsanlar için daha da önemlisi yetiştirilmesi zor pilotlar için çalışma alanı tehlikeli olan ortamlarda kullanımları artmaktadır.
İHA 'lar avuç içi büyüklüğünden, kanat açıklığı 20 m boyu 10 metrelere ulaşan ebatlarda farklı amaçlar için kullanılabilecek şekilde olabilmektedirler. Elden atılan modellerinin yanı sıra elektrik motoru, jet motoru ya da piston motoru kullanan modelleri mevcuttur. Kullanım alanlarına göre yükselebilecekleri irtifa değerleri de değişmektedir. Menzillerine ve kullanılan motor tipine göre İHA’lar arasında sınıflandırmalar yapılmıştır.
Günümüzde İHA kategorisi içerisinde dikey iniş-kalkış yapabilmesinden, basit yapısından ve havada asılı kalmasından dolayı multikopter sistemleri rağbet görmektedir. Multikopter sistemleri çok motorlu insansız hava araçları olarak tanımlanır. 3-4-6-8 motorlu üretilen multikopterler stabil uçuşlar ve özellikleri sayesinde izleme, arama kurtarma ve savunma alanında İHA’lar arasında ilk sıralar da yerini almaya başlamıştır. Özellikle qoadrotor (quadrokopter) üzerine yapılan çalışmalar bu sistemler içerisinde fazlalık göstermektedir.

Kontrol yapısının karmaşık olması gelişimlerini yavaşlatsa da son birkaç sene içerisinde farklı alanlarda kullanımları yaygınlaşan quadrotor sistemleri ülkemizde keşif ve görüntüleme hizmetleri için kullanılmaya başlanmıştır. Dolayısı ile üzerine olan çalışmalar ve farklı modellemeler sayesinde savunma amaçlı kullanımları yadsınamaz bir gerçektir.

Arduino Accelerometer (İvmeölçer) TFT Uygulaması


Arduino, daha önceden de bahsettiğimiz gibi birçok farklı donanımla kullanılabilmektedir. Bu yazımızda bir ivmeölçerden okuduğumuz sensör değerlerinin belli işlemlerden sonra anlaşılır ifadeler ile TFT (thin film transistor) ekrana yazdırılmasından bahsedeceğiz.

İvmeölçer yada akselerometre olarak isimlendirilen sensör üzerilerine düşen statik yada dinamik ivmeyi ölçerler. Yani belli bir hareketlenmeyi ölçmek için kullanılırlar. Özellikle son yıllarda gelişen akıllı telefonlarda da bu sensör kullanılmaktadır. Ekranın çevrilen yöne döndürülmesi için kullanılır. Sensör kartı üzerinde her eksenin (x,y,z) çıkışı vardır. Sensör üzerine etki eden yerçekimi kuvveti sayesinde eğim ölçmek için kullanılan bu sensörlerden okunan değerler "g" değerine yada açı değerine çevrilerek anlamlı hale getirilir. "g" değeri olarak tanımlanan ifade aslında yerçekimi kuvvetidir. Yani 9.8m/s2 dir.Tabi bu değer konuma göre değişiklik gösterebilmektedir. Bu değişikliğin ölçülmesi yada sensörün çalışması, sensör üzerine düşen basınçla ilgilidir. Anlamayı kolaylaştırmak açısından şu örnek verilebilir. Sensörün yere göre paralel olduğunu düşünelim. Paralellik bozulduğunda farklı eksenler üzerine etkiyen basınç farklı olacağından sensörün piezoelektrik özelliği sebebi ile eksenlerde farklı voltajlar üretilir. Böylece elde edilen bu değerler ile belli transfer yada dönüştürücü fonksiyonlar kullanılara "g" değeri yada açı bilgisine ulaşılır.

Bu sensörlerden dijital olanlar, özellikle günümüzde uçak kanatlarında titreşim algılayıcı olarak, mini İHA (insansız hava araçlarında)'larda , İHA'nın yere paralel durması için jiroskop sensörü ile kullanılırlar.

Bu uygulamada kullanılan sensör ADXL335 ivömeölçeridir. Üzerinde bulunan pinler ve arduino pin bağlantısı  verilen örnek koda göre şu şekildedir:

İvmeölçer pinleri                                           Arduino Pinleri
          Z                                                               A1
          Y                                                              A2
          X                                                              A3
       GND                                                         GND
       VCC                                                          3.3V

TFT lcd ekranlar ince film tabakalerından oluşmaktadır. Arduino modellerine uygun TFT shieldları sayesinde herhangi bir kablolamaya ihtiyaç duymadan direk kartın üzerine monte edilebilirler. TFT ekranlar normal satır sütün sayısı belli olan (16*2 lcd ekran) lcd ekranlara göre daha profesyonel ve kullanışlıdır. Görsellik sunması açısından birçok projede kullanılabilmektedir. Mesela yapılan uygulamada okunan sensör değerlerinin direk bu ekran üzerine yansıtılması yada çeşitli animasyonlar ile bunların sunulması hazırlanan donanımın göze hitap etmesini sağlar. TFT ekranların kullanılabilmesi için gerekli olan bazı kütüphaneler mevcuttur. Bunlar ilgili sitelerden indirilerek Arduino kurulum dosyası içerisindeki library klasörüne eklenir. Bu uygulamada kullanılan TFT ekranın kütüphanesi olan UTFT.h kütüphanesi library klasörüne eklenmiş ve kod içerisinde bu kütüphane çağrılmıştır. Eğer uygun shield yoksa bağlantılar harici kablolama ile yapılmalıdır. Bu uygulamada kullanılan tft bağlantı pin diyagramı ve arduino bağlantı şeması bu linkte mevcuttur. 

İlgili çalışma videosunu ise bu linkten izleyebilirsiniz.


Uygulama kodu:


#include <UTFT.h>
#include <math.h>

#define ref_volt 2.56 //analog girislerden okunan deger icin atanmistir

#define zero_x 1.5 //kullanilan akselerometrenin datashetinde yazan zerog degeri
#define zero_y 1.5
#define zero_z 1.5

#define hassasiyet_x 0.3 //sensor datashetinde yazan sesitivity oranlari
#define hassasiyet_y 0.3
#define hassasiyet_z 0.3

const int xpin = A3; //Arduino uzerine ivmeolcer pin baglanti portlari
const int ypin = A2;                  
const int zpin = A1; 
 
unsigned int x_deger; //pinlerden okunan degeri tutan degisken
unsigned int y_deger;
unsigned int z_deger;
 
float xg;  //hesaplanacak "g" degerlerini tutmak icin atanan degisken
float yg;
float zg;
 
float x_aci;  //hesaplanacak aci degerlerini tutmak icin atanan degisken
float y_aci;
float z_aci;
 
extern uint8_t SmallFont[]; //Kullanilan UTFT ekrani icin gerekli tanimlamalar
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
 
UTFT myGLCD (ITDB32S,38,39,40,41); //Kullanilan UTFT nin tanitilmasi
 
void setup()
{
 
  myGLCD.InitLCD();
  myGLCD.clrScr();
 
  analogReference(INTERNAL2V56); //analog pinlerden okunacak sensor degerlerinin referans voltajı 2.56 V olarak tanimlandi
  Serial.begin(9600);
 
}
 
void loop()
{
 
  myGLCD.clrScr();
  myGLCD.setColor(VGA_BLACK); //UTFT ekran icin yazi tipi ve rengi gibi bilgiler
  myGLCD.setFont(BigFont);
 
  myGLCD.drawRect(10,10,310,230);  //Bir kare cizilir
  myGLCD.setColor(VGA_GREEN);
 
  x_deger = analogRead(xpin); //sensor bacaklarinin baglandigi pinlerden analog cikislar okunur      
  y_deger = analogRead(ypin);      
  z_deger = analogRead(zpin); 
 
  xg=(x_deger/1024.0*ref_volt-zero_x)/hassasiyet_x;  //Kullanilan bu formul ile "g" dgeri hesaplanir
 
  Serial.print("x ekseni 'g' degeri:  ");
  Serial.print(xg);
  Serial.print(" g");
  Serial.print("\n");
 
  myGLCD.print("X; g=",15,20);
  myGLCD.printNumF(xg,1,100,20);
  myGLCD.print(" g",205,20);
 
  yg=(y_deger/1024.0*ref_volt-zero_y)/hassasiyet_y;
 
  Serial.print("y ekseni 'g' degeri:  ");
  Serial.print(yg);
  Serial.print(" g");
  Serial.print("\n");
 
  myGLCD.print("Y; g=",15,40);
  myGLCD.printNumF(yg,1,100,40); //(sayi,fractinol part(1-5),x koord.,y koord.)
  myGLCD.print(" g",205,40);
 
  zg=(z_deger/1024.0*ref_volt-zero_z)/hassasiyet_z;
 
  Serial.print("z ekseni 'g' degeri:  ");
  Serial.print(zg);
  Serial.print(" g");
  Serial.print("\n");
 
  myGLCD.print("Z; g=",15,60);
  myGLCD.printNumF(zg,1,100,60);
  myGLCD.print(" g",205,60);
 
  x_aci=atan2(-yg,-zg)*57.2957795+180; //atan2 fonksiyonu arctanjanti bulur
//57.2957795 sayisi radyanin dereceye cevrilmis halidir.
//1 rad 180/pi dir.
  Serial.print("X ekseninin aci degeri: ");
  Serial.print(x_aci);
  Serial.print(" derece");
  Serial.print("\n");
 
  myGLCD.print("X; aci=",15,90);
  myGLCD.printNumF(x_aci,1,130,90);
  myGLCD.print(" deg",240,90);
 
  y_aci=atan2(-xg,-zg)*57.2957795+180;
 
  Serial.print("Y ekseninin aci degeri: ");
  Serial.print(y_aci);
  Serial.print(" derece");
  Serial.print("\n");
 
  myGLCD.print("Y; aci=",15,110);
  myGLCD.printNumF(y_aci,1,130,110);
  myGLCD.print(" deg",240,110);
 
  z_aci=atan2(-xg,-yg)*57.2957795+180;
 
  Serial.print("Z ekseninin aci degeri: ");
  Serial.print(z_aci);
  Serial.print(" derece");
  Serial.print("\n");
 
  myGLCD.print("Z; aci=",15,130);
  myGLCD.printNumF(z_aci,1,130,130);
  myGLCD.print(" deg",240,130);
 
  delay(1000);
}


10 Şubat 2014 Pazartesi

Arduino - Potansiyometre - Servo - 2x16 LCD

          Arduino geliştirme kartlarının kısa sürede yaygınlaşma sebebi, bilindiği üzere birçok aygıtla uyumlu bir şekilde kullanılabilmesi ve değişik aygıtlar için hazır kütüphanelere sahip olmalarıdır. Hazırlanan kütüphaneler http://www.arduino.cc/ sitesinden indirilebileceği gibi bazıları farklı kaynaklardan da elde edilebilir.
          Arduino için indirilen kütüphaneler Arduino IDE' nin kurulduğu dosya içerisinde "library" klasörüne eklenerek kullanılır. İndirilen kütüphane bu dosyaya yüklendikten sonra Arduino IDE yeniden başlatılmalıdır. Fakat bazen kütüphanenin ilgili dosyaya yüklenmesi durumunda dahi hata alınıyorsa sebebi "Sketchbook location" adresinin Arduino IDE programının kurulduğu adresi göstermemesi olabilir. Bu sık karşılaşılan hatalardandır. Bunu ortadan kaldırmak için Arduino IDE programından "File/Preferences/Sketchbook location Browse" linkleri ile kurulum adresi doğrulanır (Şekil 1). IDE programı yeniden çalıştırıldığında hata vermeyecektir. 


Şekil 1

          Bu uygulamamızda analog sensörden, sensör çıktısının nasıl okunduğunu, bir servo motorun nasıl kontrol edildiğini ve lcd kullanımını göreceğiz.
       
          Arduino üzerinde, çeşitlerine bağlı olarak farklı sayılarda analog ve dijital giriş/çıkış pinleri mevcuttur. Bu giriş/çıkış pinleri sayesinde kart farklı sistemler ile haberleşebilir, farklı sistemlerden veri okuyabilir ve onları kontrol edebilir. Örneğin Arduino UNO' da 6 analog pin (A0-.....-A6) , MEGA' da 16 (A0-......A15) analog pin mevcuttur. Bu pinlerden okunan değerler 6 kanallı A/D (Analog/Dijital) dönüştürücüye gönderilerek okunan 0-1023 arası analog değer 0-5V arasında bir değere dönüştürülür (maplenir). Buradaki 5V default değerdir. İstenildiği taktirde analogReferance() komutu ile bu değer değiştirilebilir. Kullanımı http://arduino.cc/en/Reference/AnalogReference sayfasından incelenebilir.

          Arduino ile analog bir sensör verisi analogRead() komutu ile okunur. Parantez içerisine sensörün çıkış pininin bağlandığı arduino analog pini yazılır. Analog bir aygıtın (örneğin analog servo) arduino ile kontrol edilmesi için analogWrite(pin_Sayisi,analog_Deger) komutu kullanılır. Parantez içerisindeki pin_Sayisi analog aygıtın bağlandığı arduino analog pin numarasını, analog_Deger girilecek analog değeri ifade etmektedir.

          Arduino ile servo motor kontrolü için genellikle Servo.h kütüphanesi kullanılır. Bu kütüphane indirilen IDE içerisinde mevcuttur. Kütüphanenin kullanılabilmesi için arduino koduna eklenmesi gerekmektedir. Bu #include<Servo.h> komutu ile yapılmaktadır. Bu kütüphanenin kod içerisinde nasıl kullanıldığı ve servo motor kontrolünü nasıl yaptığı aşağıdaki kod üzerinde açıklanmıştır.

           2x16 LCD' nin Arduino ile kulanılması için LiquidCrystal.h kütüphanesinin yüklenmesi gerekmektedir. İndirilen IDE içerisinde yüklü olanların direk olarak kod içerisinde bu kütüphaneyi çağırmaları yeterli olacaktır. Bu uygulamada kullanılan LCD üzerinde bir de sıcaklık sensörü bulunmaktadır. Bu sensörün de nasıl kullanıldığı aşağıdaki kodda açıkça anlatılmıştır. İlgili çalışma videosu http://www.youtube.com/watch?v=OhQKJ9Zm6UU&feature=youtu.be adresinden youtube kanalımdan izlenebilir.


#include<LiquidCrystal.h> //lcd kullanımı için kütüphane çağrılmıştır.
#include<Servo.h> //servo kullanimi icin kütüphane çağrılmıştır
#define arkaisik A3 //lcd arka isik A3 pininden ayarlanir
//#define Servo1 2 //servo 2 numarali pine takilir //servo pini tanimlamanin 1. yontemi
#define sicakliksensor A0 //sicaklık sensor cikisi A0 portundan okunur

float sicaklik;
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); //lcd icin kullanilan portlar tanimlandi

Servo Servo1;//servo kontrolü icin Servo1 adlı bir nesne tanimlanir
int potpin= A1;//POTANSİYOMETRE A1 portuna baglanir
int potdeg; //pot cikisi okunur
int potdeger=0;


void setup(){ 
  Servo1.attach(2);//servo 2 numarali pine takilir //servo pini tanimlamanin 2. yontemi
  Serial.begin(9600);//Serial Monutorden verileri gorebilmek icin yapılmıstır
  //9600 baud rate denilen saniyede gönderilebilecek veri sayisidir.
  
  pinMode(arkaisik,OUTPUT); //LCD ARKA AYDİNLATMASİ CİKİS OLARAK TANİMLANİR
  digitalWrite(arkaisik,HIGH);// ve arka adinlatma acilir
  
  lcd.begin(16,2);//16 satır 2 sutun lcd kullanildigini tanimlar

void loop()
{
  
potdeg = analogRead(potpin);//potansiyometre degeri okunur 

sicaklik=analogRead(sicakliksensor); //sicaklik sensör çıkışı okunur

sicaklik=(5.0*sicaklik*100.0)/1024.0;//okunan analog sensor degerini sicakliga cevirir 

Serial.print("Potansiyometre degeri = ");//Serial Monitore deger yazilir
Serial.println(potdeg); 

Serial.print("Sicaklik = ");
Serial.println(sicaklik);

potdeger=potdeg;


potdeg= map(potdeg,0,1023,0,179);//okunan potansiyometre degerine gore koordineli sekilde servonun hareketini sağlayan fonksiyon
//map fonksiyonu okunan sensor degerini (0,1023) servonun donus acisi (0,179) koordine eder
Servo1.write(potdeg);//yani potdeg'i servoyu sürmek icin servoya uyguladik. 

Serial.print("Servo donus acisi = ");
Serial.println(potdeg);

lcd.clear();//lcd ekranını temizler
lcd.print("Pot,Servo degeri    ");//sevo acisi lcd ekrana yazilir

lcd.setCursor(0,1);
lcd.print(potdeger);//servo aci degeri lcd ekrana yazilir

lcd.setCursor(6,1);
lcd.print(potdeg);

lcd.setCursor(10,1);//lcd ekraninda imleci 2 satirin 10. sutununa alir
lcd.print(sicaklik);//sicaklik degeri lcd ye yazdirilir
delay(100);//10 ms gecikme verilir.
}




9 Şubat 2014 Pazar

Arduino Nedir?

           Arduino, Processing/Wiring dili ile uygulamaların oluşturulduğu fiziksel programlama platformudur. Aslında bir çeşit geliştirme kartıdır. Basit bir arayüz sayesinde kolayca programlanabilen bir şekilde dizayn edilmişlerdir. Uno, Mega, ADK, ProMini, Micro, Esplora gibi farklı işlemci ve giriş çıkış sayılarına sahip birçok çeşidi bulunmaktadır (Şekil 1).






Şekil 1

         Arduino geliştirme kartları basit olarak, Atmel AVR Mikrodenetleyici, giriş-çıkış pinleri, 16 MHz osilatör, flash memory, programlama için gerekli elemanlar ve regüle devresini barındırırlar. Microdenetleyicilere önceden yazılmış bootloader yazılımı sayesinde ek bir programlama cihazına ihtiyaç duymadan kolaylıkla Arduino IDE ile programlanabilirler. Bu arayüz www.arduino.cc sitesinden yüklenir. Kullanılan geliştirme kartı bilgisayara ilk takıldığında sürücüsü yüklenmelidir. Bu driver indirilen IDE içerisindedir ve manuel olarak kurulmalıdır. 
        Arduino IDE, JAVA programlama dili ile yazılmış, kod editörü ve derleyici olarak görev yapan, derlenen kodun geliştirme kartına yüklenmesini sağlayan bir arayüzdür/uygulamadır. Arduino  IDE sahip olduğu birçok kütüphane ve basit yazılım platformu ile değişik alanlarda kullanılabilmektedir. Donanım ve yazılım olarak açık donanım ve açık kaynak kod prensibine dayanmaktadır. Geliştirme ortamının kaynak kodu ve Arduino kütüphane kodları GPLv2 lisansıyla lisanslanmıştır.
        Arduino IDE içerisinde programlamanın anlaşılabilmesi için çeşitli örnekler mevcuttur. Buna sırasıyla "File-Examples" konumlarına giriş yaparak ulaşabilirsiniz. Meşhur led yakıp söndürme örneği Şekil 2 de mevcuttur.


Şekil 2

              Şekil 2' deki örnekte Arduino geliştime kartının 13. pinine bağlı led 1sn aralıklar ile yanıp sönecektir. Kod incelendiğinde yazılımın çok basit olduğu görülecektir. Çalışma videosu altta mevcuttur.