Sunday, September 29, 2013

Arduino ve GPS Modülü - [GPS Tracker] - II

Herkese merhaba, GPS Tracker projesinin 2. yazısındayız. İlk yazıyı okumak isteyenler buradaki linkten ulaşabilirler. Hatırlatmak için projeyi tekrar kısaca anlatacağım. Uydudan Arduino'ya bağlı GPS modülü aracılığı ile alınan bilginin USB ile bilgisayarımıza aktarılması ve buraya gelen bilgilerin anlamlı datalara dönüştürülüp kullanıcının ihtiyacına uyarlanması işlemiydi. Bu yazıda Arduino'ya yüklediğimiz programın ne işe yaradığını açıklayıp. Projenin QT ayağına da değinmek istiyorum. Projenin QT ayağında, ek olarak Google Map API(V3)'sini de kullandım. API yardımı ile uydudan aldığım longitude(boylam), latitude(enlem) bilgilerini kullanarak bulunduğum konumu harita üzerinde gösterebiliyorum. Ayrıca aldığımız hız bilgisini de ekrana yansıtabiliriz. Bu uygulama ile basit bir navigasyon sistemi yapmış olacağız. Çünkü QT Creator ile yazdığım program dinamik bir program. Uydudan alınan veri değiştikçe, QT'ye yansıtılan veri de aynı hızla değişiyor. Şayet arabanızda laptobunuzu açıp, Arduino'yu da laptoba bağlarsanız, siz hareket ettikçe haritada sizi temsil eden simge de hareket edecektir.(Tabii biraz zahmetli bir iş olduğu kesin, bende henüz arabada denemedim.) Lafı çok fazla uzatmadan Arduino'ya yüklediğimiz kodu açıklamak istiyorum.

#include <SoftwareSerial.h>
#define NMEA_SIZE 256

SoftwareSerial GPS = SoftwareSerial(6, 1);

byte NMEA[NMEA_SIZE];

void getData() {

  byte character;
  int index = 0;
  
  do {
    if (GPS.available()) {
      character = GPS.read();
      NMEA[index] = character;
      index++;
    }
  } while(index < NMEA_SIZE && character != '$');
  
  NMEA[index - 2] = '\0';
}

void setup() {
  GPS.begin(4800);
  Serial.begin(9600);
}
 
void loop() {

  getData();

  if(NMEA[2] == 'R' && NMEA[3] == 'M' && NMEA[4] == 'C') {
    int i = 0;
    for(i = 0; NMEA[i] != '\0'; i++) {
      Serial.write(NMEA[i]);
    }
    Serial.print("<END>\n");
  }
}
Yukarıdaki kod kısaca, "Serial Communication(Seri İletişim)" sağlamak için GPS denen ve "SoftwareSerial" tipinde bir değişken oluşturuyor.
SoftwareSerial GPS = SoftwareSerial(6, 255);
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
Parameters : 
rxPin: the pin on which to receive serial data
txPin: the pin on which to transmit serial data
İçerisine aldığı ilk parametre GPS Modülümüzün sarı kablosunu bağladığımız Arduino pininin numarası. Yanı datanın alınacağı pin. Biz GPS Modülünün sarı kablosunu(data kablosunu) Arduino'daki 6 nolu dijital pine taktık. Diğer pin ise datanın iletilmesini sağlayacak pin. Bizim örneğimizde bu pine istediğiniz değeri verebilirsiniz. Ben 255 verdim. Ancak olurda USB ile bilgisayara iletimde sorun çıkarsa bu değeri 1 yapabilirsiniz.
byte NMEA[NMEA_SIZE];
Oluşturduğumuz bir diğer değişken ise byte tipinde ve uydudan gelen veriyi depolayacak olan NMEA isimli değişken. Bu açıklamadan sonra şimdi sıra geldi yazdığımız fonsiyonların sırası ile ne işe yaradığına. Öncelikle "setup()" fonksiyonundan başlamak istiyorum. Bu fonksiyon seri iletişim için GPS Modül ve USB'den alınacak/aktarılacak bit hızını ayarlar. Ayarımız USB için 9600, GPS Modül için 4800 olmalı. "loop()" fonksiyonu sürekli çağrılan fonksiyondur. ve içerisinde "getData()" fonksiyonunu çağırır. "getData()" fonksiyonu ise basitçe GPS Modülden gelen bilgileri NMEA değişkeninin içine yazar.
  if(NMEA[2] == 'R' && NMEA[3] == 'M' && NMEA[4] == 'C') {
    int i = 0;
    for(i = 0; NMEA[i] != '\0'; i++) {
      Serial.write(NMEA[i]);
    }
    Serial.print("<END>\n");
  }
Yukarıdaki if bloğu ise GPS'den gelen ve NMEA değişkenine yazılan "RMC" tipindeki verileri USB aracılığı ile bilgisayarımıza yollar. Sonuna da "<END>" etiketi ekler. Buraya kadar anlaşılmayan bir şey varsa sorabilirsiniz. Eğer programın çalışabilirliğini kontrol etmek isterseniz. Arduino IDE aracılığı ile bunu yapabilirsiniz. Menuden "Tools > Serial Monitor" seçeneğine tıklarsanız aşağıdaki gibi bir resim karşınıza çıkacaktır.


Buraya kadar olan kısım Arduino ile ilgiliydi. Bundan sonrası ise USB ile iletilen verinin bilgisayarda işlenmesi kısmı. Gelen veri QT Creator ile yazdığım program vasıtasıyla işlenecek. Ve uydudan alınan tüm veriler kullanıcıya sunulacak. Yazıyı çok fazla uzamasını istemediğim için burada sonlandırıyorum. Bir sonraki adımda Projenin QT ayağına değinip orada yaptığım kodlamayı açıklayacağım. Şimdilik herkese iyi günler.

3 comments:

  1. Hocam merhaba, ben bitirme tezi olarak elektrikli araçlarda telemetri sistemi yapıyorum. web tabanlı olarak konum hız gerilim gibi bilgileri takip edeceğim. Arduino mega ile çalışıyorum nblox un gps shieldi ve bir tane sim900 un sim modülü var bunlarla nasıl yapabilirim araç takip sistemini öncelikle konum ve hız bilgisini doğru şekilde nasıl alıp yorumlayabilirim yardımcı olursanız sevinirim

    ReplyDelete
  2. Teşekkürler. Dediğinde haklısın diğer alternatifler üzerine de yazmak istiyorum ama maalesef vakit sıkıntısı var.

    ReplyDelete
  3. qt kodunu da paylaşırmısınız?

    ReplyDelete