El sensor GPS ens permet conèixer la nostra posició geogràfica actual però també ens facilita tota una sèrie de dades addicionals com l'hora actual, l'orientació (angle respecte al nord), l'altitud i la velocitat de desplaçament.
El Sensor GPS es comunica amb el microcontrolador amb una connexiò sèrie (la mateixa que fa servir el monitor sèrie). Cal connectar, a més de l'alimentació, la pota TX del sensor amb la RX del microcontrolador i la pota RX del sensor amb la TX del microcontrolador. La figura següent mostra com connectar-lo:
Cal tenir present que el sensor GPS requereix rebre informació des dels satèl·lits del sistema GPS. Per tant cal que estigui a l'exterior o al costat d'una finestra des de la que pugui veure un nombre suficient de satèl·lits. Els punts de connexió de la placa del sensor GPS són els següents:
Pota | Utilització | Comentaris |
3.3 V | Positiu de l'alimentació | |
GND | Negatiu de l'alimentació | |
TX | Transmissió de dades | Comunicaciò sèrie |
RX | Recepció de dades | |
FIX | Connectat als satèl·lits | La sortida està desactivada (GND) quan hi ha connexió i està intermitent si no n'hi ha. La placa porta un led connectat a aquesta pota. |
BAT | Positiu de la bateria | Possibilitat de connectar-hi una bateria d'entre 3 i 3,3 V |
La funció de la bateria és alimentar el sensor quan no està alimentat el microcontrolador. Amb la bateria el sensor pot mantenir informació de l'hora exacta. Mentre el sensor s'alimenta per la pota BAT només funciona el seu rellotge intern i no es comunica ni amb els satèl·lits ni amb el microcontrolador. La pota fix la podríem connectar a una entrada del microcontrolador i així ens podríem estalviar de comunicar-nos amb el sensor mentre no està connectat amb els satèl·lits.
En el programa que presentem a continuació podem provar la comunicació del microcontrolador amb el sensor i analitzar les dades que rebem. El probrama obre dos canals sèrie i mira per quin dels dos es reben dades. Quan detecta que un dels canals rep dades les llegeix i les envia cap a l'altre (que suposa que és el monitor sèrie).
Per exemple, posant el sensor al costat de la finestra del meu despatx vaig rebre, entre altres, les següents dades:
$GPRMC,141159.000,A,4123.0481,N,00206.9632,E,0.16,295.02,181214,,,D*65
$GPGGA,141159.000,4123.0481,N,00206.9632,E,2,09,1.14,88.8,M,51.3,M,0000,0000*57
La primera línia ($GPRMC) correspon a les dades mínimes recomanades i la segona ens aporta informació addicional. Anem a analitzar la informació rebuda a la primera línia:
Observem com convertir les dades rebudes en informació útil. L'hora actual té les hores, els minuts i els segons abans del punt i les mil·lèsimes de segon després del punt. L'hora indicada és la del eridià de Greenwich o hora GMT que correspon a la nostra hora solar. La nostra hora oficial la podem obtenir sumant 1 a l'hora GMT a l'hivern i sumant-hi 2 a l'estiu.
Si ens surt una A després de l'hora és que les dades són vàlides. En cas contrari surt una V.
La latitud és l'angle del punt considerat respecte a l'equador. Una latitud zero correspon a l'equador, les latituds positives a punts situats al nord de l'equador i les negatives a punt situats al sud. Els angles de 90 graus (positius o negatius) corresponen als pols. La latitud no pot ser més gran de +90° ni més petita de -90°. A la latitud les dues primeres xifres són els graus i les següents són els minuts. Si la latitud és positiva (nord) surt una N i si és negativa (sud) una S.
La longitud correspon a l'angle, dibuixat a l'equador, del punt considerat respecte al meridià de Greenwich. A la longitud les tres primeres xifres són els graus i les següents són els minuts. Si la longitud és positiva (est) surt una E i si és negativa (oest) una W.
Les coordenades que rebem directament del sensor no ens serveixen per a la majoria d'aplicacions (per exemple Google Maps) i cal convertir-les. Per exemple, Google Maps no entendrà les coordenades així:
4123.0481 N, 00206.9632 E
Però sí que les entén d'aquesta altra manera:
41° 23.0481, 002° 06.9632
La velocitat de desplaçament es mesura en knots (milles nàutiques per hora). Cal multiplicar el valor per 1,852 per obtenir la velocitat en km/h.
L'orientació ens diu l'angle (en graus) respecte al nord.
Finalment tenim la data amb l'any indicat amb només dues xifres.
Una part de la informació de la segona línia és redundant.
A més hi podem trobar la qualitat del senyal rebut, el nombre de satèl·lits detectats i l'altitud en metres.
Per fer servir el sensor ens convindrà la Adafruit-GPS-Library que ens facilita molt la feina ja que ens dóna les dades per separat. Un cop ja tinguem la llibreria, podem fer els nostres programes. Les diferents dades que podem demanar (suposant que hem definit el sensor amb el nom sensorGPS) són:
Tipus | Comanda | Utilitat |
Configuració | sensorGPS.begin(velocitat) | Inicialitza el sensor GPS i defineix la velocitat de comunicació |
sensorGPS.sendCommand(comanda) | Envia una comanda de configuració | |
sensorGPS.lastNMEA() | Dades del sensor en brut | |
Cobertura | sensorGPS.parse(sensorGPS.lastNMEA()) | Torna true si les dades són útils |
sensorGPS.fix | Dóna 0 si no ha trobat prou satèl·lits | |
sensorGPS.fixquality | Qualitat del senyal | |
sensorGPS.satellites | Nombre de satèl·lits | |
Hora GMT | sensorGPS.hour | Hora |
sensorGPS.minute | Minuts | |
sensorGPS.seconds | Segons | |
sensorGPS.milliseconds | Mil·lisegons | |
Data | sensorGPS.day | Dia |
sensorGPS.month | Mes | |
sensorGPS.year | Any (dues xifres) | |
Coordenades | sensorGPS.latitude | Latitud en el format del sensor |
sensorGPS.lat | Sentit de la latitud (N o S) | |
sensorGPS.longitude | Longitud en el format del sensor | |
sensorGPS.lon | Sentit de la longitud (E o W) | |
Altres dades | sensorGPS.speed | Velocitat (en knots) |
sensorGPS.angle | Orientació (en graus) | |
sensorGPS.altitude | Altitud (en metres) |
A continuació tenim un programa bàsic que llegeix les dades del sensor i les envia al monitor sèrie. Inicialment inclou les llibreries del sensor GPS i de la comunicació sèrie. Després defineix un objecte corresponent al sensor (en el que hem d'indicar la comunicació sèrie que farà servir), una variable per controlar el temps i una per indicar si farem servir interrupcions que definirem com a false perquè no les farem servir.
En el setup obrim una comunicació sèrie amb l'ordinador, inicialitzem i configurem el sensor GPS i esperem un segon a que el sensor es reconfiguri.
En el bucle loop llegim el sensor i mirem si han arribat dades correctes. Si no han arribat dades tornem a començar el loop fins que arribin. Per no saturar la comunicació, només tractem les dades cada dos segons. Això ho fem guardant el valor inicial de la funció millis en una variable i comparant-los. Quan la diferència sigui més gran que 2000 vol dir que ja han passat dos segons. També vigilem que millis no s'hagi reinicialitzat i si és el cas actualitzem la variable.
Cada dos segons mostrem les dades llegides. Primer mostrem les dades tal com han arribat i seguidament hi ha aquelles que es poden obtenir amb pocs satèl·lits detectats i després aquelles que requereixen més satèl·lits i que només mostrarem si SensorGPS.fix està a 1 que vol dir que hem pogut connectar amb el mínim nombre de satèl·lits necessàris.
A continuació hi ha un exemple del que s'ha mostrat pel monitor sèrie a l'executar aquest programa:
Connectat: 1
Qualitat del senyal: 2
Hora actual: 14.11.59,0 GMT
Data actual: 18-12-2014
Sats: 9
Coordenades: 4123.0483N, 206.9632E
Velocitat: 0.16 knots
Velocitat: 0.30 km/h
Angle respecte al nord: 295.02 graus
Altitud: 88.80 m