Global Positon System with Amber2

The global position system (GPS) it’s a system able to provide geographic position expressed in spatial coordinates and based on radio signal received from artificial satellites orbiting the Earth. We really think this is one of the most interesting and useful technology introduced in the last Years: officially up and running since 1994. Initially developed and in use just for U.S.A. military environment, it has been extended to civil purposes very soon (sjust some years later). What we mostly know, born thanks to that technology, is for sure ‘the car navigator’: maybe younger people don’t even think possible to have a car without it. So, how GPS works and how it could be possible to use it to have exact geographic position expressed in coordinates and useful for our personal app?


Without going into too much detail, let’s say that the operating principle is based on a spherical positioning method. The GPS receiver ‘receives’ signals emitted by the different satellites and, based on the temporal information and their time difference of reception (due to the different sources’ distance), the GPS device can determine its geographical position with a series of triangulations and mathematical calculations.

GPS devices

The market for electronic components and accessories provides a very rich choice of chips and devices able to read GPS signals and position detect.
These devices provide a serial port trasmitting and receiving on it all the related infos in the form of strings of characters. The format of these strings is now a standard realised by the National Marine Electronics Association and it is commonly called NMEA.
The protocol is based on the principle that the source, called talker, can only send data (sentences) and the receiver, called listener, can only receive them. In other words, the GPS device transmits strings that have their own format and which can be read by the unit of our system that has to decode them and extract the included informations.

Amber Board GPS

Amber board, already mentioned in some previous articles of this blog, has an ‘extender’ board equipped with a GPS receiver.

GPS device present on this extender is a Telit SL869 (link). As most of these devices, the Telit SL869 provides a serial port trasmitting a series of strings whose format follows the NMEA-0183 standard.
Briefily, just let’s take some part of the various available strings, (GPRMC) :

$GPRMC,<Timestamp>,<Status>,<Lat>,<N/S>,<Long>,<E/W>,<Speed>,<Course>,<Date>,<MagVar>,<MagVarDir>,<Mode>*<checksum><cr><lf>

Using an appropriate algorithm we can easily evaluate if data are valid (when the GPS has not yet resolved the position FIX is not yet ready and so read data cannot be used as valid ones). When in FIX conditions, we can read the Latitude and the Longitude calculated by the receiver (the position) and many other information that combined with other strings generated by the device, allow users to realize a complete and functional system able to know with almost absolute ssurance user’s global geographic position.

How to read and decode NMEA string

On Amber board, GPS output serial is connected to a CPU i.MX UART.

Amber board extract electrical scheme

In order to intercept the requested data it is necessary to open a serial port using the reading parameters compatible to the GPS device (9600 Baud, Eight data bits, No parity bits, One stop bit), and proceed receiving and decoding data transmitted by the device..

QT App for GPS reading.

Let’s go on realising Qt application detailing what showed into the video by reading and decoding what trasmitted by the GPS device.
Serial data are managed by the Qt QSerial Port module. This is a Qt module, thanks to it, it is possible to manage the system serial port in a simple and independent way. In other words, agnostic from the host machine operating system, serial powers management will always be performed in the same way thanks to the API made available in Qt.

 

After creating a new Qt project, we instantiate a QSerialPort object passing it, as parameter, the path of the serial device that refers to the GPS device.

In this case the serial default parameters is exactly the same than the ones coming from GPS module and so there is no need to set the baudrate or other typical serial port settings.
After creating the object, we connect the readyRead () signal to the readDataSlot () slot.
In this way every time there is some data to read (the GPS sends us something) the readDataSlot () function will be invoked and inside it we will be able to read the received data.
Connecting it, we can open the device with the classic open ().
Inside the readDataSlot () we read the received data and when the string was read completely (we received the \ n character) we process the received data.

Inside the processNmeaString () function it’s possible to identify the received string extracting the payload.
With a series of “if else” we check received strings and for each case we’ll decode it after splitting it at the ‘,’ separator.

 

Now it is easy to show received info or using it with our application.
Here is the graphic result of our work:
 

Graphical interface about how received GPS data will be showed

 

NMEA GPS string

 

What is it possible to improve?

Since we are working with a GPS, it would be interesting creating an application able to show our position on a Map.
We will proceed realising a simple Qt application that fulfills this desire by exploiting the potentialities of the QML.
As you probably know, in Qt you can create applications written in C / C ++ using the Widget technology or you can create applications in QML, a sort of meta language used to create fluid and appealing graphic applications in a simple and immediate way.
In our case we will create a QML application that integrates parts of C / C ++ code for the serial port management. Let’s see how we can implement a QML application that shows a geographical map on the screen. Let’s create a new project by choosing the Qt Quick Application application as a template

 

Go on with the wizard proceeding to the other window (reported below) and wait for QtCreator to open the editor on the screen.

Open .PRO file and add:
QT += location
QT += serialport

 

Open the main.qml file and invert the highlighted text with the red arrows shown in the following image:

Click on RUN and magically on the display of your board will appear a map located on London (default position) that you can scroll by clicking on the screen in a similar way to what you can do on your browser.

