V.KEL GPS 1-10HZ Arduino İle Kullanımı, Pin Bağlantısı ve Örnek


   Merhaba arkadaşlar öncelikle biraz modülden bahsedeyim. Modül önceki "NEOGPS" modüllerine göre biraz daha pratikleştirilmiş bir sisteme sahip. Tek kartta tüm işleri bitirmişler birkaç da güzel ince nokta eklemişler. Önceki "NEOGPS" üzerinde kart ayrı anten ayrı bağlantıyı aşıp tek kart üzerinde birleştirme yapılmış. Kartın arka yüzüne anten sabitlenmiş. Bu sayede kartı ayrı sabitleme, anteni ayrı sabitleme olayı geçmiş ve aradaki kablo kısmı aşılmış gayet güzel bir detay.

    Üzerindeki ledler ile kullanım kolaylığı sağlanmış. Power ledi gücün geldiğini, PPS ledi ise GPS ile veri alışverişi olup olmadığını göstermektedir. Bu diğer modüllere göre gayet güzel bir sistem. Önceki modüllerde açık olup olmadığını, veri alıp almadığımızı, çalışıyor mu bozuldu mu diye düşünürken ledler sayesinde ince bir detaya yer vermişler. Üzerindeki PPS ledi ve çıkışı sayesinde kontrol kartımızda da "GPS" sinyali olup olmadığını görebilmemizi sağlamakta.

    Kartı geliştirmişler dedik 3.3V - 5V kullanımı olmazsa olmazdı tabi. Bu kart üzerinde hem 3.3V hemde 5V girişini desteklemekte. Girişi direk olarak VCC girişine vererek sağlıyoruz bunu.

    Modülün deneyimim kadarıyla hata payı diğer modüller ile aynı. Yani filtrelizasyon yapılmasa hata payı 15-20 metre civarına çıkabilmekte. (Bu hatayı kapalı bir ortamda pencereye çıkartarak ölçtüğümde aldım dış ortamda da tahmini 10metrelik bir hata payı oluşabilir. Sensör ilk açılışında zaten kendini kalibre edip uydu aramakta kapalı bir havada denediğimde 5-7 uyduya bağlanabildiğini gördüm. Açık alanda ve açık bir havada 10-15 uyduya yakın bağlantı kurabileceğini umuyorum. Dış ortam denemesi yaptığımda konuya ek alıntı olarak ekleme yapacağım.

Modül kurulumunda önceki projelerle aynı "Arduino Mega 2560" kullandım. Diğer kartlar için pin girişlerini değiştirmeniz gerekli çünkü Serial1 haberleşme kısmını kullandım bu modül için de. Modül üzerindeki RX arduino üzerindeki TX1'e modül üzerindeki TX arduino üzerindeki RX1'e bağlanması gerekmekte. Yani zıt bağlantı yapacaksınız. Arduino Mega 2560 veya Serial1 bağlantı dışında bağlantı kullanmak istediğinizde aşşağıdaki tabloya kesinlikle göz atmanız gerekmektedir.


Arduino ve Modül bağlantı şeması;

Arduino için indirmeniz gereken kütüphane = Belgelerim'e girin -> Arduino -> Library klasörünü açın ve verdiğim .zip dosyasının içindeki klasörü atmanız gerekmektedir.

Kütüphane dosyasını indirin​​​

Arduino bağlantı şemasını yaptıktan ve kütüphaneleri kurduktan sonra kullanılacak kod bütünlüğü aşşağıdadır;

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const uint32_t GPSBaud = 9600;

TinyGPSPlus gps;

void setup()
{
  Serial.begin(9600);
  Serial1.begin(GPSBaud);
  pinMode(7, INPUT);
  Serial.println(F("BHDRSZN-V.Kel-GPS.ino"));
  Serial.println(F("Takıldığınız yerde; https://bahadirsuzen.com.tr/yazilimlarimiz/60-vkel-gps-1-10hz-arduino-ile-kullanimi-pin-baglantisi-ve-ornek.html"));
  Serial.print(F("Kütüphane Versiyonunuz; v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("--- BHDRSZN ---"));
  Serial.println();
  Serial.println(F("Sats HDOP  Latitude   Longitude   Sabit  Tarih       Saat     Date   Rakım    Seyir Hızı        Kart Mesafesi         Krkt. Karar    Durum"));
  Serial.println(F("           (deg)      (deg)       Deger                       Degeri  (met)    --- from GPS ----  ---- Londra İçin ----  RX    RX        Hata"));
  Serial.println(F("----------------------------------------------------------------------------------------------------------------------------------------"));
}

void loop()
{
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

  printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  printFloat(gps.hdop.hdop(), gps.hdop.isValid(), 6, 1);
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printInt(gps.location.age(), gps.location.isValid(), 5);
  printDateTime(gps.date, gps.time);
  printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
  printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
  printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
  printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.deg()) : "*** ", 6);

  unsigned long distanceKmToLondon =
    (unsigned long)TinyGPSPlus::distanceBetween(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT, 
      LONDON_LON) / 1000;
  printInt(distanceKmToLondon, gps.location.isValid(), 9);

  double courseToLondon =
    TinyGPSPlus::courseTo(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT, 
      LONDON_LON);

  printFloat(courseToLondon, gps.location.isValid(), 7, 2);

  const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);

  printStr(gps.location.isValid() ? cardinalToLondon : "*** ", 6);

  printInt(gps.charsProcessed(), true, 6);
  printInt(gps.sentencesWithFix(), true, 10);
  printInt(gps.failedChecksum(), true, 9);
  Serial.println();
  
  smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("GPS Verisi Alınamadı: Bağlantılarınızı Kontrol Ediniz!"));
}

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (Serial1.available())
      gps.encode(Serial1.read());
  } while (millis() - start < ms);
}

