Gps modul hakkında sorular

Başlatan homer380, 01 Şubat 2014, 12:27:03

homer380

http://www.ebay.com/itm/390647042336 bu modulu kullanan var mı? varsa artıları ve eksileri nelerdir.
yada bu modul yerine tavsiye edebileceğiniz (kullandığınız) gps modulu var mı? mümkünse ebaydan olsun çünkü Türkiye'ye göre ucuz oluyor ebay.
internette bunun hakkında yeterli kod bulabilirmiyim?(daha araştırmaya başlamadım biraz tembellik ettiğimin farkındayım)
birde tavsiye edebileceğiniz elektronik pusula.

LukeSkywalker


MrDarK

Ankaradan temin edebileceğiniz bir sensor önereyim bende, telit JN3 adlı ürünü kullandim anteni ile birlikte alın ortalama 15 saniye içinde açık alanda çeker, kodlar NME standartında, rs232 ile okuma yaşıyorsunuz
Picproje Eğitim Gönüllüleri ~ MrDarK

ogy

@homer380 o üründen satın aldım ama yeni ulaştı elime.Vakit bulunca ve çalıştırabilirsem buradan paylaşırım öğrendiklerimi.

homer380

bende siparişi bugün verdim bir ay içinde gelir. çalışamalarını bekleyecem.

LukeSkywalker

#5
NMEA standartlarında veri gönderiyorsa okuması rahat. Gönderdiği veriler şu şekildedir;

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47


burada;
123519          -->    Mesajın geldiği saat bilgisi. 12:35:19 (UTC)
4807.038,N    -->    Enlem
01131.000,E  -->    Boylam
1                    -->   Sinyal Kalitesi
08                  -->   O anda ulaşılabilen uydu sayısı
545.4,M         -->   Deniz seviyesinden yükseklik

gibi bilgilerdir. Farklı mesajlarda var tabiki. Sadece GGA değil. Mesela GPVTG verisi hız bilgisi, açı bilgisi içerir.


homer380

@LukeSkywalker modulu hazırlamak için hangi komutlar gönderiliyor ya da bu komutları nerden bulacam. datasheet'i (http://www.rlocman.ru/i/File/2011/04/22/1.pdf) yeterli veri yoktu. modul ile spi, i2c ve uart ile haberleşebiliyrouz. bu haberleşmede hangi verileri (komutları) gönderecem aklıma takılan en önemli kısım burası. komutları nmea protokolunden mi bulacam.

MrDarK

Alıntı yapılan: homer380 - 03 Şubat 2014, 10:43:37
@LukeSkywalker modulu hazırlamak için hangi komutlar gönderiliyor ya da bu komutları nerden bulacam. datasheet'i (http://www.rlocman.ru/i/File/2011/04/22/1.pdf) yeterli veri yoktu. modul ile spi, i2c ve uart ile haberleşebiliyrouz. bu haberleşmede hangi verileri (komutları) gönderecem aklıma takılan en önemli kısım burası. komutları nmea protokolunden mi bulacam.

Kişisel fikrimi söyleyeceğim kimse yanlış anlamasın ; istanbulda bu modülü alabilecekken 26$ gibi bir rakam verip yurt dışından modül getirtmek bana mantıklı gelmiyor. Türkiyede 1 günde alabilecekken.Her neyse ;

Bu tarz modülü hazırlamak için kod yazmana ihtiyacın yok ; uart kısmından enerji vermeye başladığın andan itibaren nmea standardıda kodlar gönderecek modül sana 4800 veya 9600 baud hızında.

Dx ile iyi hatıralarım yok :) Daha önce tamda senin sipariş verdiğin zamanda bana da dx sitesini önermişlerdi arkadaşlar ama çok pişman oldum 60 günü geçmişti sonra paramı iade almak için çok uğraştım ama aldımda :) Bu dönem çin tatili 21 şubata kadar sürüyor diye biliyorum.

Benim çok eskilerde açtığım konu linki : https://www.picproje.org/index.php/topic,37329.msg271107.html#msg271107

o zaman modül için 28 dolar fiyat varmış şimdi 26 dolar :) oysa türkiyede bulabileceğin gps modül 18 dolara yakın hadi 7 dolarda anteni olsa fiyat bu şekilde birşey olması gerek :) Tabi kararı verdiniz. Benimki bilgilendirme olarak kalsın burada (:



Picproje Eğitim Gönüllüleri ~ MrDarK

LukeSkywalker

Verdiğiniz datasheetin 24. sayfasında defult ayarlar verilmiş. Üstteki mesajda da söylendiği gibi modüle enerji verdiğiniz andan itibaren veriler akmaya başlar.

Kazım

Herhangi bir confg. yapmayacaksın. Hatta module hiçbir veri ( TX ) göndermeyecek. Sadece NMEA stingini ( RX ) yakalayacaksın ( AURT ) . Çünkü confg. pinler zaten senin aldığın gps kartında bağlı. Sadece RX TX VCC GND pinleri çıkarılmış ki zaten bunlar yeterli. Defeault hız 9600 kb/s 'dir. MCU 'nun UART modulu 9600 hızına ayarla ve diziyi yakala.Ben de aynı modülü kartıma ekledim. Sanırım 30Sn de falan uyduları bulup mavi ledini yakmaya başlıyor. Ancak henüz karta programı atmadım. Denemedim yani ama sana 2 farklı nmea yakalama örneği göndereceğim sende.

Örnekte hızlar 4800 falan ama sen bunları değil sadece NMEA stringlerinin yakalanışını dikkate al.

// Program to Interface GPS with PIC18F4550 Microcontroller
#define FREQ 12000000
#define baud 4800
#define spbrg_value (((FREQ/64)/baud)-1)
#define rs LATA.F0
#define rw LATA.F1
#define en LATA.F2
#define lcdport LATB
unsigned char rx_data();
void lcd_ini();
void lcdcmd(unsigned char);
void lcddata(unsigned char);
unsigned char longi_data[12];
unsigned char lati_data[12];
unsigned char data,value=0;
unsigned int i=0,pos;
void main()
{
	TRISB=0;			// Set Port B as output port
	LATB=0;
	TRISA=0;
	LATA=0;
	SPBRG=spbrg_value;		// Fill SPBRG register to set the baud rate
	RCSTA.SPEN=1;			// To activate serial port (Tx and Rx pins)                                    
	RCSTA.CREN=1;			// To enable continuous reception
	lcd_ini();
	while(1)
	{
		data=rx_data();                     // Check the string '$GPGGA,'
		if(data=='$')
		{
			data=rx_data();
			if(data=='G')
			{
				data=rx_data();
				if(data=='P');
				{
					data=rx_data();
					if(data=='G');
					{
						data=rx_data();
						if(data=='G')
						{
						data=rx_data();
						if(data=='A')
						{
						data=rx_data();
						if(data==',')
						{
						data=rx_data();
						while(data!=',')
						data=rx_data();
						for(i=0;data!='N';i++)
						data=rx_data();
						lati_data[i]=data;  // Store the Latitude data
						}
						data=rx_data();
						if(data==',')
						{
						for(i=0;data!='E';i++)
						{
						data=rx_data();
						longi_data[i]=data;  // Store the Longitude data
						}
						}
						i=0;
						lcdcmd(0x80);
						while(i<11)
						{
						lcddata(lati_data[i]);	// Print the Latitude data
						i++;
						}
						i=0;
						lcdcmd(0xC0);
						while(i<12)
						{
						lcddata(longi_data[i]);	  // Print the Longitude data
						i++;
						}
						}
						}
						}
					}
				}
			}
		}
		Delay_ms(1000);
		for(i=0;i<12;i++)
		{
			data=0;
			lati_data[i]=0;
			longi_data[i]=0;
		}
	}
}
unsigned char rx_data(void)
{
	while(PIR1.RCIF==0);		// Wait until RCIF gets low
	return RCREG;			// Store data in Reception register
}
void lcd_ini()
{
	lcdcmd(0x38);		// Configure the LCD in 8-bit mode, 2 line and 5x7 font
	lcdcmd(0x0C);		// Display On and Cursor Off
	lcdcmd(0x01);		// Clear display screen
	lcdcmd(0x06);		// Increment cursor
	lcdcmd(0x80);		// Set cursor position to 1st line, 1st column
}
void lcdcmd(unsigned char cmdout)
{
	lcdport=cmdout;		//Send command to lcdport=PORTB
	rs=0;						
	rw=0;
	en=1;
	Delay_ms(10);
	en=0;
}
void lcddata(unsigned char dataout)
{
	lcdport=dataout;	//Send data to lcdport=PORTB
	rs=1;
	rw=0;
	en=1;
	Delay_ms(10);
	en=0;
}


Örnek 2:

#include <system.h>
#include <stdlib.h>
#include <string.h>
#include "LCD_lib.c"

// Clock Frequency
#pragma CLOCK_FREQ 4000000

//slm - Target PIC16F628 configuration word
#pragma DATA _CONFIG, _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF & _MCLRE_ON & _LVP_OFF & _CP_OFF

#define spBAUD  9600
#define FOSC 4000000L
#define fSPBCLK (FOSC)        /* UART Baud rate generator clock (high speed) */
//#define fSPBCLK (FOSC / 4)    /* UART Baud rate generator clock (low speed) */
#define SPBRG_VAL (fSPBCLK / (spBAUD * 16L)) - 1L

// Defines for hardware USART - from rs232_driver.h
// PIC16F628 defaults for hardware USART support
#define TX_PORT		0x06
#define TX_TRIS		0x86
#define TX_BIT		2
#define RX_PORT		0x06
#define RX_TRIS		0x86
#define RX_BIT		1
#define e_SPBRG		0x99 
#define e_RCREG		0x1a
#define e_TXREG		0x19 
#define e_TXSTA		0x98 
#define e_RCSTA		0x18 
#define e_TXIF_PIR	0x0c 
#define e_RCIF_PIR	0x0c 
#define e_TXIF_BIT	4 
#define e_RCIF_BIT	5 
#define MODE		(USART_reset_wdt | USART_HW)

// bit_time = FOSC / 4 / BAUDRATE 
// Needs to be defined, but not used for HW USART
#define bit_time 521

