Go Down

Topic: uBlox Neo 6M with Arduino (Read 13411 times) previous topic - next topic

ElProblemo

Has anyone some experience of linking the uBlox 6M GPS to the arduino?

At first I would like it to print the the NMEA string $GPGGA to the terminal window..

ANY help, code ect would be greatly appreciated.

Many Thanks
Complete Newbie...
But remember nobody knows everything!!!

PaulS

A link to the GPS in question would be nice.

How have you tried connecting it? What code are you using? What results did you have?

ElProblemo

#2
Nov 24, 2012, 03:31 pm Last Edit: Nov 24, 2012, 03:43 pm by ElProblemo Reason: 1
Sorry, GPS is found http://www.u-blox.com/images/downloads/Product_Docs/NEO-6_DataSheet_%28GPS.G6-HW-09005%29.pdf

Things have moved on a little now, I've got it reading now, using this code.  I've had to use the old 023 version of Arduino to upload though, issue with BYTE.

Any help to get it to upload using the latest Arduino would be appreciated.


Code: [Select]
// A simple sketch to read GPS data and parse the $GPRMC string
// see http://www.ladyada.net/make/gpsshield for more info

#include <NewSoftSerial.h>

NewSoftSerial mySerial =  NewSoftSerial(5, 3);
#define powerpin 4

#define GPSRATE 9600
//#define GPSRATE 38400


// GPS parser for 406a
#define BUFFSIZ 90 // plenty big
char buffer[BUFFSIZ];
char *parseptr;
char buffidx;
uint8_t hour, minute, second, year, month, date;
uint32_t latitude, longitude;
uint8_t groundspeed, trackangle;
char latdir, longdir;
char status;

void setup()
{
 if (powerpin) {
   pinMode(powerpin, OUTPUT);
 }
 pinMode(13, OUTPUT);
 Serial.begin(GPSRATE);
 mySerial.begin(GPSRATE);
 
 // prints title with ending line break
 Serial.println("GPS parser");

  digitalWrite(powerpin, LOW);         // pull low to turn on!
}


void loop()
{
 uint32_t tmp;
 
 Serial.print("\n\rread: ");
 readline();
 
 // check if $GPRMC (global positioning fixed data)
 if (strncmp(buffer, "$GPRMC",6) == 0) {
   
   // hhmmss time data
   parseptr = buffer+7;
   tmp = parsedecimal(parseptr);
   hour = tmp / 10000;
   minute = (tmp / 100) % 100;
   second = tmp % 100;
   
   parseptr = strchr(parseptr, ',') + 1;
   status = parseptr[0];
   parseptr += 2;
   
   // grab latitude & long data
   // latitude
   latitude = parsedecimal(parseptr);
   if (latitude != 0) {
     latitude *= 10000;
     parseptr = strchr(parseptr, '.')+1;
     latitude += parsedecimal(parseptr);
   }
   parseptr = strchr(parseptr, ',') + 1;
   // read latitude N/S data
   if (parseptr[0] != ',') {
     latdir = parseptr[0];
   }
   
   //Serial.println(latdir);
   
   // longitude
   parseptr = strchr(parseptr, ',')+1;
   longitude = parsedecimal(parseptr);
   if (longitude != 0) {
     longitude *= 10000;
     parseptr = strchr(parseptr, '.')+1;
     longitude += parsedecimal(parseptr);
   }
   parseptr = strchr(parseptr, ',')+1;
   // read longitude E/W data
   if (parseptr[0] != ',') {
     longdir = parseptr[0];
   }
   

   // groundspeed
   parseptr = strchr(parseptr, ',')+1;
   groundspeed = parsedecimal(parseptr);

   // track angle
   parseptr = strchr(parseptr, ',')+1;
   trackangle = parsedecimal(parseptr);


   // date
   parseptr = strchr(parseptr, ',')+1;
   tmp = parsedecimal(parseptr);
   date = tmp / 10000;
   month = (tmp / 100) % 100;
   year = tmp % 100;
   
   Serial.print("\nTime: ");
   Serial.print(hour, DEC); Serial.print(':');
   Serial.print(minute, DEC); Serial.print(':');
   Serial.println(second, DEC);
   Serial.print("Date: ");
   Serial.print(month, DEC); Serial.print('/');
   Serial.print(date, DEC); Serial.print('/');
   Serial.println(year, DEC);
   
   Serial.print("Lat: ");
   if (latdir == 'N')
      Serial.print('+');
   else if (latdir == 'S')
      Serial.print('-');

   Serial.print(latitude/1000000, DEC); Serial.print('\°', BYTE); Serial.print(' ');
   Serial.print((latitude/10000)%100, DEC); Serial.print('\''); Serial.print(' ');
   Serial.print((latitude%10000)*6/1000, DEC); Serial.print('.');
   Serial.print(((latitude%10000)*6/10)%100, DEC); Serial.println('"');
 
   Serial.print("Long: ");
   if (longdir == 'E')
      Serial.print('+');
   else if (longdir == 'W')
      Serial.print('-');
   Serial.print(longitude/1000000, DEC); Serial.print('\°', BYTE); Serial.print(' ');
   Serial.print((longitude/10000)%100, DEC); Serial.print('\''); Serial.print(' ');
   Serial.print((longitude%10000)*6/1000, DEC); Serial.print('.');
   Serial.print(((longitude%10000)*6/10)%100, DEC); Serial.println('"');
 
 }
 //Serial.println(buffer);
}

