Facebook RSS Feed
 

.NET Micro Framework: GPS ile Pozisyon Bilgisi Çözümlemek

-GPS işlemcisi tarafından hesaplanan pozisyon bilgisi, seri port üzerinden standard cümle kalıpları halinde gönderilir. Bu kalıpların birkaç çeşidi vardır ve her biri farklı hesaplamaları içerir. NMEA (National Marine Electronics Association) tarafından belirlenen 30’un üzerinde cümle türü mevcuttur. Biz bu cümle tipleri arasından temel 3 boyutlu (Enlem, Boylam, Yükseklik) pozisyon bilgisi olan GPGGA’yı kullanacağız. Örnek bir GPGGA cümlesine göz atacak olursak:

"$GPGGA,201308.255,4737.9922,N,12211.1734,W,1,05,2.9,30.1,M,-17.2,M,0.0,0000*78"

gibi bir ifade ile karşılaşırız. Bu bilgiler bize o anki saati, bulunduğumuz enlem, boylam ve yüksekliği verir. GPGGA’ya daha detaylı bakalım:

Hane Veri Açıklama
1 $GPGGA Cümlenin GPGGA türünde olduğunu belirtir.
2 201308.255 UTC’ye göre o o anki saat
3, 4 4737.9922,N Enlem
5, 6 12211.1734,W Boylam
7 1

Kilitlenme kalitesi:
0: Geçersiz
1. GPS fix (SPS)
2. DGPS fix
3. PPS fix
4. Real Time Kinematic
5. Float RTK
6. Estimated
7. Manual Input Mode
8. Simulation Mode

8 05 Ölçümde kullanılan uydu sayısı
9 2.9 Yatay pozisyon kayması
10, 11 30.1,M Ortalama deniz seviyesine göre yükseklik
12, 13 -17.2,M Ortalama deniz seviyesine göre geoid yüksekliği
14 0.0 Son DGPS güncellemesinden sonra geçen saniye
15 0000 DGPS istasyonunun ID numarası
16 *78 Checksum bilgisi, her zaman * ile başlar

GPS'in çalışmasıyla ilgili temel bilgilerden sonra, şimdi de örnek bir uygulama ile pozisyon bilgisine ulaşalım.

GPS Uygulaması

Öncelikle proje referansları arasına "Microsoft.SPOT.Hardware.dll" ve "Microsoft.SPOT.Hardware.SerialPort.dll" kütüphanelerini ekleyelim. Daha sonra aşağıdaki kodlar ile adım adım nasıl GPS bilgisinin işlendiğini görebilirsiniz.
Dipnot: GPS komutları seri port üzerinden 4800bps veya 9600bps hızında aktarılır.

using System;
using System.Text;
using System.Threading;
using System.IO.Ports;
using Microsoft.SPOT;

namespace MFGPSParser
{
  public class Program
  {
    public static SerialPort spGPS;

    public static void Main()
    {
      //Seri port oluşturup Data Received interrupt'ını belirleyelim:
      spGPS = new SerialPort("COM1", 4800, Parity.None, 8, StopBits.One);
      spGPS.Open();
      spGPS.DataReceived += new SerialDataReceivedEventHandler(spGPS_DataReceived);

      //Main Thread'i uyutalım:
      Thread.Sleep(Timeout.Infinite);
    }

    static void spGPS_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
      //Seri port üzerinden karakter alındıysa:
      if (e.EventType == SerialData.Chars)
      {
        //Gelen karakterleri bir byte dizisine aktaralım:
        byte[] gelenVeri = new byte[spGPS.BytesToRead];
        spGPS.Read(gelenVeri, 0, gelenVeri.Length);

        //Seri porttan gelen veriyi GPSIsle metoduna gönderelim:
        GPSIsle(new String(Encoding.UTF8.GetChars(gelenVeri)));
      }
    }

    public static void GPSIsle(string NMEA)
    {
      //Pozisyon verisini depolayacak bir string dizisi oluşturalım:
      string[] gParca;

      //GPS'den alınan cümleyi virgüllerinden ayırarak, yukarıda oluşturduğumuz diziye aktaralım:
      gParca = NMEA.Split(new char[] { ',' });

      //Eğer ilk parça "$GPGGA" ile başlıyorsa, pozisyon bilgisini işleyelim:
      switch (gParca[0])
      {
        //Global Positioning System Fix Data Türünde Cümle:
        case "$GPGGA":

          //Saat bilgisini işleyip yazdıralım:
          Debug.Print("Saat: " + gParca[1].Substring(0, 2) + ":" +
              gParca[1].Substring(2, 2) + " " +
              gParca[1].Substring(4, 2) + " (UTF)");
          //Örnek çıkış: Saat: 20:13 08 (UTF)

          //Enlem bilgisini yazdıralım:
          Debug.Print("Enlem: " + gParca[2]);
          //Örnek çıkış: Enlem: 4737.9922

          //Kuzey / Güney bilgisini yazdıralım:
          if (gParca[3] == "N") Debug.Print("Kuzey");
          else if (gParca[3] == "S") Debug.Print("Güney");
          //Örnek çıkış: Kuzey
         
          //Boylam bilgisini yazdıralım:
          Debug.Print("Boylam: " + gParca[4]);
          //Örnek çıkış: Boylam: 12211.1734

          //Doğu / Batı bilgisini yazdıralım:
          if (gParca[5] == "E") Debug.Print("Doğu");
          else if (gParca[5] == "W") Debug.Print("Batı");
          //Örnek çıkış: Batı

          //Yükseklik bilgisini yazdıralım:
          Debug.Print("Yukseklik: " + gParca[9] + " " + gParca[10]);
          //Örnek çıkış: Yukseklik: 30.1 M

          //Kapsama alanındaki uydu sayısını yazdıralım:
          Debug.Print("Uydular: " + gParca[7]);
          //Örnek çıkış: Uydular: 05

          Debug.Print("----------");
          break;

        default:
          break;
      }
    }
  }
}

GPS alıcısına bağlı olarak uygulamayı çalıştırdığımızda Immediate Window'da her saniye aşağıdaki gibi bir sonuç göreceğiz:

Saat: 20:13 08 (UTF)
Enlem: 4737.9922
Kuzey
Boylam: 12211.1734
Batı
Yukseklik: 30.1 M
Uydular: 05
----------

Eğer GPS alıcınız yoksa yada simulatör ortamında çalışıyorsanız, spGPS.Open(); komutunu silip yerine
GPSIsle(“$GPGGA,201308.255,4737.9922,N,12211.1734,W,1,05,2.9,30.1,M,-17.2,M,0.0,0000*78”);
yazarak örnek bir çıkış alabilirsiniz.

Proje dosyalarını buradan indirebilirsiniz.




 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi