15 Şubat 2014 Cumartesi

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);
}


1 yorum:

  1. hocam yazılımı yüklerken "İNTERNAL2V56'WAS not declared in this scope hatası alıyorum nasıl düzeltebilirim.

    YanıtlaSil