مقدمه
- سیسستم موقعیتیاب جهانی (GPS) از سیگنالهای ارسالی از ماهوارههای فضایی و ایستگاههای زمینی استفاده کرده و موقعیت شما را در زمین مشخص میکند.
- GPS سیگنالهای فرکانس رادیویی ارسالی از ماهوارهها و ایستگاههای زمینی را دریافت میکند. GPS از این سیگنالها استفاده کرده تا مکان دقیق را مشخص کند.
- خود GPS هیچ اطلاعاتی منتقل نمیکند.
- سیگنالهای دریافتی از ماهوارهها و ایستگاههای زمینی دارای یک برچسب زمانی (Time Stamp) از لحظهی انتقال سیگنال میباشند. با محاسبهی اختلاف زمان ارسال سیگنال با زمان دریافت سیگنال، و با استفاده از سرعت سیگنال، میتوان مسافت بین ماهواره و GPS دریافت کننده را با یک فرمول ساده سرعت و زمان مشخص کرد.
- با استفاده از ۳ ماهواره یا بیشتر، مکان دقیق GPS را میتوان محاسبه کرد.
- برای اطلاعات بیشتر راجع به GPS و نحوهی استفاده از ان، به مطلب ماژول گیرنده GPS در بخش ماژولها و سنسورها رجوع کنید.
- ماژول گیرنده GPS از UART برای ارتباط بین کنترلر یا ترمینال کامپیوتر استفاده میکند.
- پیش از استفاده از UART روی رزبریپای، باید آن را پیکربندی و فعال کنید. برای اطلاعات بیشتر دربارهی UART در رزبریپای و نحوهی استفاده از آن، به مطلب ارتباط UART رزبریپای با استفاده از پایتون و C در بخش رزبریپای رجوع کنید.

دیاگرام اتصالات

مثال
برای استخراج اطلاعات GPS، میخواهیم ارتباط بین رزبریپای را با ماژول GPS برقرار کنیم. با استفاده از پایتون و زبان WiringPi) C) میتوان میان رزبریپای و ماژول GPS ارتباط برقرار کرد. برای برقراری این ارتباط، ماژول GPS را همانند شکل فوق به رزبریپای متصل کنید.
استفاده از پایتون
میخواهیم با استفاده از پایتون اطلاعات طول، عرض و زمان را، از رشته NMEA GPGGA که ماژول GPS آن را دریافت میکند استخراج کنیم و سپس این اطلاعات را روی کنسول (ترمینال) چاپ کنیم. با استفاده از عرض و طول، مکان فعلی را روی نقشه گوگل تعیین میکنیم.
برنامه پایتون
'''
GPS Interfacing with Raspberry Pi using Pyhton
http://www.electronicwings.com
'''
import serial #import serial pacakge
from time import sleep
import webbrowser #import package for opening link in browser
import sys #import system package
def GPS_Info():
global NMEA_buff
global lat_in_degrees
global long_in_degrees
nmea_time = []
nmea_latitude = []
nmea_longitude = []
nmea_time = NMEA_buff[0] #extract time from GPGGA string
nmea_latitude = NMEA_buff[1] #extract latitude from GPGGA string
nmea_longitude = NMEA_buff[3] #extract longitude from GPGGA string
print("NMEA Time: ", nmea_time,'\n')
print ("NMEA Latitude:", nmea_latitude,"NMEA Longitude:", nmea_longitude,'\n')
lat = float(nmea_latitude) #convert string into float for calculation
longi = float(nmea_longitude) #convertr string into float for calculation
lat_in_degrees = convert_to_degrees(lat) #get latitude in degree decimal format
long_in_degrees = convert_to_degrees(longi) #get longitude in degree decimal format
#convert raw NMEA string into degree decimal format
def convert_to_degrees(raw_value):
decimal_value = raw_value/100.00
degrees = int(decimal_value)
mm_mmmm = (decimal_value - int(decimal_value))/0.6
position = degrees + mm_mmmm
position = "%.4f" %(position)
return position
gpgga_info = "$GPGGA,"
ser = serial.Serial ("/dev/ttyS0") #Open port with baud rate
GPGGA_buffer = 0
NMEA_buff = 0
lat_in_degrees = 0
long_in_degrees = 0
try:
while True:
received_data = (str)(ser.readline()) #read NMEA string received
GPGGA_data_available = received_data.find(gpgga_info) #check for NMEA GPGGA string
if (GPGGA_data_available>0):
GPGGA_buffer = received_data.split("$GPGGA,",1)[1] #store data coming after "$GPGGA," string
NMEA_buff = (GPGGA_buffer.split(',')) #store comma separated data in buffer
GPS_Info() #get time, latitude, longitude
print("lat in degrees:", lat_in_degrees," long in degree: ", long_in_degrees, '\n')
map_link = 'http://maps.google.com/?q=' + lat_in_degrees + ',' + long_in_degrees #create link to plot location on Google map
print("<<<<<<<<press ctrl+c to plot location on google maps>>>>>>\n") #press ctrl+c to plot on map and exit
print("------------------------------------------------------------\n")
except KeyboardInterrupt:
webbrowser.open(map_link) #open current position information in google map
sys.exit(0)
خروجی پایتون
- خروجی در Python IDE

