Log Tutma: ublox NEO-6M GPS
Daha önceki yazımda log tutma işlemlerinden ve bu konuda kullanılabilecek FAT32 katmanına değinmiş ve bir çok uygulama alanının olabileceğinden bahsetmiştik. Klasik anlamda kullanılan gerilim/sıcaklık/nem/basınç gibi değerlerin yanında bu konuda günümüzde en önemli uygulamalardan biri de konum bilgisi kaydetme olarak gözükmektedir.
Tarihi 1960’lara kadar uzanan küresel konum belirleme tam olarak işlevselliğini bugünkü bildiğimiz haliyle 2000’li yılların başında almıştır. Bugüne kadar bir çok alanda etkin şekilde kullanılan GPS yani küresel konumlama sistemi, özellikle bir çok firmanın sunduğu, güçlü donanımlar ile kolay erişilebilir ve kullanılabilir hale gelmiştir.
Bu alanda çalışan bir çok firma olsa da 1997 yılında kurulan ublox firması özellikle sunduğu kullanıcı dostu ve ucuz GPS modülleriyle bir adım öne çıkmaktadır. Özellikle atomik saat benzeri ilginç tasarımlara da sahip firmanın, bu yazımızda kullanılacak modülü giriş seviyesi olan NEO-6M olacaktır.
GPS’in nasıl ortaya çıktığı, halkın sunumuna nasıl açıldığı, atom saatleri ve Einstein ilkeleri ile GLONASS, Galileo gibi diğer iletişim sistemlerine burada değinmeyeceğiz.
NMEA Standartı
GPS, Amerika Birleşik Devletleri’nin kendisine ait olduğu için haberleşme yapısı NMEA (National Marine Electronics Association) standartına uygun işletilmiştir. Bu konuda kullanılan en yaygın standart ise NMEA 0183 adlı, ASCII tabanlı, seri haberleşme üzerine kurulu yapıdır. Klasik bir NMEA kodu genel olarak 4800 baud rate ile iletilirken, günümüzde gelişen sistemlerde haberleşme hızını oldukça arttırabilmek mümkün hale gelmiştir.
NEO-6M GPS modülü fabrika ayarı olarak 9600 baud rate hızında, NMEA 0183 Version 2.3 standardını kullanarak iletişim kurmaktadır. Modülü çalıştırdığımızda karşımıza gelen kod yapısı aşağıdaki gibi olmaktadır.
1 2 3 4 5 |
$GPRMC,083559.00,A,4717.11437,N,00833.91522,E,0.004,77.52,091202,,,A*57 $GPGLL,4717.11364,N,00833.91565,E,092321.00,A,A*60 $GPGGA,092725.00,4717.11399,N,00833.91590,E,1,8,1.01,499.6,M,48.0,M,,0*5B $GPVTG,77.52,T,,M,0.004,N,0.008,K,A*06 $GPZDA,082710.00,16,09,2002,00,00*64 |
NMEA ile yukarıda her biri tanımlanmış komutlar bize gün/saat/hız/koordinat gibi bir çok bilgi sunulmaktadır. NMEA standartı olan bu ASCII kodlaması aşağıdaki gibidir.NMEA standartında her özel adresin mesaj bildiriminde komut uzunlukları sabittir ve her komut kendi arasında ASCII virgül ‘,’ işareti ile ayrılmaktadır. Bunun yanında son olarak ASCII ‘$’ işareti ile ‘*’ işareti arasında kalan karakterlerin checksum değerleri aşağıdaki gibi hesaplanarak, iki byte şeklinde mesajın sonuna eklenir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <stdio.h" unsigned short NMEA_Checksum(char *s) { unsigned short CHK = 0; while(*s) CHK ^= *s++; return CHK; } int main() { char ExpString[] = "GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A"; printf("String: %s\nChecksum: 0x%02X\n", ExpString, NMEA_Checksum(ExpString)); return 0; } |
NMEA Standartı Çözümlemesi
NMEA datalarının çözümlerken, modülün kullanılacağı uygulama önem kazanmaktadır. Bu anlamda GPS datalarının kullanım yapısına göre çözümlenmesi gereken mesajlar belirlenmelidir. Örneğin sadece konum bilgisi gerekiyorsa $GPRMC komutunu çözümlemek yeterli olacaktır. Fakat konum bilgisinin yanında hız, yükseklik, tarih ve saat gibi bilgiler de gerekliyse tek başına $GPRMC komutu yeterli olmayacaktır.
Tarih, saat, konum, hız ve yükseklik bilgileri bir çok uygulama için yeterli olacağı düşünüldüğünde, çözümleme yaparken GPRMC, GPGGA ve GPVTG komut setinin alınması yeterli olacaktır.
$GPRMC
Bu komut ile çözülebilecek GPS verileri şu şekilde sıralanabilir: UTC zaman/tarih bilgisi, koordinatlar ve knots biriminde hız. Aşağıda ilgili komutun kelime yapısı görülebilir.
$GPGGA
Bu komut ile çözülebilecek GPS verileri şu şekilde sıralanabilir: UTC saat bilgisi, koordinatlar, aktif uydu sayısı ve metre biriminde yükseklik. Aşağıda ilgili komutun kelime yapısı görülebilir.
$GPVTG
Bu komut ile GPS modülünün bulunduğu konumun hız bilgisi km/h birimiyle alınabilir. Aşağıda ilgili komutun kelime yapısı görülebilir.
Çözümleme yaparken dikkat edilmesi gereken bir kaç konu vardır. Bunlardan ilki, tüm zaman biriminin UTC biriminde yayınlanıyor oluşudur. Ayrıca gelen koordinat bilgileri de aşağıdaki şekilde çevrim yapılarak kullanılmalıdır.
1 2 3 4 5 6 7 8 |
5133.82,N -> ddmm.mm formatındadır. 00042.24,W -> ddmm.mm formatındadır. 33.82 ve 42.24 birimini dereceye çevirmek gerekmektedir. Gerçek koordinat değerleri aşağıdaki gibidir. 33.82/60=0,56366 -> 51.56366 North 42.24/60=0,73733 -> 42.73733 West |
NMEA ANSI C Çözümleyici Kütüphanesi
NMEA çok eski bir standart olmasına karşın bugüne kadar yazılmış ve kullanıcılar tarafından çok sık tercih edilen ANSI C tabanlı bir kütüphanenin bulunmayışı özellikle beni şaşırttı. Bu anlamda özellikle Arduino tarafında C++ ile kodlanmış TinyGPS bulunsa da bunu C’ye adapte etmek için oldukça uzun zaman gerekmektedir. Bu konuda daha önce yazılmış kodları düzenleyip kullanmaktansa daha basit ve anlaşılır bir kütüphane oluşturmanın daha iyi olacağını düşünerek aşağıda kodlarını görebileceğiniz kütüphaneyi oluşturdum.
Bana göre C dilinde yazılan kütüphane dosyaları taşınabilirlik açısından ANSI C standartını tam olarak kapsamalı, kesmeler ya da optimizasyonlardan etkilenmeyecek şekilde olmalı ve kolay port edilmelidirler.
Bu konuda biraz emek harcayarak NMEA kütüphanesinin ilk versiyonunu oluşturmuş oldum. İlgili kütüphaneyi aşağıdaki linkten indirip kolayca kullanıma başlayabilirsiniz.
NMEA ANSI C Library (Dosyayı İndirdikten Sonra Uzantıyı .RAR Yapın)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* \\\|/// * \\ - - // * ( @ @ ) * +---------------------oOOo-(_)-oOOo-------------------------+ * | NMEA GPS Code Parser | * | This library can parse GPRMC, GPGGA and GPVGT! | * | All Codes Are Written in ANSI C | * | Library Version : Ver 01, First Version | * | Last Compile Date : 10.11.2015 | * | Author : FIRAT DEVECI | * | Web Site : www.FiratDeveci.com | * | | * | Copyright (C) 2015, F. DEVECI, all right reserved. | * | Oooo | * +-----------------------oooO--( )-------------------------+ * ( ) ) / * \ ( (_/ * \_) */ |
Kütüphane ANSI C standartı ile yazıldığından, istediğiniz işlemci üzerinde NMEA çözümlemesi yapabilmek için kütüphane içerisinde bulunan NMEA_Port dosyalarını kullandığınız işlemciye göre adapte etmeniz yeterli olacaktır.
GPS Logger Uygulaması
GPS, özellikle log işlemi için ilginç bilgiler verebilen bir sistem haline gelebilmektedir. Özellikle motorlu ya da motorsuz araç kullanıcısı iseniz, anlık bilgilerin yanında izlediğiniz rotayı daha sonra incelemek isteyebilirsiniz. Özellikle modelcilik ile uğraşanlar için uçak ya da arabanın izlediği rotayı, yükseklik de dahil, görebilmek önemli olabilir.
Yazmış olduğum NMEA kütüphanesini test için, STM32 ile birlikte MMC kart kullanarak, GPS verilerinden, zaman, hız ve uydu sayısı ile konum ve yükseklik bilgilerini iki ayrı dosyada anlık kaydederek aşağıda resimlerini görebileceğiniz uygulamayı geliştirdim. Uygulamada ayrıca anlık bilgileri de ekrana alarak verileri gözleme şansı edindim.Uygulama ile MMC karta aşağıda görebileceğiniz şekilde veriler daha sonra inceleme için kaydedilmektedir.Dosyaların içerikleri aşağıda görülebilir. Birinci dosyaya hız ve uydu sayıları her saniyede, ikinci dosyaya ise anlık konum ve yükseklik bilgileri ise beş saniyede bir kaydedilmektedir.
Google Earth ile Rota Çizimi
Yukarıdaki ya da başka bir uygulama ile kaydedilen koordinat ve yükseklikleri Google Earth programı ile çizmek ve bilgi almak için aşağıda kodları görülebilecek “.kml” uzantılı dosya oluşturmak gereklidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <Style id="yellowPoly"> <LineStyle> <color>7f00ffff</color> <width>4</width> </LineStyle> <PolyStyle> <color>7f00ff00</color> </PolyStyle> </Style> <Style id="style_blue_dot"> <IconStyle> <Icon><href>http://maps.google.com/mapfiles/ms/micons/blue-dot.png</href></Icon> </IconStyle> </Style> <Style id="style_red_dot"> <IconStyle> <Icon><href>http://maps.google.com/mapfiles/ms/micons/red-dot.png</href></Icon> </IconStyle> </Style> <Style id="style_line"> <LineStyle> <color>73FF0000</color><width>5</width> </LineStyle> </Style> <Placemark><styleUrl>#yellowPoly</styleUrl> <LineString> <extrude>1</extrude> <tesselate>1</tesselate> <altitudeMode>absolute</altitudeMode> <coordinates> 27.317236,38.241088,132.0 27.317141,38.241056,133.0 27.316962,38.241252,137.0 </coordinates> </LineString></Placemark> </Document></kml>/ |
Kaydettiğiniz koordinatlarınızı “coordinates” adı altında görülen bölüme koymanız gerekmektedir. Daha sonrasında bilgisayarınıza Google Earth programını kurup, oluşturduğunuz dosyayı açmanız yeterli olacaktır. Program size izlenen rotayı ve yükseklikleri üç boyutlu olarak çizecektir.
Aşağıda, araçla yaptığım örnek rotanın şeklini görebilirsiniz, resmi büyütmek için üzerine tıklamanız yeterli olacaktır.Ayrıca yine araç ile yaptığım uzun bir yolculukla ilgili aşağıda örnek hız profilini zamana bağlı görebilirsiniz. Hız grafiğinde sabit kalan noktalar aracın cruise control yani hız sabitleyicisi aktifken alınan sonuçlardır.Uygulamaya Ulaşmak İçin
Yukarıdaki uygulamaya ulaşmak isteyen arkadaşlar mesaj yoluyla bana ulaşıp, proje dosyalarının ve kütüphanenin Microchip uyumluluğu da sağlanmış örneği ile birlikte almaları mümkündür.
Bitirirken…
GPS, yaşamımızda artık bir çok alana nüfus etmiş, teknoloji nimetlerinden birisi. Bugün bir çok araç takip firmasının bel kemiğini oluşturan bu sistemin, bir çok alanda farklı kullanım alanları doğurmasının yanında gelişen modüllerle birlikte daha da ulaşılabilir olduğu bir gerçek. IoT’nin hayatımıza nüfus etmeye başladığı düşünüldüğünde ise bu tür modüllerden uzak durmamız pek olası gözükmüyor.
Herkese çalışmalarında başarılar dilerim.
Merhaba,
Güzel bir anlatım olmuş. Emekleriniz ve paylaşım için teşekkürler.
Merhaba,
Bir şeyi merak ettim. NMEA mesaj formatı C’nin standart kütüphane fonk. olan strtok ile ayrılmaya çok müsait. Bu fonk. kullanmamanızın özel bir sebebi var mı ?
Merhabalar,
Aslında özel bir sebebi yok, kişisel bazde elimden geldiğince string kütüphanesini kullanmamaya özen gösteriyorum. İşlemcide fazla yer kaplaması bunun yanı sıra taşınabilirlikte sıkıntılar yaşatması bunlardan bir kaçı. Bilgi için teşekkürler.
Fırat Bey, yaptığınız çalışma için öncelikle ellerinize sağlık.
Benim NEO-6m modül hakkında bir sorum olacak.
u-Center uygulaması ile modülün BaudRate ayarını değiştirip 115200bps yapıyorum. Tekrar bağlanıyorum bu hızda veri alabiliyorum. Ancak modülün enerjisini kesip tekrar çalıştırdığımda ayar kayboluyor 9600bps ile haberleşiyorum. Bununla ilgili bilginiz var mı?
PRT sekmesinden baud ayarı yapıp CFG sekmesinden kaydediyorum ancak kaydolmuyor sanırım. Firmware update konusunda da sıkıntı yaşıyorum. Eğer bu konularda deneyiminiz varsa paylaşabilirseniz sevinirim.
Kolay gelsin, iyi akşamlar.
Merhabalar Hüseyin Bey,
Cihazın kendi firmware’ine ve baud hızına uygulama yaparken hiç dokunmadım. Bu yüzden bu konuda bir bilgi paylaşamayacağım.
İyi günler dilerim.
Merhaba ben STM32f4 kartı ile GPS modülünü kullanmak istiyorum. Sizin kodlarınızı indirdim. Readme kısmındaki talimatlarda NMEA_Port.c kısmını kendi işlemcinize göre ayarlayın demişsiniz. Burada yapmamız gereken GPIO da kullanılacak pinleri seçme tarzı işlemler mi onu tam anlamadım biraz açıklayabilir misiniz?. Bir de kesme rutini ve sayıcıyı istediğimiz bir yerde tanımlayabilir miyiz (mesela NMEA.c nin içinde)? Teşekkür ederim iyi günler.
Merhabalar,
Kodlar oldukça açık aslında. GPS modül sadece seri haberleşiyor, bu pinleri Port dosyasında hazırlamanız yeterli.
İstediğiniz kodu istediğiniz yerde tanımlayabilirsiniz. Projenizin yapısı nasıl bilmediğim için bunun için tamamen şöyle olur diyemeyiz.
Merhaba siz NMEA_Port.c nin içerisinde General.h ı da eklemişsiniz fakat öyle bir kütüphane yok onu kendimiz mi yazacağız?
Teşekkür ederim.
Onun kütüphane içerisinde bir etkisi yok silebilirsiniz.
Merhabalar Fırat Bey,
Paylaşımınızdan dolayı teşekkür ederim. Rica etsem uygulamayı paylaşasabilir misiniz ?
İyi çalışmalar,
Emre
Merhaba Emre Bey,
Uygulamayı siteye destek olması nedeniyle cüzi bir ücret karşılığı paylaşmaktayım.
İyi günler dilerim.
Belirlemiş olduğunuz ücret nedir ?
Emre Bey mailinize ilgili ücreti gönderdim.
Merhaba, size özelden nasıl ulaşabilirim ?
info[@]firatdeveci.com adresi üzerinden.
Elinize sağlık Fırat hocam, vermiş olduğunuz bilgiler dışında anlatımınız da çok güzel.
Fırat Bey paylaşımınız için sağolun benimde kodda merak ettiğim bir kısım var. Burada neden 1ms lik bir kesme isteniyor?
Genel zamanları düzenlemek için ben genelde tüm kütüphanelerimde 1ms kesme kullanırım.
Merhabalar,
Yazınız oldukça faydalı olmuş. Ben STM32F103C8T6 ve NOE 7M kullanıyorum projemde fakat aynı konumda ARFUINO ve FTDI ile veri alabiliyorken. STM ile konum verisi alamıyorum. STMi Arduino IDE üzerinden programlıyorum. Herhangi bir çözümü var mı bu durumun? Yada farklı GPS modulleri durumu değiştirir mi?
Arduino vb. oyuncaklarla zaman kaybetmiyor ve Keil ya da IAR kullanıyorum. Profesyonel uygulamalar için mutlaka bu IDE’ler kullanılmalı. Dolayısı ile size cevabım maalesef nedenini bilemiyorum.
Merhaba projeniz cok guzel projenin microchip bitmis halini gonderbilirmisiniz. Mmc karta nasil kaydettiniz.
Merhabalar, Microchip üzerinede sadece NMEA çözümlemesi yapıldı, MMC kart uygulaması yapılmadı. İlgili uygulama ücretli olup, edinmek için mail atmanız gerekmektedir.