// Had to define this here, instead of with the rest of the includes?
#include <rs232_driver.h>
// Start the fun!
void main()
{	
	// Variable declarations
	char rxBuffer[80]; 				//receive buffer
	char delims[] = ",";			// Delimeter is a comma
	char *result = NULL;			// Parsing the string
	char line1[22];					// First line of the display
	char line2[22];					// Second line of the display
	int sats;						// number of satellites in view
	
	// Set up the ports	
	trisa = 0x00; // port a output
	trisb = 0x0F; // port b High bits output, low bits input
    
	// Initialize the USART
	uart_init(1,SPBRG_VAL);  // set high speed divisor mode and divisor value for 9600 baud
    
    // Init the LCD, Clear the Screen, and wait for the first GPGGA string.
    LCD_Setup();
    LCD_Clear();
    goto_line( 1 );
    lprintf( "GPS Receiver");
    goto_line(2);
    lprintf( "Version 1.0");
    goto_line(3);
    lprintf( "Stu Mitchell");
    // Wait for the first GPGGA string
    delay_s(1);
    LCD_Clear();
   	// endless loop
	while( 1 ) {
		// Get the string, wait until the new line (i.e. gets ())
		gets( rxBuffer );
		//
		// parse the buffer and build the display lines
		//
		result = strtok( rxBuffer, delims );   		// get message ID
		
		if ( !strcmp (result, "$GPGGA") ) {     	// Parse, if NEMA ID is position sentence
			if( rxBuffer[7] != ',' ) {    			// If no time, old fix
				result = strtok( NULL, delims );	// store the time
				
		        }
			strcpy( line1, "LAT:  " );			// Set up the first two lines for display	
			strcpy( line2, "LON: " );        
			result = strtok( NULL, delims ); 		// Get lat
			strcat( line1, result );
			result = strtok( NULL, delims ); 		// Get N or S
			strcat( line1, " " );
			strcat( line1, result );
			result = strtok( NULL, delims ); 		// Get longitude
			strcat( line2, result );
			result = strtok( NULL, delims ); 		// Get E or W
			strcat( line2, " " );
			strcat( line2, result );
			
			// print first two lines, lat and long
			goto_line( 1 );
			lprintf( line1 );
			goto_line( 2 );
			lprintf( line2 );
			
			// Now work on the ALT and # of sats
			strcpy( line1, "                   ");
			strcpy( line2, "                   ");
			result = strtok( NULL, delims );		// GEREKSİZ TOKENLERİ ATLAMA
			result = strtok( NULL, delims );		// number of sats
			sats = strtoi( result,NULL,10);
			if( sats >= 5 ) {						// If 3D fix, more than 4 sats 
				strcpy( line2, "Tracking " );
				strcat( line2, result );
				strcat( line2, " sats" );
				result = strtok( NULL, delims );	// grab HDOP
				result = strtok( NULL, delims );	// grab ALT
				strcpy( line1, "ALT: " );
				strcat( line1, result );
				strcat( line1, " M   " );
			}
			if( (sats >= 3) && (sats < 5) ) {
				strcpy( line2, "Tracking " );
				strcat( line2, result );
				strcat( line2, " sats" );
				result = strtok( NULL, delims );	// grab HDOP
				result = strtok( NULL, delims );	// grab ALT
				strcpy( line1, "ALT: 2D           " );
			}
			if( sats < 3 ) {
				strcpy( line2, "Searching...       ");
				strcpy( line1, "ALT: OLD FIX       ");
			}
						
			// print the next two lines, alt and status			
			goto_line( 3 );
			lprintf( line1 );
			goto_line( 4 );
			lprintf( line2 );
			Blink_LEDs();
		} /////////////////////////////////////////////////////////////////////////////
		// Clear the receive buffers
		*rxBuffer=NULL;
		*result=NULL;
		getch();
	
	} // end while loop 
	
}



LCD Library file 
Here is the library file with the reusable LCD functions. They were based on the 'include' file, which came with Sourceboost. But to understand what was going on, I decided to write my own, scaled down library. 
////////////////////////////////////////////////////////////////////////////
// LCD_lib.c - LCD functions. Based on the lcd_driver.h file
//
//     Note - this is VERY dependant on the PIC wiring diagram
//
////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////
// LCD with HD44780 drive chip
////////////////////////////////////////////////////////////////////////////
//
// Designed and test for 16F628
//   
// PortB - Control signals
// PortA - Data signals
//
// Wiring Diagram
//
// LCD 	PIC   
// ===  ====
// RS 	RB06
// WR 	RB05
// E  	RB04
//
// DB7  RA03
// DB6  RA02
// DB5  RA01
// DB4  RA00
//                                                                               
// Using 4 Bit interface
//

#include <system.h>

// Function Declarations
void LCD_Setup(void);
void LCD_FunctionMode(void);
void LCD_DataMode(void);
void LCD_RawWriteNibble(char);
void LCD_Write(char);
void LCD_RawWrite(char);
void lprintf( const char *lcdptr );   //write string 
void LCD_Clear();
void Blink_LEDs();
void goto_line(int);

///////////////////////////////////////////////////////////////////////////
// Control signal bit definitions
////////////////////////////////////////////////////////////////////////////
// HD44780 pin numbers
#define LCD_E     4
#define LCD_RW    5
#define LCD_RS    6

