Arduino - GPS

In this tutorial, we are going to learn how to get GPS coordinates (longitude, latitude, altitude), GPS speed (km/h), and date time from NEO-6M GPS module. We also learn how to calculate the distance from current GPS position to a predefined GPS coordinates (ex. coordinates of London)

Hardware Required

1×Arduino UNO or Genuino UNO
1×USB 2.0 cable type A/B
1×NEO-6M GPS module
1×Jumper Wires
1×(Optional) 9V Power Adapter for Arduino
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

Or you can buy the following sensor kit:

1×DIYables Sensor Kit 30 types, 69 units
Please note: These are Amazon affiliate links. If you buy the components through these links, We will get a commission at no extra cost to you. We appreciate it.

About NEO-6M GPS module

Pinout

The NEO-6M GPS module includes 4 pins:

  • VCC pin: needs to be connected to VCC (5V)
  • GND pin: needs to be connected to GND (0V)
  • TX pin: is used for serial communication, needs to be connect to Serial (or SoftwareSerial) RX pin on Arduino.
  • RX pin: is used for serial communication, needs to be connect to Serial (or SoftwareSerial) TX pin on Arduino.
NEO-6M GPS module Pinout

Wiring Diagram

Arduino GPS module Wiring Diagram

This image is created using Fritzing. Click to enlarge image

Arduino Code

Reading GPS coordinates, speed (km/h), and date time

/* * Created by ArduinoGetStarted.com * * This example code is in the public domain * * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-gps */ #include <TinyGPS++.h> #include <SoftwareSerial.h> #define RX_PIN 4 // Arduino Pin connected to the TX of the GPS module #define TX_PIN 3 // Arduino Pin connected to the RX of the GPS module TinyGPSPlus gps; // the TinyGPS++ object SoftwareSerial gpsSerial(RX_PIN, TX_PIN); // the serial interface to the GPS module void setup() { Serial.begin(9600); gpsSerial.begin(9600); // Default baud of NEO-6M GPS module is 9600 Serial.println(F("Arduino - GPS module")); } void loop() { if (gpsSerial.available() > 0) { if (gps.encode(gpsSerial.read())) { if (gps.location.isValid()) { Serial.print(F("- latitude: ")); Serial.println(gps.location.lat()); Serial.print(F("- longitude: ")); Serial.println(gps.location.lng()); Serial.print(F("- altitude: ")); if (gps.altitude.isValid()) Serial.println(gps.altitude.meters()); else Serial.println(F("INVALID")); } else { Serial.println(F("- location: INVALID")); } Serial.print(F("- speed: ")); if (gps.speed.isValid()) { Serial.print(gps.speed.kmph()); Serial.println(F(" km/h")); } else { Serial.println(F("INVALID")); } Serial.print(F("- GPS date&time: ")); if (gps.date.isValid() && gps.time.isValid()) { Serial.print(gps.date.year()); Serial.print(F("-")); Serial.print(gps.date.month()); Serial.print(F("-")); Serial.print(gps.date.day()); Serial.print(F(" ")); Serial.print(gps.time.hour()); Serial.print(F(":")); Serial.print(gps.time.minute()); Serial.print(F(":")); Serial.println(gps.time.second()); } else { Serial.println(F("INVALID")); } Serial.println(); } } if (millis() > 5000 && gps.charsProcessed() < 10) Serial.println(F("No GPS data received: check wiring")); }

Quick Steps

  • Open Arduino IDE
  • Navigate to the Libraries icon on the left bar of the Arduino IDE.
  • Search “TinyGPSPlus”, then find the TinyGPSPlus library by Mikal Hart
  • Click Install button to install TinyGPSPlus library.
Arduino TinyGPS++ library
  • Copy the above code and open with Arduino IDE
  • Click Upload button on Arduino IDE to upload code to Arduino
  • See the result on Serial Monitor:
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Calculating the distance from current location to a predefined location

The below code calculates the distance between the current location and London (lat:51.508131 , long: -0.128002)

/* * Created by ArduinoGetStarted.com * * This example code is in the public domain * * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-gps */ #include <TinyGPS++.h> #include <SoftwareSerial.h> #define RX_PIN 4 // Arduino Pin connected to the TX of the GPS module #define TX_PIN 3 // Arduino Pin connected to the RX of the GPS module TinyGPSPlus gps; // the TinyGPS++ object SoftwareSerial gpsSerial(RX_PIN, TX_PIN); // the serial interface to the GPS module const double LONDON_LAT = 51.508131; const double LONDON_LON = -0.128002; void setup() { Serial.begin(9600); gpsSerial.begin(9600); // Default baud of NEO-6M GPS module is 9600 Serial.println(F("Arduino - GPS module")); } void loop() { if (gpsSerial.available() > 0) { if (gps.encode(gpsSerial.read())) { if (gps.location.isValid()) { double latitude = gps.location.lat(); double longitude = gps.location.lng(); unsigned long distanceKm = TinyGPSPlus::distanceBetween(latitude, longitude, LONDON_LAT, LONDON_LON) / 1000; Serial.print(F("- latitude: ")); Serial.println(latitude); Serial.print(F("- longitude: ")); Serial.println(longitude); Serial.print(F("- distance to London: ")); Serial.println(distanceKm); } else { Serial.println(F("- location: INVALID")); } Serial.println(); } } if (millis() > 5000 && gps.charsProcessed() < 10) Serial.println(F("No GPS data received: check wiring")); }

Quick Steps

  • Copy the above code and open with Arduino IDE
  • Click Upload button on Arduino IDE to upload code to Arduino
  • See the result on Serial Monitor:
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

We are considering to make the video tutorials. If you think the video tutorials are essential, please subscribe to our YouTube channel to give us motivation for making the videos.

WARNING

Note that this tutorial is incomplete. We will post on our Facebook Page when the tutorial is complete. Like it to get updated.

The Best Arduino Starter Kit

See Also

※ OUR MESSAGES