Codey Online › Arduino & ESP32 component library › GPS NEO-6M
GPS NEO-6M
Sensors

GPS NEO-6M

The NEO-6M is a GPS receiver module used to determine position, speed, and time from satellite signals. It typically communicates with a microcontroller over UART serial using TX and RX, with VCC and GND for power, and a PPS pin for precise timing output.

Width: 42.3 mm

Pinout — GPS NEO-6M

Pin Signal Description
TX TX UART transmit output from the GPS module — connect to the host MCU RX.
GND ground Ground reference for power and UART signals.
VCC power Power input for the GPS module, typically 3.3–5V depending on board regulator.
RX RX UART receive input to the GPS module — connect to the host MCU TX.
PPS digital Pulse-per-second timing output from GPS lock for precise synchronization.

Example wiring diagram — GPS NEO-6M

From To Wire
board:5V x1:VCC red
board:GND x1:GND black
board:D4 x1:TX green
board:D3 x1:RX blue

Example Arduino code — GPS NEO-6M

This example was written and compile-checked for the arduino-uno. Codey Online adapts it to any other supported board for you.

#include <SoftwareSerial.h>

// GPS NEO-6M canonical example for Arduino Uno
// Wiring:
// GPS VCC -> 5V
// GPS GND -> GND
// GPS TX  -> D4 (Arduino receives on this pin)
// GPS RX  -> D3 (Arduino transmits on this pin)

SoftwareSerial gpsSerial(4, 3); // RX, TX

char lineBuffer[120];
uint8_t lineIndex = 0;

void setup() {
  Serial.begin(9600);
  gpsSerial.begin(9600);

  Serial.println(F("GPS NEO-6M example started."));
  Serial.println(F("Waiting for NMEA sentences..."));
}

void printField(const char *label, const char *value) {
  Serial.print(label);
  Serial.print(value);
}

void handleRMC(char *sentence) {
  // Example: $GPRMC,hhmmss.sss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,ddmmyy,,,A*hh
  char *fields[12] = {0};
  uint8_t count = 0;
  char *token = strtok(sentence, ",");
  while (token && count < 12) {
    fields[count++] = token;
    token = strtok(NULL, ",");
  }

  if (count < 10) return;
  if (fields[2] == NULL || fields[2][0] != 'A') {
    Serial.println(F("No GPS fix yet."));
    return;
  }

  Serial.println(F("--- Valid Fix (RMC) ---"));
  if (fields[1]) printField("Time (UTC): ", fields[1]), Serial.println();
  if (fields[3] && fields[4]) {
    Serial.print(F("Latitude: "));
    Serial.print(fields[3]);
    Serial.println(fields[4]);
  }
  if (fields[5] && fields[6]) {
    Serial.print(F("Longitude: "));
    Serial.print(fields[5]);
    Serial.println(fields[6]);
  }
  if (fields[7]) {
    Serial.print(F("Speed (knots): "));
    Serial.println(fields[7]);
  }
  if (fields[8]) {
    Serial.print(F("Course (deg): "));
    Serial.println(fields[8]);
  }
  if (fields[9]) {
    Serial.print(F("Date (ddmmyy): "));
    Serial.println(fields[9]);
  }
}

void handleGGA(char *sentence) {
  // Example: $GPGGA,time,lat,N,lon,E,fixquality,numsat,hdop,alt,M,...
  char *fields[15] = {0};
  uint8_t count = 0;
  char *token = strtok(sentence, ",");
  while (token && count < 15) {
    fields[count++] = token;
    token = strtok(NULL, ",");
  }

  if (count < 8) return;
  int fixQuality = fields[6] ? atoi(fields[6]) : 0;
  int satellites = fields[7] ? atoi(fields[7]) : 0;

  Serial.println(F("--- GGA Status ---"));
  Serial.print(F("Fix quality: "));
  Serial.println(fixQuality);
  Serial.print(F("Satellites: "));
  Serial.println(satellites);
  if (fields[8]) {
    Serial.print(F("HDOP: "));
    Serial.println(fields[8]);
  }
  if (fields[9] && fields[10]) {
    Serial.print(F("Altitude: "));
    Serial.print(fields[9]);
    Serial.print(' ');
    Serial.println(fields[10]);
  }
}

void loop() {
  while (gpsSerial.available()) {
    char c = (char)gpsSerial.read();

    if (c == '\n') {
      lineBuffer[lineIndex] = '\0';
      lineIndex = 0;

      // Trim trailing carriage return if present
      char *sentence = lineBuffer;
      size_t len = strlen(sentence);
      if (len > 0 && sentence[len - 1] == '\r') {
        sentence[len - 1] = '\0';
      }

      if (strncmp(sentence, "$GPRMC", 6) == 0 || strncmp(sentence, "$GNRMC", 6) == 0) {
        char temp[120];
        strncpy(temp, sentence, sizeof(temp));
        temp[sizeof(temp) - 1] = '\0';
        handleRMC(temp);
      } else if (strncmp(sentence, "$GPGGA", 6) == 0 || strncmp(sentence, "$GNGGA", 6) == 0) {
        char temp[120];
        strncpy(temp, sentence, sizeof(temp));
        temp[sizeof(temp) - 1] = '\0';
        handleGGA(temp);
      }
    } else {
      if (lineIndex < sizeof(lineBuffer) - 1) {
        lineBuffer[lineIndex++] = c;
      } else {
        lineIndex = 0; // overflow protection
      }
    }
  }
}

Related components

18650 Battery Shield with USB-C Charger and 5V Boost Converter

18650 Battery Shield with USB-C Charger and 5V Boost Converter

2.4 inch OLED Display I2C 3.3V

2.4 inch OLED Display I2C 3.3V

3.5 inch TFT LCD Shield

3.5 inch TFT LCD Shield

50kg Load Cell Weight Sensor

50kg Load Cell Weight Sensor

Build your Arduino or ESP32 project with AI

Describe what you want to build. Codey Online writes the code, draws the wiring diagram, compiles it and flashes your board straight from the browser.

Start for free