////////////////////////////////////////////////////////////////////////////
// LCD Commands ( Refer to LCD Data Sheet )
////////////////////////////////////////////////////////////////////////////
#define clear_lcd         		0x01 // Clear Display
#define return_home       		0x02 // Cursor to Home position
#define entry_mode        		0x06 // Normal entry mode
#define entry_mode_rev    		0x04 // Normal entry mode  -reverse direction
#define entry_mode_scroll 		0x07 // - with shift
#define entry_mode_scroll_rev  	0x05 // reverse direction
#define system_set_8_bit  		0x38 //8 bit data mode 2 line ( 5x7 font )
#define system_set_4_bit  		0x28 // 4 bit data mode 2 line ( 5x7 font )
#define system_set_reset  		0x30 // Reset code
#define display_on        		0x0C // Display ON - 2 line mode
#define display_off       		0x08 // Display off
#define set_dd_line1      		0x80 // Line 1 position 1
#define set_dd_line2      		0xC0 // Line 2 position 1
#define set_dd_line3	  		0x94 // Line 3 position 1
#define set_dd_line4      		0xD4 // Line 4 position 1
#define set_dd_ram        		0x80 // Line 1 position 1
#define write_data        		0x00 // With RS = 1
#define cursor_on         		0x0E // Switch Cursor ON
#define cursor_off        		0x0C // Switch Cursor OFF
#define cursor_blink_on   		0x0F // Cursor plus blink
#define cursor_shift_right 		0x14 // Move cursor right
#define cursor_shift_left 		0x10 // Move cursor left
#define display_shift_right 	0x1C // Scroll display right
#define display_shift_left 		0x18 // Scroll display left

#define WriteNoDelay 1
#define WriteDelayTime 0
#define WriteUseBusy 2

#define LineLength 20 // Length of a single line, used in lprintf

/////////////////////////////////////////////////////////////////////
// LCD Function                    
/////////////////////////////////////////////////////////////////////

// Clear the LCD
void LCD_Clear()
{
	LCD_FunctionMode();
	LCD_Write( clear_lcd ); // clear display
	delay_ms(10);
	LCD_Write( set_dd_ram );
	LCD_DataMode();
	delay_ms(10);
}

// Setup the LCD
void LCD_Setup(void)
{
	delay_ms(500); // Power up delay
	// Entering LCD Command
	LCD_FunctionMode();
	// Reset sequence as described in data sheets
	LCD_RawWriteNibble( system_set_reset >> 4 ); 
	delay_ms(10); // min delay here of 4.1 ms
	LCD_RawWriteNibble( system_set_reset >> 4 );
	delay_ms(5); // min delay here of 100us
	LCD_RawWriteNibble( system_set_reset >> 4 );
    // Setup 2 lines, bit mode, 5x7 font
	LCD_Write( system_set_4_bit );		
	// Turn off the display
	LCD_Write( display_off );
	// Set the entry mode
	LCD_Write( entry_mode );
	// Turn on the display
	LCD_Write( display_on );
	// Position 1, Line 1
	LCD_Write( set_dd_ram );
	// Entering LCD Data
	LCD_DataMode();
}

// Blink the LEDs - yay!
void Blink_LEDs(void)
{
	char i = 0;
	for(i=0; i< 3; i++) {
	set_bit( porta, 3);
	delay_ms( 50 );
	clear_bit( porta, 3);
	delay_ms( 50 );
	}
}

// Set the LCD in function mode
void LCD_FunctionMode(void)
{
	//slm - clear_bit( porta, LCD_RS );
	clear_bit( portb, LCD_RS );
}

// Set the LCD to data mode
void LCD_DataMode(void)
{
	//slm - set_bit( porta, LCD_RS );
	set_bit( portb, LCD_RS );
}

// Write the character to the LCD
void LCD_Write(char d )
{
	LCD_RawWrite( d );
	delay_ms( 1 ); // enough time for normal command execution - clear and home need longer!!	
}

// Write the character to the LCD
void LCD_RawWrite( char d )
{		
	// output upper nibble
	LCD_RawWriteNibble( d >> 4 );
	// output lower nibble
	LCD_RawWriteNibble( d );
}

// Do it 4 bits at a time
void LCD_RawWriteNibble(char d )
{
	char n = d;
	// Make sure the lower bits of the port are set as outputs
	trisa &= 0xF0;
	// keep upper data bits the same, clear the lower bits	
	porta &= 0xF0;
	//Strip high bits on data
	n &= 0x0F;
	// OR the lower bits with d, which puts the data on portb.
	porta |= n;
	// set writing mode
	clear_bit( portb, LCD_RW );
	// Clock data
   	asm NOP // setup time
	asm NOP // setup time
	asm NOP // setup time
    // Write nibble by toggling E bit
	set_bit( portb, LCD_E );
	asm NOP // delay
	asm NOP // delay
	asm NOP // delay
	clear_bit( portb, LCD_E );
	asm NOP ;// holdup time
	// set back to read mode
	clear_bit( portb, LCD_RW );
}

// Print one line to the LCD
//   LineLength is a global define
void lprintf( const char *lcdptr )
{
	char pi;
	char c;
	pi = 0;
		
    while( pi <= LineLength  )
    {
		c = lcdptr[pi++];
		if ( c == 0 ) 					// End of Line
			break;
		LCD_Write( c );					// Display on LCD
	}
}

// Move to line number 'd'
void goto_line( int d )
{
	LCD_FunctionMode();
	switch( d ) {
		case 1:
			LCD_Write( set_dd_line1 );
			break;
		case 2:
			LCD_Write( set_dd_line2 );
			break;
		case 3:
			LCD_Write( set_dd_line3 );
			break;
		case 4:
			LCD_Write( set_dd_line4 );
			break;
		default:
			LCD_Write( set_dd_line1 );
			break;
		}
	LCD_DataMode();

}


Örnekleri denemedim.

ogy

Alıntı YapKişisel fikrimi söyleyeceğim kimse yanlış anlamasın ; istanbulda bu modülü alabilecekken 26$ gibi bir rakam verip yurt dışından modül getirtmek bana mantıklı gelmiyor. Türkiyede 1 günde alabilecekken

Hocam aynı modül üzerinden konuşursak; ben uzakdoğudan 15$'a aldım ve 20 günde kapıma geldi.

http://www.direnc.net/GPS-APM25-NEO-6M-module,PR-15786.html burada ise yurtiçi fiyatı mevcut.Daha uygunu var mı bilmiyorum.

Benim yurtdışından alma sebebim aciliyetimin olmaması.Yani gelsin kenarda dursun ve vaktim olunca üzerine çalışırım, öğrenirim mantığıyla alırım bu tarz ürünleri.Ama acilen ihtiyacım olsaydı yurtiçinden alırdım alıyorumda.Ama onun dışında 4 katı fiyata satın almak dokunur bana.
Tercih meselesi diyelim kısaca :) İyi çalışmalar.


MrDarK

#11
Araştırmadan yorum yaptığını düşünüyorum.

İncele istersen ; http://www.direnc.net/GPS-01-MODUL,PR-1641.html

Arada 7 tl fark var bu ürünle dx sitesiyle kıyaslarsanız.

Benim söylediğim modül ise JN3 adında telit marka bir modül. Serdar Bey ile iletişime geçebilirseniz LTE elektronikle o size fiyatı söyleyecektir. En son hatırladığım bu modül ortalama 18$ fiyat civarında idi. Hemde 1 günde evinizde olacaktır. Benimki sadece bir öneri

İyi çalışmalar
Picproje Eğitim Gönüllüleri ~ MrDarK

LukeSkywalker

Patch antenli modüller varken neden bunlarla uğraşıyorsunuz?

homer380

İlgilenen herkese teşekkür ederim.şu sıralar bir tembellik var üstümde yoksa iyice araştırmadan soru sormazdım. araştırma yaparken hem datasheet okumayı öğreniyorum hemde farklı dillerle yazılmış programları okurken o dile aşinalık sağlıyorum, dedim ya bu sıralar bir tembellik var üzerimde.  ayrıca bu modulu seçme nedenim sadece fiyatı.kusuruma bakmayın.

LukeSkywalker