NEO-6M GPS Module (GY-NEO6MV2) with an Arduino Uno

The GY-NEO6MV2 board carries u-blox's NEO-6M GPS receiver, a regulator and a patch antenna, and streams NMEA position sentences at 9600 baud.

NEO-6M GPS Module (GY-NEO6MV2), The GY-NEO6MV2 board carries u-blox's NEO-6M GPS receiver, a regulator and a patch antenna, and streams NMEA position sentences at 9600 baud.
In short

The Arduino Uno's only hardware UART, on D0 and D1, is taken by its USB link, so the NEO-6M talks to the Uno through SoftwareSerial on D4 (receive) and D3 (transmit). The module's RX is rated to 3.6 V, so the Uno's 5 V transmit line reaches it through a 1 kΩ / 2 kΩ divider.

Wiring the NEO-6M GPS Module (GY-NEO6MV2) to the Arduino Uno

Pin by pin.

NEO-6M GPS Module (GY-NEO6MV2)Arduino UnoNote
VCC5V
GNDGND
TXD4
RXD3through a 1 kΩ resistor, with a 2 kΩ resistor from RX to GND (a divider)

What to know on the Arduino Uno

  • The chip's input pins are rated to 3.6 V absolute maximum. The 1 kΩ / 2 kΩ divider brings the Uno's 5 V TX on D3 down to about 3.3 V; the module's 3.3 V TX into D4 needs nothing, since the Uno reads 0.6 × VCC (3.0 V) as a high.u-blox NEO-6 datasheet GPS.G6-HW-09005-E, p. 14; Microchip ATmega328P datasheet DS40002061B, DC characteristics
  • SoftwareSerial holds 64 received bytes, while the default NMEA output at 9600 baud runs to about 500 bytes a second. Any delay() longer than a few tens of milliseconds overflows the buffer and TinyGPS++ loses sentences, so loop() feeds gps.encode() continuously.u-blox NEO-6 datasheet GPS.G6-HW-09005-E, p. 22; Arduino SoftwareSerial library reference
  • On the Uno, double is the same 4-byte float as float, good to 6 or 7 significant digits. lat() and lng() therefore lose the last decimals of a longitude above 100°; for full precision use gps.location.rawLat() and rawLng(), which keep integer degrees and billionths.Arduino language reference, double and float
  • The module peaks at 67 mA, more than the 50 mA the Uno's 3.3V pin is rated for, which is why VCC goes to the 5V pin and the board's own regulator.u-blox NEO-6 datasheet GPS.G6-HW-09005-E, p. 15; Arduino UNO R3 tech specs

NEO-6M GPS Module (GY-NEO6MV2) code for the Arduino Uno

Compiled for arduino:avr:uno on 2026-10-29.

Libraries: mikalhart/TinyGPSPlus
// NEO-6M GPS Module (GY-NEO6MV2) on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/gps-neo6m/arduino-uno
#include <SoftwareSerial.h>
#include <TinyGPS++.h>

SoftwareSerial gpsSerial(4, 3);  // RX, TX: the module's TX, RX (through the divider)
TinyGPSPlus gps;
unsigned long lastWait = 0;

void setup() {
  Serial.begin(115200);
  gpsSerial.begin(9600);         // the NEO-6M's speed out of the box
  Serial.println("GPS starting (a cold start takes about 30 s)");
}

void loop() {
  while (gpsSerial.available()) gps.encode(gpsSerial.read());

  if (gps.location.isUpdated()) {
    Serial.print("lat ");  Serial.print(gps.location.lat(), 6);
    Serial.print(" lon "); Serial.print(gps.location.lng(), 6);
    Serial.print(" sats "); Serial.print(gps.satellites.value());
    Serial.print(" alt "); Serial.print(gps.altitude.meters());
    Serial.print(" km/h "); Serial.println(gps.speed.kmph());
  }
  if (!gps.location.isValid() && millis() - lastWait > 2000) {
    lastWait = millis();
    Serial.print("waiting for fix, satellites in view: ");
    Serial.println(gps.satellites.value());
  }
}

NEO-6M GPS Module (GY-NEO6MV2) on the Arduino Uno: questions

Why use SoftwareSerial for the NEO-6M on an Arduino Uno?

The Uno has one hardware UART, on D0 and D1, shared with USB. Putting the GPS there blocks uploads and mixes its NMEA with your Serial Monitor output, so it goes on D4 and D3 through SoftwareSerial.

Do I need a voltage divider between the Uno and the NEO-6M?

Yes, on the line from the Uno's TX (D3) into the module's RX: the chip's inputs are rated to 3.6 V (u-blox datasheet, p. 14). Use 1 kΩ from D3 to RX and 2 kΩ from RX to GND. The module's TX into D4 needs no divider.

Why are my NEO-6M coordinates rounded on the Uno?

On AVR boards double is a 4-byte float with 6 to 7 significant digits. Print gps.location.rawLat() and rawLng() or keep the NMEA text if you need every decimal.

For AI assistants

This guide as plain Markdown. /components/gps-neo6m/arduino-uno.md

What will you build with it?