رزبری پای - Raspberry PIمطالب علمی

راه اندازی ماژول GPS NEO-6M توسط Raspberry Pi 3

GPS در ابتدا یک سیستم ناوبری نظامی مختص ارتش آمریکا بود.وبرای اهداف طراحی سیستم های نظامی طراحی شد.اما به مرور زمان قسمتهای از این سامانه در اختیار عموم به صورت رایگان قرار گرفت.در نتجیه کاربردهای فرعی زیادی برای این سامانه در سیستم های جدید ایجاد شد.

GPSها دارای کاربردهای متنوعی در زمین ، دریا و هوا می‌باشند، اساساً GPS هر جایی قابل استفاده است مگر در نقاطی که امکان وصول امواج ماهواره در آنها نباشد، مانند داخل ساختمانها ، غارها و نقاط زیر زمینی دیگر و یا زیر دریا. کاربردهای هوایی GPS در رهیابی برای هوانوردی تجاری می‌باشد، در دریا نیز ماهیگیران ، قایقهای تجاری ، و دریا نوردان حرفه‌ای از GPS برای رهیابی استفاده می‌کنند.
استفاده‌های زمینی GPS بسیار گسترده‌تر می‌باشد. مراکز علمی از GPS برای استفاده از قابلیت و دقت زمان سنجی‌اش و اطلاعات مکانی‌اش استفاده می‌کنند. نقشه برداران از GPS برای توسعه منطقه کاری خود بــــهره می‌گیرند. سایتهای گران قیمت نقشه برداری دقتهایی تا یک متر را فراهم می‌آورند GPSها علاوه بر صرفه جویی دقتهای بهتری را برای این سایتها به ارمغان می‌آورند.

ماژولGPS :
به دلیل دشوار بودن کار با GPS ها و نیاز داشتن به دانش زیاد، استفاده از ماژول در طراحی سیستم های دیجیتال امری تقریبا اجتناب ناپذییر است. ماژول های زیادی با درجه دقت های متفاوت در بازار وجود دارند. در این آموزش از رزبری برای راه اندازی ماژول GPS NEO-6M استفاده شده است.

ماژول NEO-6M :
ماژول هایNEO یکی از حرفه ای ترین ماژول های GPSاست که ساخت شرکت U-blox آلمان است و از آنتن اکتیو نیز پشتیبانی می کند. پروتکل ارتباطی این نوع ماژول از نوع UART میباشد که توسط رزبری پای قابل راه اندازی است. بر روی این ماژول باطری قابل شارژ نیز درنظر گرفته شده است.
ماژول دارای حافظه داخلی eeprom به منظور ذخیره تنظیمات است و از WAAS, EGNOS, MSAS, GAGAN نیز پشتیبانی می کند. سرعت بالای دریافت اطلاعات و مکان یابی با دقت بسیار بالا و راه اندازی سریع باعث محبوبیت ماژول در کاربردهای صنعتی شده است. NMEA 0183 استانداردی که این ماژول برای ارتباط با MCU ویا همان رزبری استفاده میکند .