- خروجی روی گوگل مپ

- برای ترسیم مکان روی گوگل مپ، باید URL link را برای گوگل مپ فراخوانی کنیم. میتوان لینک زیر را همراه با طول و عرض استخراج شده برای بازکردن نقشه گوگل استفاده کرد.
http://maps.google.com/?q=<latitude>,<longitude>
استفاده از زبان C
- میتوان رشتهی NMEA GPGGA را استخراج کرده و روی پنجرهی خروجی چاپ کرد. در اینجا، از کتابخانهی WiringPi زبان C برای خواندن ماژول GPS استفاده میکنیم.
- این کتابخانه دیگه پشتیبانی و توسعه پیدا نمیکنه.
زبان C
/*
GPS Interfacing with Raspberry Pi using C (WiringPi Library)
http://www.electronicwings.com
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
int main ()
{
int serial_port;
char dat,buff[100],GGA_code[3];
unsigned char IsitGGAstring=0;
unsigned char GGA_index=0;
unsigned char is_GGA_received_completely = 0;
if ((serial_port = serialOpen ("/dev/ttyS0", 9600)) < 0) /* open serial port */
{
fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
return 1 ;
}
if (wiringPiSetup () == -1) /* initializes wiringPi setup */
{
fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
return 1 ;
}
while(1){
if(serialDataAvail (serial_port) ) /* check for any data available on serial port */
{
dat = serialGetchar(serial_port); /* receive character serially */
if(dat == '
خروجی

نکته: هنگام برقراری ارتباط بین ماژول GPS و رزبریپای، از پورت سریال dev/ttyS0/ برای ارتباط UART استفاده میکنیم. اگر میخواهید ماژول را به رزبریپای ۲ یا مدلهای پیشین وصل کنید، باید از پورت dev/ttyAMA0/ استفاده کنید.
منبع: ترجمه از سایت electronicwings.com
){
IsitGGAstring = 0;
GGA_index = 0;
}
else if(IsitGGAstring ==1){
buff[GGA_index++] = dat;
if(dat=='\r')
is_GGA_received_completely = 1;
}
else if(GGA_code[0]=='G' && GGA_code[1]=='G' && GGA_code[2]=='A'){
IsitGGAstring = 1;
GGA_code[0]= 0;
GGA_code[0]= 0;
GGA_code[0]= 0;
}
else{
GGA_code[0] = GGA_code[1];
GGA_code[1] = GGA_code[2];
GGA_code[2] = dat;
}
}
if(is_GGA_received_completely==1){
printf("GGA: %s",buff);
is_GGA_received_completely = 0;
}
}
return 0;
}
خروجی

نکته: هنگام برقراری ارتباط بین ماژول GPS و رزبریپای، از پورت سریال dev/ttyS0/ برای ارتباط UART استفاده میکنیم. اگر میخواهید ماژول را به رزبریپای ۲ یا مدلهای پیشین وصل کنید، باید از پورت dev/ttyAMA0/ استفاده کنید.
- منبع: ترجمه از سایت electronicwings.com
پیشنهاد میکنم در ادامه آموزش ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو را هم مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
آموزش طراحی و ساخت پروژه های الکترونیک و برنامه نویسی میکروکنترلر ها آموزش الکترونیک,آموزش رزبری پای,آموزش راه اندازی ماژول و سنسور,آموزش آردوینو,نرم افزار های الکترونیک, طراحیPCB,برنامه نویسی میکروکنترلرها ARM AVR PIC FPGA