سلام به همه مایکروالکامی ها. در قسمت قبلی از سری آموزش موقعیت یابی و راه اندازی ماژول GPS مدل NEO-6m به تحلیل دقیق و بررسی کد های NMEA خروجی ماژول پرداخته شد. در این قسمت با استفاده از خروجی ماژول و استفاده از کتابخانه ++TingGPS با استفاده از ماژول، موقعیت یابی را انجام داده و موقعیت را برروی نقشه نمایش خواهیم داد. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتوانید سایر مطلب من رو از این قسمت مطالعه کنید.
وسایل مورد نیاز
معرفی کتابخانه TinyGPS
همانطور که پیشتر و در مطالب قبلی ذکر شد، خروجی ماژول های GPS حاوی پکت های NMEA میباشد. برای اینکه از اطلاعات بدست آمده بتوان براحتی استفاده کرد، نیاز به تجزیه و تفکیک آنها داریم. برای اینکار دو راه وجود دارد. راه اول استفاده از کتابخانه های آماده در این خصوص است و راه دیگر، بصورت کدنویسی خود ما این کار را انجام دهیم. راه اول خیلی ساده تر است و شما صرفا توابع و دستورات مربوط به کتابخانه را فراخوانی کرده و نتیجه را دریافت خواهید کرد. اما در راه دوم نیاز به برنامه نویسی دقیق تر است تا نتیجه حاصل شود.
برای تجزیه و استخراج اطلاعات NMEA میتوان از کتابخانه ++TinyGPS بهره برد. برای دانلود این کتابخانه جهت استفاده در Arduino IDE از این لینک استفاده کنید. همچنین برای فهمیدن نحوه استفاده از کتابخانه، نحوه عملکرد و اطلاعات بیشتر در باره این کتابخانه به وبسایت ارائه دهنده این کتابخانه مراجعه نمایید.
برنامه نویسی
در این قسمت به بررسی برنامه و کد های مورد نیاز جهت پیدا کردن موقعیت مکانی پرداخته میشود.
بخش ابتدایی و تعاریف
در ابتدای کد ها، کتابخانه های GPS برای راه اندازی ماژول NEO-6M و سریال نرم افزاری را فراخوانی کرده و در ادامه تنظیمات مربوطه را لحاظ میکنیم.
#include <TinyGPS++.h> #include <SoftwareSerial.h> int RXPin = 12; int TXPin = 11; int GPS_Baudrate = 9600; // ساخت object از کتابخانه TinyGPS++ TinyGPSPlus gps; SoftwareSerial gpsSerial(RXPin, TXPin);
تابع نمایش اطلاعات displayInfo
در ادامه به هر بخش از این تابع پرداخته خواهد شد.
یافتن و نمایش موقعیت جغرافیایی:
برای تجزیه و یافتن عرض جغرافیایی در بین NMEA دریافتی از ماژول، از دستور ()gps.location.lat استفاده میشود.
جهت بدست آودن طول جغرافیایی از دستور ()gps.location.lng استفاده خواهد شد.
if (gps.location.isValid()) { Serial.print("Latitude: "); Serial.println(gps.location.lat(), 6); Serial.print("Longitude: "); Serial.println(gps.location.lng(), 6); Serial.print("Altitude: "); Serial.println(gps.altitude.meters()); }
نمایش تاریخ:
جهت نمایش تاریخ میلادی (تاریخ، روز و ماه) از دستورات زیر استفاده میشود.
if (gps.date.isValid()) { Serial.print(gps.date.month()); Serial.print("/"); Serial.print(gps.date.day()); Serial.print("/"); Serial.println(gps.date.year()); }
نمایش ساعت:
جهت نمایش ساعت (ساعت، دقیقه، ثانیه و صدم ثانیه) از دستورات زیر استفاده میشود.
if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(":"); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(":"); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print("."); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.println(gps.time.centisecond()); }
تابع setup
از این تابع برای تنظیمات برنامه در اولین راه اندازی استفاده میشود.
void setup() { Serial.begin(9600); gpsSerial.begin(GPS_Baudrate); }
تابع اصلی loop
در تابع اصلی همواره خروجی ماژول توسط پورت سریال نرم افزاری معرفی شده بررسی میشود. در صورتی که دیتا معتبری یافت شود آنها را برروی سریال مانیتور نمایش خواهیم داد. در صورتی که 5 ثانیه بگذرد و دیتا معتبری وجود نداشته باشد عبارت “No GPS detected” نمایش داده خواهد شد.
void loop() { // نمایش اطلاعات خروجی while (gpsSerial.available() > 0) if (gps.encode(gpsSerial.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println("No GPS detected"); while(true); } }
سورس کد کامل موقعیت یابی با NEO-6M
#include <TinyGPS++.h> #include <SoftwareSerial.h> int RXPin = 12; int TXPin = 11; int GPS_Baudrate = 9600; // ساخت object از کتابخانه TinyGPS++ TinyGPSPlus gps; SoftwareSerial gpsSerial(RXPin, TXPin); void displayInfo() { if (gps.location.isValid()) { Serial.print("Latitude: "); Serial.println(gps.location.lat(), 6); Serial.print("Longitude: "); Serial.println(gps.location.lng(), 6); Serial.print("Altitude: "); Serial.println(gps.altitude.meters()); } else { Serial.println("Location: Not Available"); } Serial.print("Date: "); if (gps.date.isValid()) { Serial.print(gps.date.month()); Serial.print("/"); Serial.print(gps.date.day()); Serial.print("/"); Serial.println(gps.date.year()); } else { Serial.println("Not Available"); } Serial.print("Time: "); if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(":"); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(":"); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print("."); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.println(gps.time.centisecond()); } else { Serial.println("Not Available"); } Serial.println(); Serial.println(); delay(1000); } void setup() { Serial.begin(9600); gpsSerial.begin(GPS_Baudrate); } void loop() { // نمایش اطلاعات خروجی while (gpsSerial.available() > 0) if (gps.encode(gpsSerial.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println("No GPS detected"); while(true); } }
برای دانلود سورس کد از این لینک استفاده کنید.
مشاهده نتیجه خروجی
ابتدا پایه Rx ماژول را به پایه 11 و پایه Tx ماژول را به پایه 12 آردوینو متصل کنید. همچنین با استفاده از یک مبدل کاهنده خروجی آن را روی 3.3v تنظیم کرده و به ماژول NEO-6M وصل کنید. در نهایت برنامه را آپلود نمایید. در تصویر زیر نتیجه را مشاهده خواهید کرد. در هر ثانیه اطلاعات برروی سریال مانیتور نمایش پیدا خواهد کرد.
نکته: GND مبدل کاهنده را به پایه GND آردوینو و ماژول GPS وصل کنید.
ساخت لینک گوگل مپ
برای نمایش موقعیت مستقیما روی گوگل مپ، یا طول و عرض جغرافیایی را در سرچ نقشه گوگل وارد میکنیم یا لینک آن را میسازیم. برای ساخت لینک گوگل مپ موقعیت فعلی خود، از ساختار زیر استفاده نمایید. بجای Latitude عرض جغرافیایی و بجای Longitude طول جغرافیایی بدست آمده و نمایش داده شده در سریال مانیتور را جایگزین نمایید.
http://maps.google.com/maps?q=Latitude,Longitude
بعنوان مثال لینک زیر، موقعیت مایکروالکام را برروی نقشه نمایش خواهد داد.
http://maps.google.com/maps?q=32.6574508,51.6655308
نتیجه گیری
در این مطلب نحوه تجزیه و تفکیک کد های NMEA خروجی ماژول GPS مدل NEO-6M بررسی شد. همچنین با استفاده از طول و عرض جغرافیایی بدست آمده و وارد کردن آن در گوگل مپ و ساخت لینک آن، موقعیت مکانی بدست آمده نمایش داده شد. در قسمت های بعدی به نحوه ارسال موقعیت مکانی با استفاده از دریافت پیامک پرداخته خواهد شد.
امیدوارم از این آموزش کمال بهره را برده باشید. در صورتی که هرگونه نظر یا سوال داشتید درباره این آموزش لطفا اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو حتما به اشتراک بگذارید. همینطور میتونید این آموزش را پس از اجرای عملی توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.
نههیچمشکلیایجادنمیکنه
چه چیزی مشکلی ایجاد نمیکنه؟
با سلام…من یه gps دارم ولی نوع دقیقشو نمیدونم ولی ظاهرش شبیه gps های شرکت یوبلاکس…. اگه بخوام امتحانش کنم که درست کار میکنه یا نه چطور باید امتحان کنم؟؟؟ ایا کدی که نشتید برای امتحان کردنش مناسبه؟؟
سلام، فرقی نمیکنه ماژول چی هستش مهم اینه که باید به دستورات AT پاسخ بده و اگر داد یعنی ماژول سالم هست. برای اطمینان از عملکرد هم باید آنتن متصل بشه و شرایط ابتدایی طی بشه و نهایتا ببینید خروجی سریال ماژول چی بهتون میده. اگر لوکیشن رو داد قطعا سالم هست.
سلام وقت بخیر
۱- برای تغذیه ماژول ممکن هست از پایه ی ۵ ولت و ۳.۳ ولت آردوینو استفاده کرد ؟ vcc ماژول به پایه ۵ ولت مشکلی برای آن ایجاد نمی کند ؟
۲- حالت cold start برای ماژول چند دقیقه معمولا طول می کشد اگر در فضای باز باشیم ؟
باتشکر
سلام،
۱- مشکلی نیست ولی بهتره استفاده نکنید بدلیل مسائل جریان کشی ممکنه آسیب ببینه آردوینو و اغلب نمیتونه ماژول GPS رو درست بایاس کنه و طبعا ماژول به ماهواره ها کانکت نمیشه. پس تغذیه مستقل استفاده کنید.
۲- مطلق نیست جواب این سوال به خیلی چیزا بستگی داره مثل آب و هوا، محیط اطراف، ساختمان های اطراف ماژول و… . اما معمولا بین چند تا چندین دقیقه هستش.