استاندارد NMEA 0183:
انجمن ملی تجهیزات الکترونیک دریایی ، استاندارد توسعه یافته ای برای مشخص کردن نحوه ارتباط بین وسایل الکترونیکی دریایی می باشد. این استاندارد به تجهیزات الکترونیکی دریایی اجازه میدهد که با کامپیوتر ها ارتباط برقرار کرده و اطلاعات خود را به آنها ارسال کنند. گیرنده های GPS هم با این استاندارد کار می کنند. اکثر برنامه های کامپیوتری و دستگاه هایی که اطلاعات مکانی را ارسال می کنند با این استاندارد کار میکنند. در این استاندارد ارتباط تقریبا یک طرفه است بطوریکه تنها ماژول همواره اطلاعاتی را به MCU و رزبری ارسال میکند و تنها در مواردی همچون ارسال تنظیمات Baud Rate به ماژول GPS ،MCU اقدام به ارسال این دست از تنظیمات میکند.
اطلاعات دریافتی از گیرنده های GPS شامل اطلاعات زیادی از قبیل موقعیت(طول وعرض جغرافیایی)، ارتفاع، سرعت، زمان و … میباشد. استاندارد NMEA وظیفه مرتب کردن رشته ارسالی را دارد. در این استاندارد انواع رشته هایی وجود دارند که حاوی انواع اطلاعات میباشند که مستقل از رشته های دیگر است. استاندارد NMEA همچنین به سازندگان تجهیزات مکان یابی اجازه میدهد رشته کدهای خاص کمپانی خود طراحی کنند. مثلا تمام دستگاه ها دارای دو حرف پیشوند در اول رشته ای هستند که نوع دستگاه را مشخص میکند مثلا برای GPS دوحرف GP در ابتدای جمله می آید. به دنبال این دو حرف سه حرف دیگر نیز میآید که نشان دهنده طول جمله می باشد. برای مشخص شدن اطلاعات سازنده نیز حرفP به دنبال سه حرف دیگر که معرف سازنده می باشد می آید مثلا برای شرکت سونیPSNY می باشد.
تمام رشته ها با علامت $ شروع می شوند و دیتای دریافتی به صورت کد های ASCII می باشد و پایان جمله نیز شامل یک علامت * و دو عدد checksum می باشد اطلاعات مختلف هر رشته با ”,“ از هم جدا مي شود و در پایان هر رشته کاراکتر ”CR“ و سپس ”LF“ مي آید که در استاندارد اسکي کدهاي هگز 0D و 0A را دارند. این دو کاراکتر خاص نمایانگر انتهاي رشته هستند.این ماژول برای ارسال اطلاعات دریافتی از سامانه ی GPS به رزبری از چند نوع رشته استفاده میکند.در اینجا تنها یکی از رشته ها که شامل اطلاعاتی همچون ساعت جهانی، طول و عرض جغرافیایی، تاریخ جهانی، سرعت و… اطلاعات بیشتر در جدول زیر آمده است.

rmc

اطلاعات ترانزیت توصیه شده ی GPRMC
این رشته اطلاعاتي نظیر زمان، طول و عرض جغرافیایي، کورس و سرعت را به ما مي دهد.
فرمت:

$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*<13><CR><LF>

مثال:

$GPRMC,104549.04,A,2447.2038,N,12100.4990,E,016.0,221.0,250304,003.3,W,A*22<CR><LF>

برای کسب اطلاعات بیشتر به PDF ضمیمه شده مراجعه کنید.

 

راه اندازی ماژول با رزبری:
برای راه اندازی این ماژول از دو روش استفاده میکنم. روش اول استفاده از برنامه ی آماده و مخصوص این ماژول برای رزبری طراحی شده است. در این روش تنها کاری که میکنید نصب چند پکیج نرم افزاری میباشد. در راه اندازی با روش دوم یک برنامه به زبان سی با کتابخانه ی wiringPi نوشته شده است، که چهار پارامتر طول ،عرض،ارتفاع جغرافیایی ،تاریخ و ساعت جهانی را از ماژول با توابعی دریافت میکند.

راه اندازی با نرم افزار:
در این روش شما نیاز به دانش زیادی در مورد این ماژول و استاندارد های آن ندارید و تنها با نصب یک پکیج نرم افزاری و تایپ کردن یک دستور در ترمینال میتوانید به تمام اطلاعات ارسالی از ماژول GPS را به رزبری در یک جدول همانند شکل زیر مشاهده کنید.

687474703a2f2f692e737461636b2e696d6775722e636f6d2f7338526d472e706e67

قدم اول :در صورتی که قصد دارید از GPIO های رزبری برای راه اندازی این ماژول استفاده کنید ،ابتدا نرم افزار پیکبرندی رزبریپای را rasp-confg را اجرا کنید و در قسمت interfaces پورت سریال را فعال کنید.
درصورتی که از مبدل USB به سریال استفاده میکنید نیازی به فعال سازی پورت سریال ندارید.
قدم دوم :ماژول را همانند شکل زیر به GPIO های رزبری متصل کنید.

20160815_1118502

 

هشدار:تغذیه مورد نیاز این ماژول 3.3 ولت میباشد.بنابراین از GPIO های برای تغذییه این ماژول استفاده کنید که ولتاژی به اندازه ی 3.3 ولت را تامین کنند.
توجه:ماژول زمانی اطلاعات درستی به رزبری شما ارسال میکند که به سامانه ی GPS متصل شود. برای اینکه متوجه متصل شدن ماژول به سامانه ی GPS شوید، یک LED بروی برد ماژول تعبییه شده که اگر در حالت چشمک زن باشد به معنی متصل شدن ماژول به GPS است.
قدم:سوم پکیج نرم افزاری gps را با دستور زیر در ترمینال رزبری نصب کنید.