static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}

static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    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);
  smartDelay(0);
}

static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
    Serial.print(sz);
  }
  
  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    Serial.print(sz);
  }

  printInt(d.age(), d.isValid(), 5);
  smartDelay(0);
}

static void printStr(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartDelay(0);
}

"distanceKmToLondon" işlemi ile yapılan mesafe analizini sizde istediğiniz noktalar için yapabilirsiniz.

"courseToLondon" işlemi ile gidilecek koordinatın hangi yönde olduğunu derece cinsinden alabilir ve magnetometrede kullanabilirsiniz. Şuan bu işlemi Londra için yapmakta siz istediğiniz LAT ve LON derecelerini girerek bu işlemi gerçekleştirebilirsiniz.

Tarih bütünlüğü +0 GTM olarak verilmiştir. Türkiye +3 GTM değerinde olduğu için saatım üzerine +3 saat daha eklemeniz gerekmektedir.

SATS ve DHOP değerleri GPS bağlantı durumunu ve değerini göstermekte olabildiğince yüksek olması gerekmekte kapalı alanda SATS 7, DHOP 1.3-1.9 arası değer değişimi oluyor bende kapalı hava ve kapalı alanda pencere kenarında.



Türkiye zaman dilimi olan "GTM +3"ü GPS'e yansıtmak istiyorsanız;  Belgeler->Arduino->Library->TinyGPSPlus-1.0.2b->TinyGPS++.cpp açın. Daha sonrasında 412. satırda 
uint8_t TinyGPSTime::hour()
{
   updated = false;
   return time / 1000000;
}
kodlarını göreceksiniz. Burada return time / 1000000; kodunu return (time / 1000000)+3;olarak değiştirmeniz yeterli olacaktır.


Ziyaretçi, yorum yapılsın mı?
İsim:*
E-Mail:


[not-allow-comm]
[/not-allow-comm]

Dikkat!

Aşağıdaki bağlantıdaki makaleye göz atın.

Site Kuralları ve Engellenme Sonrası
İstatistik
File engine/modules/zpstats.php not found.
Sıkça Sorulan Sorular
Video Trafiği
Etiketlere göre ara