Now we want to intercept the position from the GPS device and place the map in the detected geographical point.
In order to do this, we have to read the NMEA strings produced by the GPS serial.
Serial port management will be done via a C/C ++ class and then integrated into the QML.
We create a box in a subdirectory whose methods to be invoked by the QML code will be marked as Q_INVOCABLE.

For more info about how to add c/c++ in QML go to this page.

Include into the main.c the new class C/c++ created and registered to the qml.

In the main.qml file, we import the new object. Let’s create an instance and set the parameters and the opening in the initial phase.

 

Now we just have to read the strings, pars them and locate the map on the point got from the GPS. For simplicity we read it polling the serial port using a Timer in the parseLine function and finally decoding the string NMEA.

Once strings have properly been decoded, we can set the center of the map on the coordinate sent by the GPS.

 

Final result is the on-screen display related to the portion of the map where we are.
Theretically (not yet tested), taking the board with us from one place to another we should see the on-screen map position moving related to our real geographical position..

 

Have fun.

 


 

Il sistema di posizionamento globale GPS (Global Position System) è un sistema di rilevamento della posizione geografica basato sulla ricezione di segnali radio emessi da una costellazione di satelliti artificiali in orbita attorno alla Terra. Sicuramente a mio avviso è una delle  “invenzioni” più interessanti del secolo scorso (diventò pienamente operativo nel 1994) e non stupisce il fatto che fu Inizialmente sviluppato per scopi militari e solo successivamente aperto anche a scopi civili. L’applicazione più conosciuta è sicuramente il navigatore per auto al quale ci affidiamo durante i nostri spostamenti, ma al giorno d’oggi esistono tantissimi altri dispositivi in grado di rilevare e trattare come dato la propria posizione.
Ma come funziona il GPS e come è possibile integrare nei propri progetti un dispositivo  in grado di rilevare e notificare la posizione?


Senza scendere troppo nel dettaglio, diciamo che Il principio di funzionamento si basa su un metodo di posizionamento sferico. Il ricevitore GPS riceve i segnali emessi dai diversi satelliti ed
in base alle informazioni temporali contenute e alla loro differenza temporale di ricezione ( dovuta alla diversa distanza delle sorgenti ), il dispositivo GPS riesce a determinare la sua posizione geografica con una serie di triangolazioni e calcoli matematici.

Dispositivi GPS.

Il mercato dei componenti e degli accessori elettronici mette a disposizione una ricchissima scelta di chip e dispositivi in grado di captare i segnali GPS e rilevare la posizione.
In generale questi dispositivi espongono una porta seriale dalla quale trasmettono e ricevono informazioni sotto forma di stringhe di caratteri. Il formato di tali stringhe è stato standardizzato dall’ente National Marine Electronics Association ed il formato è comunemente chiamato NMEA.
Il protocollo si basa sul principio che la fonte, detta talker, può soltanto inviare i dati (sentences) e la ricevente, detta listener, può soltanto riceverli. In altre parole il dispositivo GPS trasmette delle stringhe che hanno un loro formato e che deve possono essere lette dall’unità del nostro sistema che le deve interpretare ed estrarre le informazioni richieste.

IL GPS della scheda AMBER.

La scheda Amber di cui abbiamo già parlato in alcuni precedenti articoli di questo blog, dispone di una scheda extended provvista di un ricevitore GPS.


Su questa scheda è installato un ricevitore della Telit modello SL869 il cui manuale di User Guide può essere scaricato da questo link.

Dalla guida possiamo vedere che dispone di una porta UART dalla quale trasmette una serie di stringhe il cui formato segue lo standard NMEA-0183.
Senza scendere nel dettaglio, tra le varie stringhe disponibili, analizziamo ad esempio la GPRMC il cui formato è il seguente:

$GPRMC,<Timestamp>,<Status>,<Lat>,<N/S>,<Long>,<E/W>,<Speed>,<Course>,<Date>,<MagVar>,<MagVarDir>,<Mode>*<checksum><cr><lf>

Interpretando i dati contenuti in questa stringa possiamo valutare se i dati sono validi ( quando il GPS non ha ancora risolto la posizione, non ha fatto FIX i dati non sono validi) , leggere la Latitudine e la Longitudine calcolata dal ricevitore ( la posizione ) e molte altre informazioni che integrate con le altre stringhe generate dal dispositivo permettono di realizzare un completo e funzionale sistema in grado di sapere con quasi assoluta certezza in quale parte del globo terreste è posizionato.

Come leggere le stringhe NMEA del GPS

Nella Amber il dispositivo GPS è collegato ad una delle porte seriali della CPU imx di cui la scheda è provvista.

Porzione di schema elettrico della scheda extended GPS per Amber

Per intercettare i dati richiesti è necessario quindi aprire una porta seriale con i parametri di lettura compatibile con quelli del dispositivo GPS ( 9600 Baud, Eight data bits, No parity bits, One stop bit), ricevere ed interpretare i dati trasmessi dal dispositivo.

Applicazione Qt per per leggete i dati del GPS.

