elektrik port üyelik servisleri elektrik port üyelik servisleri

ARDUNİO UNO R3 İLE PROJE GELİŞTİRMEK :
GPS
(Global Positining System ) MODÜLÜ İLE KONUM BİLGİSİ ALMA

Günümüzde karşımıza sıkça çıkan, mikrodenetleyicilerin yeni gözdesi Ardunio açık kaynak kodlu ve esnek, kolay kullanımlı donanım ve yazılım tabanlı bir elektronik prototip platformudur. Bizde bu yazımızda Ardunio Uno R3 ile birlikte GPS modülü kullanarak konum bilgisi alacağız.



A- A+
19.02.2013 tarihli yazı 11815 kez okunmuştur.

ARDUNİO NEDİR ?


Arduino İtalyan elektronik mühendisleri tarafından açık kaynak kodlu geliştirilen, isteyen herkesin baskı devreleri indirerek kendi devrelerini basabilecekleri dilerlerse şık bir görüntüye sahip hazır basılmış ve bileşenleri yerleştirilmiş halde alabilecekleri, esnek, kolay kullanımlı donanım ve yazılım tabanlı bir elektronik prototip platformudur. Öncelikle açık kaynak nedir dersek hemen şöyle açıklamak gerekirse, devre şemaları, pcb baskı devreleri, yerleşim planları, varsa üzerindeki programlanabilir elemanların kodları, bütün detaylarıyla herkesin kullanımına açılmış ve ticari bir kaygı olmadan tamamen paylaşıma açık bir platformdur.

Arduino geliştirme kartı üzerindeki mikroişlemci (AtmegaXX) arduino programlama dili (wiring tabanlı) ile programlanır ve bu program processing tabanlı Ardunio Yazılım Geliştirme Ortamı (IDE) yardımı ile karta yüklenir.

Arduino’nun kullandığı dilden bahsedicek olursak, kullandığı dil oldukça basittir, çok temel bir C bilgisi ile usb üzerinden direkt olarak mikrodenetleyicimizi programlayabiliyoruz ve gerçek zamanlı uygulamalar çalıştırabiliyoruz. Programlama yaparken java üzerine yazılmış güzel, sade bir o kadarda akıllı bir editör tasarlanmıştır ve bu editörün içerisinde birçok kütüphane mevcuttur. Bu editör geliştiricileri tarafından sürekli güncel tutulması sebebiyle gün geçtikçe daha kullanışlı ve fonksiyonel hale getirildiği görülüyor. Bütün bunları göz önünde bulundurduğumuzda çok ileri bir yazılımcı olmadan birçok uygulamayı arduino kullanarak yapabiliriz. Arduino yazılımının diğer bir güzel yanı ise geliştiricileri tarafından hazırlanan zengin kütüphaneleridir. Bu kütüphane dosyaları sayesinde, birçok kod yükünden kurtularak, sadece yapmak istediğiniz projenin kodlarına yönelebiliyorsunuz.

 
Biraz da donanımdan bahsedecek olursak, Arduino kartlarında Atmel işlemcilerini kullanmaktadır. Mikrodenetleyicimiz önceden Bootloader programı içine atılmış şekilde geldiğinden dolayı harici bir programlama cihazına ihtiyaç duymaz. Bu da bizim için çok büyük bir avantaj, yani ek bir programlayıcı gereksinimini ortadan kaldırıyor. Arduinonun bir çok çeşidi bulunmaktadır, uygulamanızın büyüklüğü veya küçüklüğüne göre bu çeşitlerden herhangi birini seçebiliriz. Uzun bir araştırma sürecine girdiğinizde karşınıza çok fazla çeşidinin çıktığını göreceksiniz ve halen daha bu kartlar yenilenmekte ve geliştirilmektedir. Fakat şunu söyleyebiliriz ki, arduino’nun şu an ki kartlarına uygun olarak geliştirilen bir çok shield Türkçesi kalkan olan ek donanımlar yapılmıştır(Bluetooth, Ethernet, Wireless, Motor sürücü katmanları vs.). Bu yüzden donanımsal olarak çok ciddi bir değişikliğe en azından şu an ki kullanılan kartlarda gidileceğini düşünmüyorum. Çünkü kullanılan kartlarda gidilecek donanımsal değişiklikler shield lerin kullanılamaması anlamına gelir.
 



ARDUINO PROJESİ VİDEO ANLATIMI İÇİN TIKLAYINIZ



GPS İLE NASIL KONUM BELİRLENİR ?


GPS (Global Positioning System; Küresel Yer Belirleme Sistemi ya da Küresel Konumlandırma Sistemi), düzenli olarak kodlanmış bilgi yollayan bir uydu ağıdır ve uydularla arasındaki mesafeyi ölçerek Dünya üzerindeki kesin yeri tespit etmeyi mümkün kılar. Aslında 24 uydu verisi alınır fakat 3 uydu yardımıyla var olan konumumuz bulunur diyebiliriz.

 