uint32_t parsedecimal(char *str) {
 uint32_t d = 0;
 
 while (str[0] != 0) {
  if ((str[0] > '9') || (str[0] < '0'))
    return d;
  d *= 10;
  d += str[0] - '0';
  str++;
 }
 return d;
}

void readline(void) {
 char c;
 
 buffidx = 0; // start at begninning
 while (1) {
     c=mySerial.read();
     if (c == -1)
       continue;
     Serial.print(c);
     if (c == '\n')
       continue;
     if ((buffidx == BUFFSIZ-1) || (c == '\r')) {
       buffer[buffidx] = 0;
       return;
     }
     buffer[buffidx++]= c;
 }
}


It outputs in this format:



read:
$GPVTG,,T,,M,0.412,N,0.763,K,A*26

read:
$GPGGA,1****1.00,****.90332,19,039,42,17,34,307,10*7E

read:
$GPGSV,9,12,157,31,20,65,236,22,23,18,177,14,28,18,261,20*7C

read:
,3,11,31,04,093,,32,78,081,29,37,28,151,33*42

read:
$GPGLL,****.90315.84932,W,1*****1.00,A,A*79

read:
**$GPRMC,1****2.00,A,5****5.90332,N,000.84927,W,0.000,,241112,,,A*66
Time: 14:29:42
Date: 11/24/12
Lat: +*** **' 1.99"
Long: -***' 29.56"


Only real issue is not being able to upload with 1.0 and is there something very simple I can run to output the data from the GPS (attached to pin4) to the terminal?
Complete Newbie...
But remember nobody knows everything!!!

PaulS

Quote
Any help to get it to upload using the latest Arduino would be appreciated.

The exact messages that you get when you try to compile using 1.0 would be useful. The compiler, as I recall, practically holds your hand though, doing everything but typing the changes for you.

ElProblemo

#4
Nov 24, 2012, 04:40 pm Last Edit: Nov 24, 2012, 04:43 pm by ElProblemo Reason: 1

The exact messages that you get when you try to compile using 1.0 would be useful. The compiler, as I recall, practically holds your hand though, doing everything but typing the changes for you.




In file included from sketch_nov24a.ino:4:
D:\arduino-1.0.2-windows\arduino-1.0.2\libraries\NewSoftSerial/NewSoftSerial.h:55: error: conflicting return type specified for 'virtual void NewSoftSerial::write(uint8_t)'
D:\arduino-1.0.2-windows\arduino-1.0.2\hardware\arduino\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'
sketch_nov24a.ino: In function 'void loop()':
sketch_nov24a:123: error: 'BYTE' was not declared in this scope

As of Arduino 1.0, the 'BYTE' keyword is no longer supported.
Please use Serial.write() instead.

Highlighted in the cose is:
Code: [Select]
    Serial.print(latitude/1000000, DEC); Serial.print('\°', BYTE); Serial.print(' ');
Complete Newbie...
But remember nobody knows everything!!!

PaulS

User downloaded libraries DO NOT go in the core libraries folder. Delete your install of Arduino 1.0.2, and start over.

Then, NewSoftSerial is NOT to be used with 1.0+. Use SoftwareSerial, instead.

Go Up