27 de maig 2015

Sensor GPS



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.
Sensor GPS

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:
Connexió del sensor GPS


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).

Programa




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:

Dades del sensor GPS


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.

Hora GPS


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.

Latitud


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.

Longitud


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.

Velocitat


L'orientació ens diu l'angle (en graus) respecte al nord.

Orientació


Finalment tenim la data amb l'any indicat amb només dues xifres.

Data


Una part de la informació de la segona línia és redundant.

Dades del sensor GPS


A més hi podem trobar la qualitat del senyal rebut, el nombre de satèl·lits detectats i l'altitud en metres.

Altitud


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.

Programa

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


20 de maig 2015

Sensor d'acceleració i camp magnètic



El sensor d'acceleració i camp magnètic LSM303 ens permet conèixer el camp magnètic i, per tant, actuar com a brúixola així com l'acceleració i, per tant, determinar la verticalitat. Té un diàmetre de menys de 17 mm (com una moneda de dos cèntims) i un gruix inferior als 2 mm. Això facilita el seu us incorporant-los a elements tèxtils.

Avís: En el moment d'escriure aquesta pàgina no es podien compilar les llibreries d'aquest sensor en les plaques Gemma.

Aquest sensor es connecta amb la placa del microcontrolador fent servir una comunicació i2c que ens permet transferir la informació fent servir només dos fils (més els dos d'alimentació). Cada placa de microcontrolador només pot tenir connectat un sensor LSM303 però sí admet altres elements i2c coexistint amb ell. Per això, la placa del sensor té duplicades les connexions i2c de manera que sigui fàcil encadenar els dispositius.
LSM303


A la placa hi ha representades unes fletxes que ens indiquen quines són les direccions X i Y considerades. La direcció Z és perpendicular a la placa.

Per fer servir aquest sensor cal connectar el born 3V (inferior a la foto) al born 3,3 V de la placa del microcontrolador (ATENCIÓ: No al born VBATT), el born gnd (superior a la foto) al negatiu de l'alimentació i els borns SDA i SCL amb els del mateix nom de la placa del microcontrolador. A la placa del sensor aquests dos borns hi apareixen dos cops de manera que podem triar la disposició que ens sigui més còmoda.

Per fer servir el sensor ens caldrà la Adafruit_LSM303 library i també la Adafruit Unified Sensor Driver. Un cop ja tinguem les llibreries, podem fer els nostres programes. A la part inicial, hem de carregar les llibreries connesponents. A la part de declaració de variables, hem de crear dos objectes; un Adafruit_LSM303_Accel_Unified i un Adafruit_LSM303_Mag_Unified. Els números 54321 i 12453 poden ser qualsevols però han de ser diferents per a cada sensor. En aquest cas els objectes s'anomenen accel i mag.


En la inicialització del programa, cal inicialitzar les dues parts del sensor. D'aquesta manera el nostre microcontrolador hi estableix connexió i convé preveure que la connexió no sigui possible. En el programa cal definir dos objectes del tipus sensors_event_t, un per a cada part del sensor i cridem a la funció que llegeix els valors indicant-li que guardi els valors a l'event corresponent. El signe & indica que el que posem no és un paràmetre de la funció sinó la variable on ha de guardar els resultats.

Un cop feta la lectura, tenim els resultats a les següents variables (considerant que als events els hem donat el nom que surt al programa que hi ha més avall):

Acceleració (m/s2)
event1
Component Variable
Coordenada X event1.acceleration.x
Coordenada Y event1.acceleration.y
Coordenada Z event1.acceleration.z

Camp magnètic (μT)
event2
Component Variable
Coordenada X event2.magnetic.x
Coordenada Y event2.magnetic.y
Coordenada Z event2.magnetic.z

A continuació hi ha un programa de prova. En aquest cas, obrim també un canal sèrie que ens permeti veure si la connexió ha anat bé i les lectures del sensor al monitor sèrie. El nostre programa de prova llegirà els valors del sensor i els mostrarà. També calcularà l'angle de l'eix X del sensor respecte al nord i el posarem en graus (el valor de sortida de la funció són radians.



Per calcular l'angle hem de tenir present que la tangent de l'angle és igual a Y dividit per X. Però si fem la funció arctangent de Y dividit per X tindrem un problema ja que perdem informació. Per exemple, les tangents de 30° i 210° són totes dues 0,577 i, per tant, sabent la tangent no podem saber l'angle de forma segura ja que hi ha més d'una resposta. Per això fem servir la funció atan2 que rep els dos valors (X i Y) i els fa servir conjuntament per determinar l'angle correcte.

Per provar el programa és recomanable posar la placa del sensor horitzontal i amb la fletxa X apuntant aproximadament cap al nord. A la pantalla del monitor sèrie podrem veure les lectures del sensor que són el camp magnètic en microtesla (μT) multiplicat per 10 i l'acceleració en metres per segon al quadrat (m/s2) multiplicada per 100. També veure el valor de l'angle del nord.

Observeu el valor de l'angle i gireu la placa fins aconseguir un angle proper a zero. Si l'angle és negatiu heu de girar la placa en el sentit de les agulles del rellotge; si es positiu, en sentit contrari.

Hauríeu de tenir un valor d'acceleració a l'eix Z similar a 9,81 (l'acceleració de la gravetat és, aproximadament, de 9,81 m/s2) i valors molt més petits en els altres dos eixos.

Pel que fa al camp magnètic, a l'eix X hauríeu de veure un valor entre 25 i 65 (el camp magnètic terrestre sol estar entre 25 i 65 μT) i un valor molt petit a l'eix Y (si realment el sensor apunta l'eix X cap al nord).

En un sistema estàtic (que no es desplaça significativament), el sensor d'acceleració ens pot servir per saber la verticalitat. És el que fan servir les càmeres fotogràfiques i els telèfons per saber si estan en vertical o en horitzontal. En sistemes en moviment, ens pot servir per saber si el sistema s'accelera (augmenta de velocitat) o es frena i en quina direcció. Atès que la majoria de les persones no estem acostumades al concepte d'acceleració, caldrà fer proves a l'hora de fer servir el sensor en aquesta aplicació.

El camp magnètic que rep el sensor es pot veure molt influït per la proximitat de metalls o d'elements elèctrics (motors, cables, transformadors, etc.) o electrònics (carregadors, alimentadors, telèfons, etc.). Per això no sol ser recomanable intentar tenir en compte els valors del camp magnètic. Sí ens pot servir per saber cap on està el nord. Si existeix la possibilitat que la placa del sensor no estigui horitzontal, és convenient fer servir la indicació del sensor d'acceleració per saber com està la placa i després agafar els eixos corresponents per determinar cap a on està el nord.

En aquesta pàgina podeu trobar més informació sobre el sensor.