Andremo ora a realizzare un’applicazione Qt grazie alla quale leggere a mostrare a video le informazioni trasmesse dal dispositivo GPS.
La lettura dei dati seriali verrà gestita dal modulo Qt QSerial Port. Si tratta di un modulo di Qt grazie al quale è possibile gestire le porte seriali del sistema in modo semplice ed indipendente dalla piattaforma che state utilizzando. In altre parole, qualunque sia il sistema operativo nel quale il vostro applicativo dovrà girare, la gestione delle pote seriali verrà eseguita sempre nello stesso modo grazie alle API messe a disposizione da Qt.

 

Dopo aver creato un nuovo progetto Qt, instanziamo un oggetto QSerialPort passandogli come parametro il path del device seriale che fa riferimento al dispositivo GPS.

In questo caso i parametri di default seriali coincidono con quelli del modulo GPS per cui non c’è da impostare il baudrate o le altri tipici settaggi delle porte seriali.

Dopo aver creato l’oggetto colleghiamo il segnale readyRead() allo slot readDataSlot().
Questa riga fa si che ogni volta che ci sono dei dati da leggere ( il GPS ci manda qualcosa )  la funzione readDataSlot() verrà invocata e al suo interno potremo leggere i dati ricevuti.
Fatta la connect, possiamo aprire il dispositivo con la classica open().

All’interno della readDataSlot() leggiamo i dati ricevuti e quando la stringa è stata letta completamente ( abbiamo ricevuto il carattere \n) processiamo i dati ricevuti.

All’interno della funzione processNmeaString() possiamo andare ad identificare la stringa ricevuta ed estrarre i dati in essa contenuti.

Con una serie di “if else” e controlli andiamo a determinare il tipo di stringa ricevuto e per ogni caso andiamo a decodificarla dopo averla splittata in corrispondenza del separatore ‘,’.

 

 

Giunti a questo punto è facile mostrare a video le informazioni ricevute o utilizzarle all’interno della nostra applicazione. Ecco qui di seguito il risultato grafico del nostro lavoro:

Gui nella quale vengono visualizzate le informazioni ricevute dal GPS

 

Log delle stringhe NMEA ricevute dal GPS

 

Possiamo fare qualcosa di meglio?

Visto che stiamo lavorando con un GPS sarebbe interessante poter realizzare un’applicazione in grado di mostrare la nostra posizione su di una Mappa.
Andremo a realizzare una semplice applicazione Qt che esaudisce questo desiderio sfruttando le potenzialità del QML.
Come molti di voi sapranno in Qt è possibile realizzare applicazioni scritte in C/C++ sfruttando la tecnologia Widget oppure si possono realizzare applicazioni in QML, una sorta di meta linguaggio grazie al quale potremo realizzare applicazioni grafiche fluide e accattivanti in modo semplice ed immediato.
Nel nostro caso realizzeremo un’applicazione QML che integra parti di codice C/C++ per la gestione della porta seriale.Vediamo come possiamo realizzare un’applicazione QML che mostra una mappa geografica a video.

Create un nuovo progetto scegliendo come modello l’applicazione Qt Quick Application

 

Mandate avanti il wizard dando conferma alle altre finestre seguenti e attendete che QtCreator apra l’editor sullo schermo.

Aprite il file .PRO ed inserite le due righe
QT += location
QT += serialport

 

Aprite il file main.qml ed inveire il testo evidenziato con le frecce rosse riportate nell’immagine seguente:

Cliccate su RUN e magicamente sul display della vostra board comparirà una mappa localizzata su Londra ( posizione di default )  che potrete scorrere cliccando sullo schermo in modo analogo a quanto potete fare sul vostro navigatore.

Quello che vogliamo fare ora catturare la posizione dal dispositivo GPS e posizionare la mappa nel punto geografico rilevato.
Per fare questo dobbiamo leggere le stringhe NMEA prodotte dalla seriale del GPS.
La gestione della porta seriale verrà fata tramite una classe C/C++ e poi integrata nel QML.
Creiamo una casse in una sotto directory i cui metodi che dovranno essere richiamati dal codice QML verranno marcati come Q_INVOCABLE.

Per maggiori info su come integrare codice c/c++ in QML leggete questa pagina.

Includete nel file main.c la nuova classe C/c++ create e registratela al qml.

Nel file main.qml, importiamo il nuovo oggetto, creiamone un’istanza e settiamone i parametri e l’apertura in fase iniziale.

 

Ora non ci resta che leggere le stringhe, parsarle e localizzare la mappa sul punto ottenuto dal GPS.Per semplicità facciamo una lettura in polling della seriale tramite un Timer nella funzione parseLine andiamo a decodificare la stringa NMEA.

 

Fatto il processing sule stringhe e le dovute conversioni, possiamo andare ad impostare il centro della mappa sulla coordinata inviata dal GPS.

 

Il risultato di tutto questo è la visualizzazione a schermo della porzione di mappa in cui ci troviamo.

In teoria ( test che non ho effettuato ) portando con noi la board da un luogo all’altro dovremmo vedere la mappa a schermo posizionarsi di volta in volta nel luogo in cui ci troviamo.

 

Buon divertimento.

 

 

 

 

 

 


 

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

This site uses Akismet to reduce spam. Learn how your comment data is processed.