GPS %100 Bitti Çalışıyor

Başlatan monelge, 23 Nisan 2013, 10:44:39

monelge

merhaba Arkadaşlar sitede birçok yerde araştırdım fakat gps projesi tam anlamı ile bitmiş bir sistem göremedim bu yüzden bundan sonra ki projelerinizde örnek teşkil etmesi için çalıştırıp bizzat denediğim GPS-GPRS-GSM projemi paylaşmak istiyorum.

Sim kart olarak turkcell M2M araç takip için kart kullanılmıştır.

GPS_Main dosyası
#include <18f4550.h> 
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOCPD,NOWRT 
#use delay(clock=20000000) 
#use rs232(baud=9600, xmit=PIN_D0, rcv=PIN_D1, stream=PC) 
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=GPS) 
#include "EXLCD.C"
#include "GpsInit.C"
GPRMCInfo MyGPRMCInfo;
char GPSData[128];
unsigned INT GPSDataPtr = 0;
char c;
int GPSDataReady = 0;
#INT_RDA 
void RDA_INT() 
{
   c=getchar (GPS);
   SWITCH (c)
   {
      CASE '$':
      GPSDataPtr=0;
      BREAK;
      
      CASE '\n':
      GPSDataReady=1;
      BREAK;
   }
   GPSData[GPSDataPtr++]=c;   
   clear_interrupt (INT_RDA);
}
void main()
{
   enable_interrupts (GLOBAL);
   clear_interrupt (INT_RDA);
   enable_interrupts (INT_RDA);
   lcd_init ();
   delay_ms (1000);
   c="";
   lcd_gotoxy (1, 1) ;
   printf (lcd_putc, "GPS Bekleniyor..");
   lcd_gotoxy (5, 2) ;
   printf (lcd_putc, "MONELGE");
   delay_ms (1000);
   fprintf (PC, "AT+CGPSRST=0");
   delay_ms (1000);
   fputc (0x0d, PC) ;
   delay_ms (1000);
   fprintf (PC, "AT+CGPSPWR=0");
   delay_ms (1000);
   fputc (0x0d, PC) ;
   delay_ms (5000);
   fprintf (PC, "AT+CGPSPWR=1");
   delay_ms (1000);
   fputc (0x0d, PC) ;
   delay_ms (1000);
   fprintf (PC, "AT+CGPSRST=1");
   delay_ms (1000);
   fputc (0x0d, PC) ;
   delay_ms (1000);
   lcd_putc ('\f');
   WHILE (true)
   {
      IF (GPSDataReady==1)
      {
         GPRMC_decode (GPSData,&MyGPRMCInfo);
         IF (MyGPRMCInfo.Valid=='A')
         {
            lcd_putc ('\f');
            lcd_gotoxy (1, 1) ;
            printf (lcd_putc, "Lng:%f%c", MyGPRMCInfo.Latitude, MyGPRMCInfo.N_S);
            lcd_gotoxy (1, 2) ;
            printf (lcd_putc, "Lot:%f%c", MyGPRMCInfo.Longitude, MyGPRMCInfo.E_W);
            delay_ms (1000);
            fprintf (PC, "AT+SAPBR=3, 1, \"Contype\", \"GPRS\"");
            delay_ms (1000);
            fputc (0x0d, PC) ;
            delay_ms (1000);
            fprintf (PC, "AT+SAPBR=3, 1, \"APN\", \"internet\"");
            delay_ms (1000);
            fputc (0x0d, PC) ;
            delay_ms (1000);
            fprintf (PC, "AT+SAPBR=1, 1");
            delay_ms (1000);
            fputc (0x0d, PC) ;
            delay_ms (1000);
            fprintf (PC, "AT+SAPBR=2, 1");
            delay_ms (1000);
            fputc (0x0d, PC) ;
            delay_ms (1000);
            fprintf (PC, "AT+HTTPINIT");
            delay_ms (1000);
            fputc (0x0d, PC) ;
            delay_ms (1000);
            fprintf (PC, "AT+HTTPPARA=\"CID\", 1");
            delay_ms (1000);
            fputc (0x0d, PC) ;
            delay_ms (1000);
            fprintf (PC, "AT+HTTPPARA=\"URL\", \"http://**.**.***.158/default.aspx?id=arac1&zaman=%d:%d:%d&tarih=%d.%d.%d&lat=%f&LONG=%f&hiz=%f\"", MyGPRMCInfo.DT.Hour, MyGPRMCInfo.DT.Minute, MyGPRMCInfo.DT.Second,
            MyGPRMCInfo.DT.Day, MyGPRMCInfo.DT.Month, MyGPRMCInfo.DT.Year, MyGPRMCInfo.Latitude, MyGPRMCInfo.Longitude, MyGPRMCInfo.Speed);
            delay_ms (1000);
            fputc (0x0d, PC) ;
            delay_ms (1000);
            fprintf (PC, "AT+HTTPACTION=0");
            delay_ms (1000);
            fputc (0x0d, PC) ;
            delay_ms (1000);
            fprintf (PC, "AT+HTTPTERM");
            delay_ms (1000);
            fputc (0x0d, PC) ;
            printf (lcd_putc, "\fBilgi Gitti");
            delay_ms (5000);
         }
         GPSDataReady=0;
      }
   }
}