sudo apt-get install gpsd gpsd-clients python-gps

قدم چهارم:اجرای gpsd :
سرویس gpsd را میتوانید با دستور زیر اجرا کنید.

sudo service gpsd start

تنظیم پورت سریال :

برای تنظیم پورت سریال و انتخاب یکی از دو روش راه اندازی ماژول GPS با GPIO ویا مبدل USB به سریال میتوانید یکی از دو دستور زیر استفاده کنید.Baud Rate پیش فرض ماژول 9600 میباشد.

راه اندازی با GPIO های رزبری :

sudo gpsd -F /var/run/gpsd.sock /dev/ttyAMA0

راه اندازی با مبدل USB به سریال :

sudo gpsd -F /var/run/gpsd.sock /dev/ttyUSB0

برای اجرای برنامه میتوانید از دستور زیراستفاده کنید.

cgps -s

پس از اجرای دستور بالا صفحه ی به شکل بالا ظاهر میشود که شامل اطلاعات دریافتی از ماژول GPS است.
توجه:اگر اولین باری است که این ماژول را به منبع تغذیه وصل میکنید، باید برای مدت 15-20 دقیقه به ماژول فرصت دهید تا به سامانه ی GPS به صورت کامل وصل شود.

راه اندازِی با روش دوم:
در این روش یک برنامه به زبان سی در رزبری پای نوشته شده است. برای کار با پورت سریال از کتابخانه ی wiringPi استفاده شده است. در این برنامه تنها از رشته ی GPRMC که توسط ماژول به رزبری ارسال میشود استفاده شده است. این رشته حاوی اطلاعاتی مهمی همچون : ساعت و تاریخ جهانی، طول و عرض جغرافیایی وسرعت میباشد که دربرنامه ی نوشته شده این اطلاعات استخراج و نمایش داده میشود. سورس این برنامه را میتوانید از فایل ضمیمه دریافت کنید.

توضیحات برنامه:
ارتباط ماژول با رزبری تقریبا یک ارتباط یک طرفه است مگر در مواقعی که بخواهید تنظیماتی روی ماژول توسط رزبری انجام دهید. پارامترهای پیش فرض پورت سریال ماژول عبارت انداز:باند ریت 9600 ،بدون بیت توازن،یک بیت استاپ و هشت بیت اطلاعات میباشد. در ادامه به بررسی توابع برنامه ی راه اندازی ماژول دررزبری میپردازیم.
عملکرد برنامه به گونه ای است که اطلاعاتی همچون: طول و عرض جغرافیایی، سرعت حرکت روی زمین و ساعت جهانی راتوسط توابعی نمایش میدهد.در این برنامه کاربر با هربار فشردن کلید Enter اطلاعات ذکر شده به کاربر نمایش داده میشود.

تابع GPS_RMC :
ماژول در هر یک ثانیه (تقرییبا) پنج نوع رشته ارسال میکند که هرکدام حاوی اطلاعاتی میباشد یکی از مهمترین رشته ای که از ماژول به رزبری ارسال میشود رشته ی GPRMC میباشد .که توسط تابع
GPS_RMC() رشته ی GPRMC از سایر رشته ها حذف میشود.
در این برنامه از دو حقله ی while برای حذف رشته های اضافی استفاده شده است. از آنجایی که بعد از کاراکتر ‘,’ در رشته ی GPRMC اطلاعات GPS قرار دارد. برای استخراج این اطلاعات از حلقه یfor استفاده شده است.تا به اینجا ابتدای اطلاعات مربوط به رشته ی GPRMC استخراج شد. حالا میماند انتهای رشته که با یک شرط داخل حقله ی for این کار انجام میشود.عملکرد این شرط اینگونه است که تا زمانی که به کاراکتر ‘*’ نرسدهمچنان اطلاعات دریافتی از پورت سریال را در متغییری(آرایه ای) به نام GPRMC.input ذخیره میکند. در کنار این شرط یک شرط دیگر نیز وجو دارد که برای ذخیره ی محل کاراکتر ‘,’ در متغییری به نام GPRMC.Local ذخیره میشود. این متغییر بعدا در توابع بعدی که مختص جدا کردن اطلاعت طول و عرض جغرافیی و.. میباشد استفاده میشود.

