Examplecode for GPS functionality on the QW-GPS-DEVKIT.

Dependencies:   mbed

Fork of HelloWorld - QW Development kit by Quicksand micro-electronics

Firmware

This program starts the GPS on the TD1204 in continuous navigating mode using the following AT-command:

AT$GPS=1,16,0,65535,1,1

A timer sends the latests gps fix every 30 seconds or 10 minutes to the SIGFOX backend using the following command:

AT$GSND

LED3 burns if a 30 second interval is set. LED4 burns if a 10 minute interval is set. Switching between intervals can be done using button 1.

Button 2 instantly sends the latests fix to the SIGFOX cloud.

Settings in the SIGFOX backend

Create a new device-type and set display typte to Geolocation > Telecom Design.

/media/uploads/quicksand/gpsdecode.jpg

Assign your development kit to this device-type and the decoding will happen automatically:

/media/uploads/quicksand/gpsdecoded.jpg

Data if no GPS fix was found!

Note: The data looks like this if your device didn't get a valid fix before the transmission of a SIGFOX packet.

/media/uploads/quicksand/nofix.jpg

You can follow the NMEA messages of the GPS if you open up a terminal and connect to the virtual com-port of the QW shield. More info about NMEA messages can be found HERE.

/media/uploads/quicksand/nmea.jpg

GPS data is displayed in different message formats over a serial interface. There are standard and non-standard (proprietary) message formats. Nearly all GPS receivers output NMEA data. The NMEA standard is formatted in lines of data called sentences. Each sentence contains various bits of data organized in comma delimited format (i.e. data separated by commas). Here’s example NMEA sentences from a GPS receiver with satellite lock (4+ satellites, accurate position):

$GPRMC,235316.000,A,4003.9040,N,10512.5792,W,0.09,144.75,141112,,*19
$GPGGA,235317.000,4003.9039,N,10512.5793,W,1,08,1.6,1577.9,M,-20.7,M,,0000*5F
$GPGSA,A,3,22,18,21,06,03,09,24,15,,,,,2.5,1.6,1.9*3E

For example, the GPGGA sentence above contains the following:

  • Time: 235317.000 is 23:53 and 17.000 seconds in Greenwich mean time
  • Longitude: 4003.9040,N is latitude in degrees.decimal minutes, north
  • Latitude: 10512.5792,W is longitude in degrees.decimal minutes, west
  • Number of satellites seen: 08
  • Altitude: 1577 meters

Note, every 30 seconds an "OK" will appear after sending the SIGFOX message.

More information about the NMEA sentences coming from the TD1204 can be found in the following datasheet of the u-blox 7 series: Link.

You can even open up a track of your device:

/media/uploads/quicksand/track.jpg

/media/uploads/quicksand/trackmap.jpg

Committer:
quicksand
Date:
Fri Oct 30 14:10:26 2015 +0000
Revision:
0:49858c4c3500
Child:
1:18afd4c75c6e
First version of a simple code-example using the QW GPS Shield

Who changed what in which revision?