GPS kodlarını Parse Yapmak için ccsinfo forum sitesinde bulduğum ve düzenlediğim lib.

#include <string.h> 
#include <stdlib.h> 
typedef struct _DateTimeInfo 
{ 
   int Day; 
   int Month; 
   int Year; 
   int Hour; 
   int Minute; 
   int Second; 
} DateTimeInfo; 
typedef struct _GPRMCInfo 
{ 
   char Valid; 
   DateTimeInfo DT; 
   float Latitude; 
   char N_S; 
   float Longitude; 
   char E_W; 
   float Speed; 
} GPRMCInfo; 
char* StrnmCpy(char *s1, char *s2, size_t n, size_t m) 
{ 
   int i; 
   char *s; 
    
   for (s=s1, i=n, s2+=n; i<=m; i++) 
      *s++ = *s2++; 
   *s = '\0'; 
    
   return s1; 
} 
int StrFnd(char *s, char c, size_t st) 
{ 
   int l; 
    
   for (l=st, s+=st ; *s != '\0' ; l++, s++) 
      if (*s == c) 
         return l; 
   return -1; 
} 
void GPRMC_decode(char *GPRMCStr, GPRMCInfo *RMCInfo) 
{ 
   int p1, p2; 
   char TempStr[16]; 
    
   p1 = StrFnd(GPRMCStr, ',', 0);      //find first comma 
   if (p1 == 6) 
   { 
      //check for valid packet: 
      if ( (StrFnd(GPRMCStr, 'A', p1+1) == 18) && (GPRMCStr[0]=='$')) //valid? 
      { 
         RMCInfo->Valid = 'A'; 
          
         //Get time 
         p1 = StrFnd(GPRMCStr, ',', 0);      //find first comma 
         p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma 
         RMCInfo->DT.Hour = atoi(StrnmCpy(TempStr, GPRMCStr, p1+1, p1+2));   //hour 
         RMCInfo->DT.Minute = atoi(StrnmCpy(TempStr, GPRMCStr, p1+3, p1+4)); //min 
         RMCInfo->DT.Second = atoi(StrnmCpy(TempStr, GPRMCStr, p1+5, p1+6)); //sec 
          
         //Get latitude & direction 
         p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma 
         p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma 
         RMCInfo->Latitude = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1)); 
         RMCInfo->N_S = GPRMCStr[p2+1]; 
          
         //Get longitude & direction 
         p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma 
         p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma 
         RMCInfo->Longitude = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1)); 
         RMCInfo->E_W = GPRMCStr[p2+1]; 
          
         //Get speed 
         p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma 
         p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma 
         RMCInfo->Speed = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1)); 
          
         //Get date 
         p1 = StrFnd(GPRMCStr, ',', p2+1);   //find next comma 
         p2 = StrFnd(GPRMCStr, ',', p1+1);   //find next comma 
         RMCInfo->DT.Day = atoi(StrnmCpy(TempStr, GPRMCStr, p1+1, p1+2));  //dd 
         RMCInfo->DT.Month = atoi(StrnmCpy(TempStr, GPRMCStr, p1+3, p1+4));//mm 
         RMCInfo->DT.Year = atoi(StrnmCpy(TempStr, GPRMCStr, p1+5, p1+6)); //yy 
      } 
      else                                //not valid 
      { 
         RMCInfo->Valid = 'V'; 
      } 
   } 
}


