در سلسله آموزش های ماژول GPS neo6m، قسمت سوم به واکشی داده های دریافتی از ماژول می پردازیم. در دو قسمت قبل به معرفی امکانات و راه اندازی اولیه آن پرداختیم. با مطالب پیشتر بیان شده، آموختیم که ماژول GPS داده های جغرافیایی را در فرمتی استاندارد تحت عنوان NMEA در پورت سریال UART قرار می دهد. داده های NMEA دارای پکت های مختلفی هستند که هرکدام با یک پیشوند، شروع می شوند. هر کدام از این پکت ها اطلاعات خاصی را به کاربر ارائه می دهند. البته بعضی از داده ها در پکت ها با هم یکسان هستند. در این آموزش به یکی از مهم ترین پکت های GPS، پکت GPRMC می پردازیم. این پکت اطلاعات اصلی جغرافیایی را در خود جای داده است. بنابراین، در ادامه با مرجع تخصصی ماژول GPS زبان فارسی، دیجی اسپارک همراه باشید.
GPRMC و فیلدهای اطلاعاتی
پکت GPRMC یکی از پکت های اساسی و کلیدی ماژول های GPS به شمار می رود. عبارت GPRMC مخفف Global Positioning Recommended Coordinates بوده و به کمک این پکت داده های اصلی جغرافیایی نظیر موقعیت، سرعت، زمان و تاریخ در اختیار کاربر قرار می گیرد. این پکت، همانطور که در دو آموزش پیشین مشاهده کردیم، فرمتی به صورت زیر دارد.
$GPRMC, 153117, A, 5007.030, N, 01135.02, E,15.6, 084.4, 230394, ,,,A*57
داده های فوق دارای فیلدهای مختلف اطلاعاتی است. این فیلدها مطابق جدول زیر تعریف می شوند.
توضیح | مقدار فیلد |
پیشوند شروع پکت که مشخص می کند داده ها از چه نوعی هستند. | $GPRMC |
زمان فعلی، این زمان به صورت ۱۵:۱۷:۳۱ است. | ۱۵۱۷۳۱ |
این فیلد تعیین کننده اعتبار داده هاست. در صورتیکه مقدار این فیلد A باشد، داده ها معتبر خواهند بود. در صورتیکه این مقدار V باشند، داده ها از اعتبار برخوردار نخواهند بود. | A |
این عدد عرض جغرافیایی را نمایش می دهد. توجه داشته باشید که عرض جغرافیایی بر مبنای درجه و دقیقه محاسبه می شود. این فرمت به صورت زیر است. ddmm.mmدر عبارت فوق d به معنای دقیقه، m به معنای دقیقه است. |
۵۰۰۷٫۰۳ |
این عبارت جهت در عرض جغرافیایی را نمایش می دهد. عبارت N شمال و عبارت S جنوب را نمایش می دهد. | N |
این عدد طول جغرافیایی را نمایش می دهد. توجه داشته باشید که عرض جغرافیایی بر مبنای درجه و دقیقه محاسبه می شود. این فرمت به صورت زیر است. ddmm.mmدر عبارت فوق d به معنای دقیقه، m به معنای دقیقه است. |
۰۱۱۳۵٫۰۲ |
این عبارت جهت در طول جغرافیایی را نمایش می دهد. عبارت E شرق و عبارت W غرب را نمایش می دهد. | E |
این مقدار سرعت متحرک را نمایش می دهد. این سرعت بر حسب واحد knot بوده که برای رسیدن به کیلومتر بر ساعت، می بایست عدد را در ۱٫۸ ضرب کنید. | ۱۵٫۹ |
این عدد جهت متحرک نسبت به کره زمین را نمایش می دهد. | ۰۸۴٫۴ |
این متغیر تاریخ را به فرمت زیر نمایش می دهد.
ddmmyy در عبارت رو به رو ۲۳ روز، ۰۳ ماه و ۹۴ سال(۱۹۹۴) را نمایش می دهد. |
۲۳۰۳۹۴ |
این فیلد مربوط به checksum جهت کنترل خطا است. | A*57 |
مطابق جدول فوق داده های مختلف پکت GPRMC را بررسی کردیم. حال در قسمت بعدی، به کمک یک برنامه ساده داده ها را از هم جدا می نماییم. برنامه قسمت بعدی به زبان آردوینو بوده، اما شما می توانید با تبدیل آن، در پلتفرم های مختلف نظیر ARM و AVR، از آن استفاده نمایید. اما پیش از آن، به نحوه فیلتر کردن داده ها می پردازیم.
فیلتر کردن پکت های NMEA
همانطور که پیشتر مشاهده نمودید، ماژول GPS پکت ها را به صورت دائم در سریال قرار می دهد. زمانیکه بخواهید با میکروکنترلرها داده ها را بخوانید، از آنجاییکه ماژول GPS تمام پکت ها را با هم فرستاده و این مورد می تواند سبب پر شدن بافر سریال شود، بنابراین باید داده هایی که به آن ها احتیاج نیست فیلتر شوند. دستورات زیر سبب فیلتر شدن بافر از سایر داده ها شده و تنها داده های مربوط به GPRMC ارسال می شوند.
$PUBX,40,GLL,0,0,0,0*5C\r\n $PUBX,40,GSA,0,0,0,0*4E\r\n $PUBX,40,GSV,0,0,0,0*59\r\n $PUBX,40,VTG,0,0,0,0*5E\r\n $PUBX,40,GGA,0,0,0,0*5A\r\n
با ارسال دستورات فوق به ماژول GPS، داده ها فیلتر شده و تنها داده های مربوط به GPRMC در بافر قرار می گیرند. بدین ترتیب روال برنامه نویسی ساده تر شده و بافر سریال سبک خواهد شد. در قسمت بعدی به یک نمونه کد جهت دریافت GPRMC و جداسازی داده های مربوط به طول و عرض جغرافیایی، می پردازیم.
نمونه برنامه جهت خواندن داده های GPRMC
در این قسمت به بررسی یک نمونه برنامه می پردازیم. در این برنامه داده های NMEA به جز GPRMC را فیلتر می کنیم. سپس با خواندن سریال مانیتور، GPRMC را دریافت کرده و نمایش می دهیم.
#include <SoftwareSerial.h> SoftwareSerial gps(8, 9); void setup() { Serial.begin(115200); gps.begin(9600); Serial.println("PLEASE WAIT....."); delay(1000); //ارسال دستورات مربوط به غیر فعال سازی داده های GPS gps.print("$PUBX,40,GLL,0,0,0,0*5C\r\n"); delay(1000); gps.print("$PUBX,40,GSA,0,0,0,0*4E\r\n"); delay(1000); gps.print("$PUBX,40,GSV,0,0,0,0*59\r\n"); delay(1000); gps.print("$PUBX,40,VTG,0,0,0,0*5E\r\n"); delay(1000); gps.print("$PUBX,40,GGA,0,0,0,0*5A\r\n"); delay(1000); Serial.print("READY TO WORK"); Serial.flush(); } void loop() { String data = ""; while (gps.available() > 0) //تا زمیانیکه داده در بافر است، آن ها را به رشته اضافه کنیم. data.concat(char(gps.read())); Serial.print("DATA: "); Serial.flush(); Serial.println(data); Serial.flush(); delay(1000); }
در کد فوق به کمک کتابخانه سریال نرم افزاری، از طریق پایه های ۸ و ۹ با ماژول GPS ارتباط برقرار می سازیم. سپس دستورات مربوط به غیر فعال سازی داده هایی غیر از GPRMC را ارسال می کنیم. در نهایت با دریافت GPRMC، آن را در سریال مانیتور نمایش می دهیم.
لوازم مورد نیاز
جمع بندی
در سلسله آموزش های ماژول GPS قسمت سوم به معرفی پکت GPRMC پرداختیم. پکت GPRMC یکی از پکت های بسیار مهم و کاربردی در استاندارد NMEA به شمار می رود. در این قسمت از سلسله آموزش، ضمن توضیح، تشریح و معرفی کاربردهای این پکت کلیدی، فیلدهای اطلاعاتی آن را که حاوی اطلاعات مهم و ارزشمند از مختصات جغرافیایی است، بررسی نمودیم. همچنین در ادامه، به طراحی یک برنامه تحت آردوینو جهت دریافت و مشاهده این پکت بر روی سریال مانیتور پرداختیم. با مطالعه این کدها و الگو برداری از آن، شما می تواند در پلتفرم های مختلف نظیر ARM و AVR نیز ارتباط با GPS را فراهم کرده و داده های آن را بخوانید.
دیگر آموزشهای راه اندازی ماژول GPS
راه اندازی و کار با ماژول GPS مدل NEO6M: بخش اول معرفی
راه اندازی ماژول GPS مدل NEO6M: بخش دوم تغذیه و اتصال ماهواره
راه اندازی و کار با ماژول GPS مدل NEO6M: بخش چهارم GPGSV
راه اندازی و کار با ماژول GPS مدل NEO6M: قسمت پنجم پکت GPGGA
راه اندازی و کار با ماژول GPS مدل NEO6M: قسمت ششم پکت GSA
راه اندازی و کار با ماژول GPS مدل NEO6M: قسمت هفتم پکت GPVTG
راه اندازی ماژول GPS مدل NEO6M: قسمت هشتم نرم افزار UCENTER
راه اندازی و کار با ماژول GPS مدل NEO6M: قسمت نهم پروژه عملی
راه اندازی و کار با ماژول GPS شرکت U-BLOX: قسمت دهم مدل Neo8MN
کار با ماژولهای GPS شرکت U-BLOX: قسمت یازدهم: راه اندازی Neo8MN
کار با ماژولهای GPS شرکت U-BLOX: قسمت دوزادهم پروژه ردیاب با Neo8MN
چنانچه مطالب این آموزش را گنک یافتید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در مطالب درج شده و یا کدها وجود دارد میتوانید از همین طریق اطلاع رسانی کنید.
سلام مهندس اموزش ساخت دستگاه هواشناسی هم بزارید
به این صورت که با استفاده از ماژول oled ماژول esp8266
که ماژول esp8266 به اینترنت متصل بشه و پس از دریافت اطلاعات مربوط به شهر مورد نظر را روی نمایشگر oled نشون بده و همچنین اطلاعات هواشناسی چند روز آینده را هم نمایشگر نشون بده
سلام
این مورد پیشتر در دیجی اسپارک نیز کار شده است:
لینک آموزش ویجت هواشناسی، کلیک کنید
سلام مهندس
و اینکه اگر بشه به دستگاه هواشناسی نمایشگر SPI متصل کنیم
که هم اطلاعات اب و هوا مربوط به شهر مورد نظر روی نمایشگر نشان داده شود
بسیار عالی
آموزشی که لینک آن را قرار دادم شاید نیاز به بروز رسانی داشته باشد.
بله حتماً نیاز به بروزرسانی دارد
من اموزشی که لینکش را گذاشتید را دیده بودم ولی چون نمیدونستم باید API را از چه سایتی و چجوری بردارم برام سوال شده بود برای همین گفتم اموزش ساخت دستگاه هواشناسی را بزارید چون شما خیلی عالی توضیح میدهید داخل پروژه ها
شما بی نهایت لطف دارید
روی آن حتما کار می کنم.
سلام.
فیلتر پکت ها رو چجوری باید برداریم؟ یعنی اگه بخوایم فیلتر رو پاک کنیم باید چی کار کنیم؟
با سلام
در برنامه نویسی آردوینو با استفاده از ماژول GPS، شما میتوانید اطلاعات مکانی (مانند عرض جغرافیایی و طول جغرافیایی) را دریافت کنید. برای فیلتر کردن دادهها یا پاک کردن فیلترها، معمولا از شرایط (Conditions) در برنامهنویسی استفاده میشود. مثلا اگر بخواهید فیلتری بر اساس یک شرط اعمال کنید (به عنوان مثال، حداقل یک مقدار عرض جغرافیایی)، میتوانید از دستورات شرطی if استفاده کنید. اگر به فیلتر کردن بر اساس بستههای پیام (packet) از GPS میپردازید، لازم است که به پروتکل ارتباطی GPS که استفاده میکنید مراجعه کنید و فیلترهای خود را بر اساس پروتکل مشخص کنید. به مثال زیر دقت کنید.
#include
TinyGPSPlus gps;
void setup() {
Serial.begin(9600);
}
void loop() {
// خواندن اطلاعات GPS
while (Serial.available() > 0) {
if (gps.encode(Serial.read())) {
// فیلتر کردن بر اساس شرط (مثال: عرض جغرافیایی بزرگتر از ۳۰)
if (gps.location.isValid() && gps.location.lat() > 30.0) {
// اطلاعات مکانی مناسب است، اینجا میتوانید کارهای دیگری انجام دهید
Serial.print(“Latitude: “);
Serial.println(gps.location.lat(), 6);
Serial.print(“Longitude: “);
Serial.println(gps.location.lng(), 6);
}
}
}
}