UserRevisionLine numberNew contents of line
quicksand 0:49858c4c3500 1 #include "mbed.h"
quicksand 0:49858c4c3500 2
quicksand 0:49858c4c3500 3 DigitalOut LED_0 (PB_6);
quicksand 0:49858c4c3500 4 DigitalOut LED_1 (PA_7);
quicksand 0:49858c4c3500 5 DigitalOut LED_2 (PA_6);
quicksand 0:49858c4c3500 6 DigitalOut LED_3 (PA_5);
quicksand 0:49858c4c3500 7 InterruptIn SW1(PB_10);
quicksand 0:49858c4c3500 8 InterruptIn SW2(PA_8);
quicksand 0:49858c4c3500 9
quicksand 0:49858c4c3500 10 Ticker hartbeat;
quicksand 0:49858c4c3500 11
quicksand 0:49858c4c3500 12 typedef struct{
quicksand 0:49858c4c3500 13 bool busy;
quicksand 0:49858c4c3500 14 char button;
quicksand 0:49858c4c3500 15 } TX_BUTTON;
quicksand 0:49858c4c3500 16
quicksand 0:49858c4c3500 17 TX_BUTTON Button_tx;
quicksand 0:49858c4c3500 18
quicksand 0:49858c4c3500 19 void beat() {
quicksand 0:49858c4c3500 20 LED_0 = !LED_0;
quicksand 0:49858c4c3500 21 }
quicksand 0:49858c4c3500 22
quicksand 0:49858c4c3500 23 //Virtual serial port over USB
quicksand 0:49858c4c3500 24 Serial pc(USBTX, USBRX);
quicksand 0:49858c4c3500 25 Serial modem(PA_9, PA_10);
quicksand 0:49858c4c3500 26
quicksand 0:49858c4c3500 27 void sw1interrupt(){
quicksand 0:49858c4c3500 28 pc.printf("Button 1 pressed, sending sigfox message (command is AT$SF=42 55 54 54 4f 4e 20 31 00 00 00 00,2,0)\n");
quicksand 0:49858c4c3500 29 modem.printf("AT$SF=42 55 54 54 4f 4e 20 31 00 00 00 00,2,0\n");
quicksand 0:49858c4c3500 30 LED_1 = 0;
quicksand 0:49858c4c3500 31 wait(0.25);
quicksand 0:49858c4c3500 32 // Flush the echo of the command:
quicksand 0:49858c4c3500 33 while(modem.readable()) modem.getc();
quicksand 0:49858c4c3500 34 Button_tx.busy = true;
quicksand 0:49858c4c3500 35 Button_tx.button = 1;
quicksand 0:49858c4c3500 36 }
quicksand 0:49858c4c3500 37
quicksand 0:49858c4c3500 38 void sw2interrupt(){
quicksand 0:49858c4c3500 39 pc.printf("Button 2 pressed, sending sigfox message (command is AT$SF=42 55 54 54 4f 4e 20 32 00 00 00 00,2,0)\n");
quicksand 0:49858c4c3500 40 modem.printf("AT$SF=42 55 54 54 4f 4e 20 32 00 00 00 00,2,0\n");
quicksand 0:49858c4c3500 41 LED_2 = 0;
quicksand 0:49858c4c3500 42 wait(0.25);
quicksand 0:49858c4c3500 43 // Flush the echo of the command:
quicksand 0:49858c4c3500 44 while(modem.readable()) modem.getc();
quicksand 0:49858c4c3500 45 Button_tx.busy = true;
quicksand 0:49858c4c3500 46 Button_tx.button = 2;
quicksand 0:49858c4c3500 47 }
quicksand 0:49858c4c3500 48
quicksand 0:49858c4c3500 49 int main() {
quicksand 0:49858c4c3500 50
quicksand 0:49858c4c3500 51 LED_0 = 1;
quicksand 0:49858c4c3500 52 LED_1 = 1;
quicksand 0:49858c4c3500 53 LED_2 = 1;
quicksand 0:49858c4c3500 54 LED_3 = 1;
quicksand 0:49858c4c3500 55 hartbeat.attach(&beat, 0.5);
quicksand 0:49858c4c3500 56 Button_tx.busy = false;
quicksand 0:49858c4c3500 57 Button_tx.button = 0;
quicksand 0:49858c4c3500 58 SW2.fall(&sw1interrupt);
quicksand 0:49858c4c3500 59 SW1.fall(&sw2interrupt);
quicksand 0:49858c4c3500 60 char responsebuffer[2];
quicksand 0:49858c4c3500 61 char c;
quicksand 0:49858c4c3500 62 while(1) {
quicksand 0:49858c4c3500 63 if(pc.readable()) {
quicksand 0:49858c4c3500 64 modem.putc(pc.getc());
quicksand 0:49858c4c3500 65 }
quicksand 0:49858c4c3500 66
quicksand 0:49858c4c3500 67 if(modem.readable()) {
quicksand 0:49858c4c3500 68 c = modem.getc();
quicksand 0:49858c4c3500 69 responsebuffer[0] = responsebuffer[1];
quicksand 0:49858c4c3500 70 responsebuffer[1] = c;
quicksand 0:49858c4c3500 71 if(Button_tx.busy)
quicksand 0:49858c4c3500 72 {
quicksand 0:49858c4c3500 73 if(responsebuffer[0] == 'O' && responsebuffer[1] == 'K' )
quicksand 0:49858c4c3500 74 {
quicksand 0:49858c4c3500 75 // Everything went fine, turn off the LED
quicksand 0:49858c4c3500 76 Button_tx.busy = false;
quicksand 0:49858c4c3500 77 if(Button_tx.button == 1) LED_1 = 1;
quicksand 0:49858c4c3500 78 if(Button_tx.button == 2) LED_2 = 1;
quicksand 0:49858c4c3500 79 }
quicksand 0:49858c4c3500 80 }
quicksand 0:49858c4c3500 81 pc.putc(c);
quicksand 0:49858c4c3500 82 }
quicksand 0:49858c4c3500 83 }
quicksand 0:49858c4c3500 84 }