[IMG]http://img407.imageshack.us/img407/6858/fotoraf1y.jpg[/img]

MONELGEwww.mehmetonelge.com
[IMG]http://img10.imageshack.us/img10/4206/fotoraf2w.jpg[/img]

MONELGEwww.mehmetonelge.com

[IMG]http://img838.imageshack.us/img838/2226/fotoraf3b.jpg[/img]

MONELGEwww.mehmetonelge.com

C# Uygulama geliştirmeye devam ediyorum denem aşamasında kadar geldiğim nokta

[IMG]http://img692.imageshack.us/img692/4132/adszqqf.jpg[/img]

MONELGEwww.mehmetonelge.com

C# projem tam bitince onuda paylaşacağım.

Umarım Faydalı Olmuştur.
Dünyadaki en tehlikeli üç şey: 1) Elinde lehim makinesi olan bir programcı. 2) Yazılımla çalışan bir donanım. 3) Aklına fikir gelen bir kullanıcı.

Okan AKÇA

güzel bir çalışma hocam ellerinize saglık.

Extreme


Analyzer

Selam,

Tebrikler güzel çalışma olmuş. Benim dikkatimi harita ve win32 programı çekti. O kısımdan biraz bahseder misiniz, haritayı nasıl elde ettiniz? Bir de Ö.M. ile ilettiğim wiki konusunda yardımınızı bekliyorum :)

Analyzer
Üşeniyorum, öyleyse yarın!

MrDarK

Tebrik ederim hocam ;

Benzer bir çalışma işine girişeceğim bende yakın bir zaman içinde :) Projenin tamamlanmasında en çok sizi hangi aşama zorladı ?

Kullanacağım projede Telit GPS JN3
Telit GSM GPRS Modem GL865
MCU : 18F4620

kullanacağım ben birde 2x16 LCD (: Baya kompakt ve küçük bir devre tasarladık.
Picproje Eğitim Gönüllüleri ~ MrDarK

monelge

Analyzer programı c# ile GMAP.net kompanetini kullanarak yaptım. beni zorlayan kısım gps verisini parse ederken çok zorlandım nitekim sitededeki arkadaşlarda bende ccsinfo daki lib kullandığımda hata verdi bende bu kodu C derleyici ile (netbeans) ile tek veri parse için denedim ve kodda hatalar çıktı kodunun düzenlenmiş en son hali bu bundan sonrası yazılım kısmı. verileri mysql kaydediyorum.
Dünyadaki en tehlikeli üç şey: 1) Elinde lehim makinesi olan bir programcı. 2) Yazılımla çalışan bir donanım. 3) Aklına fikir gelen bir kullanıcı.

kantirici

Tebrikler. Benim sorum gms modül sim900 herhalde.Kodlara baktımda direk gprs baglantısı kurmuşsunuz.Benim inceledigm örneklerden şebeke için tanımlı olan ayarlar yapıldıktan sonra bağlantı kuruluyordu.Acaba bu m2m hattan dolayı mı?

Analyzer

Selam,

Şu tutorial'i takip ederek haritaları görüntüleyebildim. Ancak mapexplr_Load(null,null); ifadesini Form1_Load içerisine yazmayı unutmuş.
http://myactivities-mazen.blogspot.com/2012/01/simple-example-of-gmapnet-with-c.html

