In this tutorial we are going to see GPS Interfacing with PIC16F877A.
Suggest to Read
Before we will start i would suggest you to read these topics. Then only you can understand this strongly. If you already know, please go ahead.
- PIC16F877A Development Board
- GPS Module
- LCD Module (To print the Latitude and Longitude)
The Global Positioning System (GPS) is a satellite-based navigation system that consists of 24 orbiting satellites, each of which makes two circuits around the Earth every 24 hours. These satellites transmit three bits of information – the satellite’s number, its position in space, and the time the information is sent. These signals are picked up by the GPS receiver, which uses this information to calculate the distance between it and the GPS satellites.
With signals from three or more satellites, a GPS receiver can triangulate its location on the ground (i.e., longitude and latitude) from the known position of the satellites. With four or more satellites, a GPS receiver can determine a 3D position (i.e., latitude, longitude, and elevation). In addition, a GPS receiver can provide data on your speed and direction of travel. Anyone with a GPS receiver can access the system. Because GPS provides real-time, three-dimensional positioning, navigation, and timing 24 hours a day, 7 days a week, all over the world, it is used in numerous applications, including GIS data collection, surveying, and mapping.
GPS Data Format
GPS units spit out data in a dizzying array of formats. It can become a challenge to take the output from a GPS unit.
When you connect a GPS board up, and look at the data coming off of it, you are likely to see something like this:
This is what the data looks like when your GPS does not have a fix. When it does have a fix, there will be all types of numbers between the commas in the lines above. So, how do we make sense of all this? The first thing is to learn some of the lingo. Each line above is referred to as a NMEA sentence. There are different NMEA sentence type, and the type is indicated by the first characters before the comma. So, $GPGSA is a certain type of NMEA sentence, and $GPRMC is a different type of NMEA sentence. To make this whole thing a manageable problem, the first thing we must realize is that the data that we want will be in the $GPRMC sentence. If your GPS unit has options to turn the other sentences off, then turn them off to simplify the data getting thrown at you. If you can not turn the other sentences off, then just ignore them, and focus on the you care about, $GPRMC.
If your GPS has a fix, then your GPS sentences should look something like this:
Lets start by breaking down the $GPRMC sentence.
- The $GPRMC is simply telling what sentence type is on the line.
- The next number, represents the Coordinated Universal Time (UTC). It works like this, 092204.999 would be 09:22 and 04.999 seconds in UTC. Since converting from UTC to your local time is simply a matter of knowing what time zone you are in, you can see that one thing you get from a GPS is a very accurate clock.
- The next letter just lets you know if your signal is Active (A) or Void (V). An ‘A’ indicates you are getting a signal and things are working properly. A ‘V’ means you do not have a signal.
- Now, for the good stuff, the next number and following letter gives you your lattitude. 4250.5589,S should be interpreted as, Your Latitude is: 42 degrees, 50.5589 minutes, in the Southern Hemisphere.
- Similarly, the next number, 14718.5084,E, is Longitude. This is interpreted as, Your Longitude is: 147 degrees 18.5084 minutes, in the Eastern Hemisphere.
Note: Degrees could be a one, two or three digit number. Hence you have to be careful parsing this data. What is always the case is that the first two numerals to the left of the decimal place, and the numbers to the right of the decimal represent the minutes. So, always take the number starting two to the left of the decimal, and those following all the way to the comma, and that is your minutes. Unfortunately, if you simply try to put 4250.5589,S,14718.5084,E, into Google Earth, it will not recognize it. The simplest thing you can do to get Google Earth to recognize and properly display the coordinate would be to enter the following:
42 50.5589S, 147 18.5084E
Notice the space inserted between degrees and minutes, and no comma before hemisphere designation. This would properly display that single point via the Google Earth search bar.
This data is enough to get Latitude and Longitude.
GPS used in many fields.
- Public Safety & Disaster Relief
- Roads & Highways
- Surveying & Mapping
Now we will interface the GPS Module to PIC16F877A.
GPS Interfacing with PIC16F877A
- RS – RC0
- RW – RC1
- EN – RC2
- Data Lines – RD0 – RD7
- VCC – Power Supply 3.3 – 6 V
- GND – Ground
- TX – RC7 (RX)
This program will display the latitude and longitude in LCD. In this code, while loop doesn’t do anything. Everything will be done by Serial ISR function. That prints are based on Indian latitude and longitude. If you didn’t get proper digits in LCD, please separate that arrays based on your country’s latitude and longitude. I’ve mentioned those arrays above.
__CONFIG( FOSC_HS & WDTE_OFF & PWRTE_OFF & CP_OFF & BOREN_ON & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_OFF);
#define lcd_dat PORTD
#define rs RC0
#define rw RC1
#define en RC2
#define delay for(i=0;i<1000;i++)
/*GPS Variables And Functions*/
char namegps, name1gps = "GPRMC,",gpsdat;
char msggps , checkgps;
unsigned char f;
void interrupt ser();
/*LCD Variables and Functions*/
void cmd(unsigned char a);
void dat(unsigned char b);
void show(unsigned char *s);
void tx(unsigned char dat);
unsigned char rx();
void tx_string(unsigned char *s);
void interrupt ser()
void cmd(unsigned char a)
void dat(unsigned char b)
void show(unsigned char *s)
void tx(unsigned char dat)
unsigned char rx()
void tx_string(unsigned char *s)
You can try this code with hardware. If you have any doubt please ask us.