Here is the GPS module. This NEO-6M GPS module communicate with Arduino with a serial. You can learn more about serial communication in my previous post.
In order to plug the module to the Arduino, it requires a bit of soldering.
So you have 4 wire to plug. Each one is labelled on the GPS with:
VCC: Positive 5 volts
RX: Serial reception
TX: Serial output
GND: Ground
Because I’m using the Arduino Mega, I have several Serial ports already available. I decide to wire the GPS module to the Serial1. I use a code found on Ladyada that I modified to work with my configuration.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
// A simple sketch to read GPS data and parse the $GPRMC string // see http://www.ladyada.net/make/gpsshield for more info #define powerpin 4 #define GPSRATE 9600 //#define GPSRATE 38400 #define BYTE 1 // 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); Serial1.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 = Serial1.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; } } |
Here is an example of the output:
As most of the GPS modules communicate the same way, you should be able to use this guide for any other GPS and arduino.
Leave a Reply