Analyzer
Üşeniyorum, öyleyse yarın!

monelge

#8
Alıntı yapılan: kantirici - 23 Nisan 2013, 20:31:52
Tebrikler. Benim sorum gms modül sim900 herhalde.Kodlara baktımda direk gprs baglantısı kurmuşsunuz.Benim inceledigm örneklerden şebeke için tanımlı olan ayarlar yapıldıktan sonra bağlantı kuruluyordu.Acaba bu m2m hattan dolayı mı?

modül sim908c kullandım. evet m2m sim karttan dolayı önce ilk denememde kendi sim kartımı denediğimde apn, username, password girmek zorunda kalmıştım.

mesaj birleştirme:: 24 Nisan 2013, 08:15:20

Alıntı yapılan: Analyzer - 24 Nisan 2013, 01:15:23
Selam,

Şu tutorial'i takip ederek haritaları görüntüleyebildim. Ancak mapexplr_Load(null,null); ifadesini Form1_Load içerisine yazmayı unutmuş.
http://myactivities-mazen.blogspot.com/2012/01/simple-example-of-gmapnet-with-c.html

Analyzer
ben şu şekilde yaptım

                        routes.Markers.Clear();
			routes.Clear();
			string id = _DataBase.data_table("select max(gps_id) from gps_veri where Arac_id='arac1'").Rows[0][0].ToString();
			DataTable veri = _DataBase.data_table("select * from gps_veri where Arac_id='arac1' and Gps_id='"+id.ToString()+"'");
			string _lng = veri.Rows[0][4].ToString();
			string _log = veri.Rows[0][5].ToString();
			PointLatLng yer = new PointLatLng(vericevir(_lng),vericevir(_log));
			gMapControl1.MapProvider = GMapProviders.GoogleMap;
			gMapControl1.MinZoom = 3;
			gMapControl1.MaxZoom = 25;

			gMapControl1.Manager.Mode = AccessMode.ServerAndCache;
			routes.Markers.Clear();
			routes.Markers.Add(new GMarkerGoogle(yer,GMarkerGoogleType.red));
			gMapControl1.Overlays.Add(routes);
			gMapControl1.ZoomAndCenterMarkers(routes.Id);
			gMapControl1.Zoom = 16;


gMapControl1.MapProvider = GMapProviders.GoogleMap;
burdaki GoogleMap kısmını değiğştirerek bing, yahoo, yandex, diğer haritalarıda kullanabilirsin hem uydu hemde yol görüntüsü değiştirebilirsininiz.
Dünyadaki en tehlikeli üç şey: 1) Elinde lehim makinesi olan bir programcı. 2) Yazılımla çalışan bir donanım. 3) Aklına fikir gelen bir kullanıcı.

kantirici

@monelge hocam manuel gprs den biraz bahsedermisiniz.kullandıgınız hat ve apn v.s .Ben bi türlü becerememiştimde.

Analyzer

Selam,

Evet dün akşam denediğimde googlemap çok yavaş çalışıyordu serverları. Yandex tüm lokasyonları rusça ve kril alfabesinde veriyordu. Bingmap'i beğenmedim, yahoo güzel geldi. Şimdilik yahoo dan devam. Bu arada Visual C# ile daha önce hiç çalışmadım, Borland C++ Builder'ı kullanıyorum. Ancak direkt dll ekleyip onu da toolbox a yerleştirmesi çok kullanışlı. SerialPort unsuru da hazır. Sizin gps den hangi formatta veri geliyor? Elimde aslında bir adet gps modül olması lazım. Güzel bir pazar çalışması olabilir.

Analyzer
Üşeniyorum, öyleyse yarın!

monelge

#11
Alıntı yapılan: kantirici - 24 Nisan 2013, 09:41:54
@monelge hocam manuel gprs den biraz bahsedermisiniz.kullandıgınız hat ve apn v.s .Ben bi türlü becerememiştimde.