...
...........
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*<13><CR><LF>

-اطلاعات آبی رنگ در متغییر GPRMC.input ذخیره میشوند.
-اطلاعات سیاه رنگ و قرمز رنگ حذف میشوند.

void GPS_RMC(int fd){
int i,p;
serialFlush(fd);
while(!(serialGetchar(fd)==’C’));
while(!(serialGetchar(fd)==’,’));
for(i=0;i<60;i++){
GPRMC.input[i]=serialGetchar(fd);
if(GPRMC.input[i]==’,’){
GPRMC.Local[p]=i; 
p++;}
if(GPRMC.input[i]==’*’)
{
GPRMC.input[i]=0;
break;
}}}

توابع دیگری نیز وجود دارد که همگی برای جداکردن اطلاعات استفاده میشودند.این توابع دارای الگوریتم ساده ای هستند ونیازی به توضیح ندارند.سورس این برنامه را میتوانید از فایل ضمیمه دریافت کنید.

#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <string.h>
#include <stdint.h>
#include <stdint.h>
struct inputs{
	char input[60];
	char Local[15];
	char UTC[10];
	char Latitude[23];
	char Longitude[23];
	char Speed[10];
}GPRMC;
void Show_GPS_UTC(void){
		char i;
		printf("\nUTC=");
	for(i=0;i<GPRMC.Local[0];i++)
		GPRMC.UTC[i]=GPRMC.input[i];
		putchar(GPRMC.UTC[0]);
		putchar(GPRMC.UTC[1]);
		putchar(':');
		putchar(GPRMC.UTC[2]);
		putchar(GPRMC.UTC[3]);
		putchar(':');
		putchar(GPRMC.UTC[4]);
		putchar(GPRMC.UTC[5]);
		putchar('\n');
}
void Show_GPS_Latitude(void){
	char i;
	printf("\nLatitude=");
	GPRMC.Local[1]++;
	for(i=GPRMC.Local[1];i<GPRMC.Local[3];i++)
		GPRMC.Latitude[i-GPRMC.Local[1]]=GPRMC.input[i];
		printf(GPRMC.Latitude);
		putchar('\n');
}
void Show_GPS_Longitude(void){
	char i;
	GPRMC.Local[3]++;
	printf("\nLongitude=");
	for(i=GPRMC.Local[3];i<GPRMC.Local[5];i++)
		GPRMC.Longitude[i-GPRMC.Local[3]]=GPRMC.input[i];
		printf(GPRMC.Longitude);
		putchar('\n');
}
void Show_GPS_Speed(void){
	char i;
	GPRMC.Local[5]++;
	printf("\nSpeed Over Ground (Kph)=");
	for(i=GPRMC.Local[5];i<GPRMC.Local[6];i++)
		GPRMC.Speed[i-GPRMC.Local[5]]=GPRMC.input[i];
		putchar('\n');
}
void GPS_RMC(int fd){
	int i,p;
	serialFlush(fd);
	while(!(serialGetchar(fd)=='C'));
	while(!(serialGetchar(fd)==','));
	for(i=0;i<60;i++){
		GPRMC.input[i]=serialGetchar(fd);
		if(GPRMC.input[i]==','){
			GPRMC.Local[p]=i;	
			p++;}
		if(GPRMC.input[i]=='*')
		{
			GPRMC.input[i]=0;
			break;
		}}
}
int main(int argc, char **argv)
{
	int fd;
	wiringPiSetupGpio();
		if((fd=serialOpen("/dev/ttyUSB0",9600))<0){
			printf("Open Serial Erorr");
			return 0;}
			while(1){
				 printf("Plese press Enter for display inf");
				 getchar();
				 GPS_RMC(fd);
				 Show_GPS_UTC();
				 Show_GPS_Latitude();
				 Show_GPS_Longitude();
				 Show_GPS_Speed();
			}
	return 0;
}

 

نویسنده: میثم سعیدی msimeysamsaeedi @ gmail.com

نوشته های مشابه

1 دیدگاه

  1. یه ماژول GPS مدل NEO 6M دارم که میخوام از هایپرترمینال اطلاعات را به صورت صحیح نمایش بدم.
    از دیتاشیت ماژول هم نتونستم مساله را حل کنم.
    از بزرگواری شما خواهشمندم یاری فرمایید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا