Interfacciare un ricevitore GPS con un Basicx 24Data di pubblicazione: 14-06-2005 | Versione Italiana | (No English Version) Parole chiave: - BX24 - GPS - How-To - |
L'articolo che segue mostra come collegare un ricevitore GPS RGM2000-RS232 ad un modulo BascicX 24
e fornisce il sorgente d'esempio, in basic, per effettuare il parser delle informazioni ricevute dal GPS.
Il modulo GPS della RoyalTek (http://www.royaltek.com/) RGM2000-RS232 è un completo ricevitore dotato di: antenna interna, interfaccia seriale RS232, connettore PS2; ed è compatibile con lo standard NMEA. NMEA lo standard che specifica: segnali elettrici, protocollo, temporizzazione della trasmissione e gli specifici formati di dati detti "sentences" ovvero "frasi" per la comunicazione tra un sensore GPS ed un apparato elettronico come un PC o microprocessore.
Maggiori informazioni sullo standard NMEA sono reperibili all'URL: http://www.nmea.org/pub/0183/
Il connettore PS2 del RGM2000-RS232, serve esclusivamente per fornire l'alimentare al ricevitore e l'interfaccia seriale. Infatti dai Pin 3 e 4 della porta PS2, tastiera o mouse, di un PC è possibile prelevare una tensione continua di 5V con una corrente massima di 500mA. Di seguito è riportata la piedinatura di un connettore PS2 femmina:
1 |
- |
Not Connected |
2 |
RD |
Receive Data |
3 |
GND |
Ground for voltage |
4 |
VCC |
+5 voltage (max. 500mAmp) |
5 |
- |
Not Connected |
6 |
TD |
Transmit Data |
Il circuito da realizzare, per collegare al BX24 e alimentare il ricevitore GPS, riportato di seguito è particolarmente semplice e non presenta alcuna difficoltà.
Nell'immagine che segue è possibile vedere come collegare le linee d'alimentazione a 5V alla presa PS2.
Il sorgente che segue effettua, dopo aver stabilito la connessione seriale sulla COM 3, il parser delle sentence con intestazione $GPGGA, estraendo: latitudine, longitudine e altitudine dal livello del mare.
Option Explicit Const LEDon As Byte = 0 Const LEDoff As Byte = 1 Const LED_VERDE As Byte = 26 Const LED_ROSSO As Byte = 25 Const Pulsante As Byte = 5 Const PortNumber As Byte = 3 Const TxPin As Byte = 17 Const RxPin As Byte = 16 Const BaudRate As Long = 4800
Public Const OutputBufferSize As integer = 10 Public Const InputBufferSize As integer = 80 '134
Public InputBuffer(1 To InputBufferSize) As Byte Public OuputBuffer(1 To OutputBufferSize) As Byte
'APERTURA DELLA PORTA COM Public Sub OpenSeriale() Call OpenQueue(InputBuffer, InputBufferSize) Call OpenQueue(OuputBuffer, OutputBufferSize) Call DefineCom3(RxPin, TxPin, bx0000_1000) 'Setta la seriale come inverted, no parity, 8 bits. Call OpenCom(PortNumber, BaudRate, InputBuffer, OuputBuffer) End Sub 'FUNZIONE PER RICEVERE UN BYTE Public Sub GetByte( _ ByRef Value As Byte, _ ByRef Success As Boolean)
Success = StatusQueue(InputBuffer) If (Success) Then Call GetQueue(InputBuffer, Value, 1) Else Value = 0 End If End Sub
'FUNZIONE DI LETTURA GPS Public Function read_GPS( _ ByRef latitude as string, _ ByRef longitude as string, _ ByRef altitude as string, _ ByRef dir_lat as byte, _ ByRef dir_lon as byte) as byte
Dim Key As Byte Dim Success As Boolean Dim sentence(5) as byte Dim start as boolean Dim i as byte Dim s as byte
'Legge solo la sentence $GPGGA sentence(0) = Asc("$") sentence(1) = Asc("G") sentence(2) = Asc("P") sentence(3) = Asc("G") sentence(4) = Asc("G") sentence(5) = Asc("A") s=0 i=0 start = false latitude = "" longitude = "" altitude = "" Do Call GetByte(Key, Success) 'Legge un carattere per volta dalla seriale if(Success) then 'Se trova un $ If (Key = 36) and (Not(start)) Then start = true End if 'Se trova uno o If ((Key = 13) or (Key = 10)) and (start) Then start = false read_GPS = 0 exit function End if 'Se trova un , if(Key = 44) and (start) then If (i>15) then read_GPS = 0 exit function End if i=i+1 End if if (start) and (Key <> 44) Then if(i=0) then 'check sentence type if not(sentence(s)=Key) then read_GPS = 0 exit function End if s=s+1 ElseIf (i=2) then latitude = latitude & chr(Key) ElseIf (i=3) then dir_lat = Key ElseIf (i=4) then longitude = longitude & chr(Key) ElseIf (i=5) then dir_lon = Key ElseIf (i=6) then if (Key = 48) then read_GPS = 1 exit function end if ElseIf (i=10) then if not(Key=77) then 'M read_GPS = 0 exit function End if ElseIf (i=11) then altitude = altitude & chr(Key) ElseIf (i=12) then If (Key=77) then 'M read_GPS = 2 Else read_GPS = 0 End if exit function End if End if End if loop End function
'---------------------- 'MAIN '---------------------- Public Sub Main() Dim res as byte Dim latitude as string Dim longitude as string Dim altitude as string Dim dir_latitude as byte Dim dir_longitude as byte
Call OpenSeriale() Do Call Delay(0.1) Call PutPin(LED_ROSSO, LEDon) If (GetPin(Pulsante) = 1) Then Call PutPin(LED_VERDE, LEDon) res = read_GPS(latitude,longitude,altitude,dir_latitude,dir_longitude) if (res > 1) then debug.print "Latitudine:" debug.print latitude debug.print chr(dir_latitude) debug.print "Longitudine:" debug.print longitude debug.print chr(dir_longitude) debug.print "Metri dal livello del mare:" debug.print altitude ElseIf (res = 1) then debug.print "Segnale non buono" Call PutPin(LED_ROSSO, LEDoff) ElseIf (res = 0) then debug.print "Sentence non valida" Call PutPin(LED_ROSSO, LEDoff) End if Call PutPin(LED_VERDE, LEDoff) End if loop End Sub
La funzione che si occupa di scaricare byte a byte la sentence inviata dal GPS è read_GPS
Public Function read_GPS( _ ByRef latitude as string, _ ByRef longitude as string, _ ByRef altitude as string, _ ByRef dir_lat as byte, _ ByRef dir_lon as byte) as byte
questa ritorna un intero con i seguenti valori:
-
0 di sentece non valida o non è del tipo $GPGGA.
-
1 se il GPS trasmette sentence con livello di qualità 0 perchè non riesce a riceve il segnale dai satelliti.
-
2 la sentence è valida e corretta.
Nella tabella che segue è descritta voce per voce la sentences $GPGGA
Campo |
Formato |
Esempio |
Descrizione |
1 |
hhmmss.ss |
125642.57 |
Ora UTC - GPS |
2 |
llll.ll |
4512.72 |
Latitudine della posizione attuale (numero di decimali variabile) es: 4531.47 = 45°31.47' |
3 |
A |
N |
Emisfero della posizione attuale: N=Nord; S=Sud |
4 |
yyyyy.yy |
00934.88 |
Longitudine della posizione attuale (numero di decimali variabile) es:00917.21 = 009°17.21'
|
5 |
A |
E |
Verso della posizione attuale: E=Est; W=Ovest |
6 |
n |
1 |
Qualità del rilevamento GPS: 0=non valido; 1=GPS; 2=DGPS |
7 |
x |
8 |
Numero di satelliti in vista (teorica, non necessariamente in uso o ricevuti) |
8 |
x.x |
1.9 |
HDOP - Horizontal Dilution Of Precision |
9 |
x.x |
540.4 |
Altitudine dell'antenna GPS relativa al livello medio del mare (geoide) |
10 |
A |
M |
Indicatore dell'unità di misura dell'altitudine M=metri |
11 |
x.x |
45.8 |
Altezza (separazione) del geoide (livello medio del mare) rispetto all'elissiode WGS84 |
12 |
A |
M |
Indicatore dell'unità di misura della separazione del geoide M=metri |
13 |
x.x |
8.0 |
Tempo in secondi dall'ultimo aggiornamento DGPS |
14 |
nnnn |
1023 |
Identificatore della stazione DGPS (0000-1023) |
Sorgente in basic:
BX24_GPS_NMEA.zip
Link utili:
Sito RoyalTek http://www.royaltek.com/
Documentazione GPS RGM2000-RS232
Sito standard NMEA:
http://www.nmea.org/pub/0183/
Segnala questo articolo:
Parole chiave: - BX24 - GPS - How-To -
|