aslında apn ilgil hiçbir sorun yaşamdım AT+ komutlarını inceledim hem operatörün hemde modülün standart bu kullanılıyor olarak gördüm. evet farklı uygulamalar için TCP/IP veya FTP için farklı komutlar kullanılıyor fakat AT+SAPBR komutu direk internet bağlantısı sağladığı ve benim işimi yeteri kadar gördüğü için çok üzerinde durmadım evet şöle bir sorunum var ve halen araştırmaktayım. gsm den data gönderiyorumda server veya client ten bir veri gönderip işleyemiyorum yani uzaktan led yakıp kapatamıyorum böle bir çözümünüz varsa yardımcı olabilirsiniz.

mesaj birleştirme:: 24 Nisan 2013, 10:05:55

Alıntı yapılan: Analyzer - 24 Nisan 2013, 09:47:57
Selam,

Evet dün akşam denediğimde googlemap çok yavaş çalışıyordu serverları. Yandex tüm lokasyonları rusça ve kril alfabesinde veriyordu. Bingmap'i beğenmedim, yahoo güzel geldi. Şimdilik yahoo dan devam. Bu arada Visual C# ile daha önce hiç çalışmadım, Borland C++ Builder'ı kullanıyorum. Ancak direkt dll ekleyip onu da toolbox a yerleştirmesi çok kullanışlı. SerialPort unsuru da hazır. Sizin gps den hangi formatta veri geliyor? Elimde aslında bir adet gps modül olması lazım. Güzel bir pazar çalışması olabilir.

Analyzer

GPS gelen veri ham veri direk locasyonu göstermiyor bunu decimal olarak çevirmeniz lazım o kısmıda şu şekilde çözdüm veriler direk database kaydettim işlemek istediğimde ise yada son durumu bulmak istediğimde ise şu kodu kullanım gerçek map üzerindeki kordinatlarını bulması için
Lat = 3702.44 N
Lng = 3510.87 E

Lat = 37+(02,44 / 60) = 37.0406666
Lng = 35+(10,87 / 60) = 35.1811666

bu değeri googlemap 37.040666,35.181166 aratırsanız direk o anki yeri doğru gösteriyor. fakat ham veriyi kullanırsanız doğru sonuçlar vermiyor.

CultureInfo culture = new CultureInfo("en-US");
double vericevir(string kord){
			double krd;
			double krd2;
			double gonder;
			
			krd = double.Parse(kord.Substring(0,2));
			string g1 = kord.Substring(3,4);
			krd2 = double.Parse(kord.Substring(2),culture);
			gonder = krd+(krd2/60);
			return gonder;
		}

burda önemli olan hatta çok sorun yaşadığım malum türkiyede ondalık ayırımı virgül  kullanıyoruz ama GMAP bu işlemi engilish sistem üzerine kurduğu için virgül yerine nokta kullanıyor bunu anlamam 3 günümü aldı :) sonra double çevirimi yaparken culture ekleyer bu sorunu çözdüm.


Dünyadaki en tehlikeli üç şey: 1) Elinde lehim makinesi olan bir programcı. 2) Yazılımla çalışan bir donanım. 3) Aklına fikir gelen bir kullanıcı.

MrDarK

Hocam süpersin kafamdaki birçok soru işaretini çözdün çok teşekkür ederim :)
Picproje Eğitim Gönüllüleri ~ MrDarK

ByTEK

#13
Güzel Proje Başarılar Dilerim.. GPS PC ye seri port üzerinden bağlı sanırım ? Peki GPS modülünü arabaya koyup evde veya iş yerinde ekrandan izlemek istesek nasıl birşey olacaktır ?

MrDarK

GPS bilgisayara değil GSM Modeme bağlı hocam ; GPRS ile internete bilgi veriliyor. İnternete bağlı bir bilgisayardanda verileri toparlıyor.
Picproje Eğitim Gönüllüleri ~ MrDarK