Konum Belirleme

 
Bu sistem, ABD Savunma Bakanlığı’na ait, yörüngede sürekli olarak dönen 24 uydudan oluşur. Bu uydular çok düşük güçlü radyo sinyalleri yayarlar. Yeryüzündeki GPS alıcısı, bu sinyalleri alır. Böylece konum belirlenmesi mümkün olur.

Bu sistemin 
ilk kuruluş hedefi tamamen askeri amaçlar içindi. GPS alıcıları yön bulmakta, askeri çıkartmalarda ve roket atışlarında kullanılmak üzere tasarlanmıştır. Ancak, 1980′lerde GPS sistemi sivil kullanıma da açılmıştır.

Mesela diyelim ki ilk uydudan aldığımız verilere göre 30 000 km uzaklık bilgisini aldık. Bu uzaklık bilgisi, dünya üzerinde o uyduyu merkez kabul edip etrafına yarıçapı 30 000 km olan bir alan çizmemiz olarak yorumlanabilir. Daha sonra ikinci uydudan aynı şekilde 22 000 km uzaklık değeri aldığımızı düşünün ve bu uydunun etrafına da aynı şekilde bir alan oluşturulduğunu var sayalım. Bu uydu bilgilerinin 3 tanesinin oluşturduğu alanlar bir yerde kesişecek ve bize dünya üzerindeki yerimizi verecektir.


 

ARDUNİO ÜZERİNDEKİ İŞLEMLER 



Öncelikle C dilinde yazmış olduğumuz aşağıdaki kodları usb bağlantısını kullanarak bilgisayarımızdan mikrodenetleyicimize aktarıyoruz.
 

Arduino programlamak için kullanılan yazılım.




#include <SoftwareSerial.h>
#include <TinyGPS.h>
/* This sample code demonstrates the normal use of a TinyGPS object.  It requires the use of SoftwareSerial, and assumes that you have a 4800-baud serial GPS device hooked up on pins 3(rx) and 4(tx).*/
TinyGPS gps;
SoftwareSerial nss(3, 4);
static void gpsdump(TinyGPS &gps);
static bool feedgps();
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);
void setup()
{
  Serial.begin(115200);
  nss.begin(9600);
    Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));
  Serial.println();
  Serial.println("Sats HDOP Latitude Longitude Fix  Date       Time       Date Alt     Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)    (deg)     Age                        Age  (m)     --- from GPS ----  ---- to GANTEP  ----  RX    RX        Fail");
  Serial.println("--------------------------------------------------------------------------------------------------------------------------------------");
}
void loop()
{
  bool newdata = false;
  unsigned long start = millis();
 
  // Every second we print an update
  while (millis() - start < 1000)
  {
    if (feedgps())
      newdata = true;
  }
   gpsdump(gps);
}
static void gpsdump(TinyGPS &gps)
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const float GANTEP_LAT = 37.034828, GANTEP_LON = 37.317451;
 
  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
 
  print_date(gps);
 
  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2);
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, GANTEP_LAT, GANTEP_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 37.034828, 37.317451), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, GANTEP_LAT, GANTEP_LON)), 6);
 
  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
}
 
static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len-1] = ' ';
  Serial.print(sz);
  feedgps();
}
 
static void print_float(float val, float invalid, int len, int prec)
{
  char sz[32];
  if (val == invalid)
  {
    strcpy(sz, "*******");
    sz[len] = 0;
        if (len > 0)
          sz[len-1] = ' ';
    for (int i=7; i<len; ++i)
        sz[i] = ' ';
    Serial.print(sz);
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1);
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(" ");
  }
  feedgps();
}
 
static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("*******    *******    ");
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d   ",
        month, day, year, hour, minute, second);
    Serial.print(sz);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  feedgps();
}
 
static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  feedgps();
}
 
static bool feedgps()
{
  while (nss.available())
{
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}

Daha sonra yukarıda yazmış olduğumuz kodlara göre GPS modülümüz ile Ardunio Uno R3 arasındaki gerekli donanımsal bağlantıları yaptıktan (serial communication) sonra, mikrodenetleyicimizin ara yüzünde enlem (latitude) ve boylam (longitute) türünden iki veri elde edeceğiz. Elde ettiğimiz bu konum bilgilerini Google map’ e yazdığımız zaman harita üzerinden konumumuzu görebileceğiz.
 

Google Map üzerinden konumumuzun belirlenmesi

 
5-10 metre kadar hata payı var. Böylelikle GPS ile konum belirlemeyi tamamlamış bulunuyoruz.



Kaynaklar:

http://www.arduino.cc/
Wikipedia
Arduiniana
Wireless communication and netwoking – JonW. Mark and Weihua Zhqung, PHI,2005.
 


ANKET
Endüstri 4.0 için En Hazır Sektör Hangisidir

Sonuçlar