آموزش آردوینوپروژه های آردوینو

اتصال ماژول GPS به آردوینو (آموزش جامع)

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

معرفی سنسور GPS MTK3339

ماژول GPS مورد استفاده ما Adafruit Ultimate GPS Breakout است. این یکی از ماژول های GPS قابل اعتماد است که می توانید از آن استفاده کنید.

معرفی سنسور GPS MTK3339 

Adafruit Ultimate GPS Breakout از تراشه GPS MTK3339 مدیاتک استفاده می کند. تراشه GPS در زیر آنتن پچ سرامیکی برنزه قرار دارد. GPS دارای اتصال uFL است که برای اتصال یک آنتن خارجی استفاده می شود. چراغ LED FIX چشمک می زند تا به شما اطلاع دهد که آیا ماهواره ای وجود دارد یا خیر. در سمت پایین یک نگهدارنده باتری سکه ای وجود دارد تا GPS بتواند پس از قطع برق اصلی، اتصال به ماهواره را حفظ کند. GPS را می توان با ولتاژ 3.3 ولت یا 5 ولت تغذیه کرد.

سنسور GPS دارای 9 پین است:

  • VIN – برای تغذیه GPS استفاده می شود. به 3.3 ولت یا 5 ولت وصل می شود.
  • 3.3V – منبع تغذیه 3.3 ولتی را فراهم می کند که می تواند دستگاه های دیگر را تغذیه کند.
  • EN – پین فعال کردن است. به طور پیش فرض HIGH است اما اگر LOW شود GPS خاموش می شود.
  • VBATT – پین باتری. به ترمینال مثبت باتری سکه ای متصل است.
  • FIX – به LED ثابت متصل است. هنگامی که LED روشن است این پین HIGH و زمانی که LED خاموش است پین LOW خواهد بود.
  • TX – برای انتقال داده ها از GPS به آردوینو استفاده می شود.
  • RX – برای ارسال دستورات از آردوینو به GPS استفاده می شود.
  • GND – به پایه GND آردوینو متصل می شود.
  • PPS – پالس در ثانیه. این یک سیگنال برای همگام سازی سایر میکروکنترلرها با GPS صادر می کند. با آردوینو مورد نیاز نیست.

GPS چگونه کار می کند؟

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

GPS چگونه کار می کند؟

هنگامی که سنسور GPS قادر به تشخیص و دریافت سیگنال از یک ماهواره باشد، به آن “fix” می گویند. حسگر جی‌پی‌اس نیاز به fix شدن با حداقل سه ماهواره دارد تا بتواند موقعیت مکانی را بخواند. فیکس شدن با ماهواره های بیشتر به شما مکان دقیق تری می دهد.

برای کسب اطلاعات بیشتر مقاله GPS چیست را بخوانید.

اتصال و برنامه ریزی GPS برای دریافت داده های خام

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

قطعات مورد نیاز:

GPS از ارتباط سریال TTL برای ارسال داده ها به آردوینو استفاده می کند، بنابراین ما می توانیم خروجی سنسور را بدون هیچ کدی روی نمایشگر سریال مشاهده کنیم. برای دریافت خوانش خام GPS، ماژول GPS خود را به آردوینو به این صورت وصل کنید:

مدار اتصال ماژول GPS به آردوینو

اکنون سریال مانیتور را در Arduino IDE باز کنید و می‌بینید که خوانش‌های خام GPS در حال چاپ شدن هستند:

خروجی جملات حسگر GPS آردوینو NMEA

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید

داده های خام حسگر GPS در جملات NMEA ارائه شده است.

جملات NMEA چیست؟

چهار جمله مختلف NMEA در خروجی هر سنسور خوانده شده وجود دارد GPRMC، GPVTG، GPGGA و GPGSA:

سنسور GPS آردوینو NMEA Sentences

جمله GPRMC

جمله ای است که ما بیشتر از آن استفاده خواهیم کرد. GPRMC مخفف عبارت Global Positioning Recommended Minimum Coordinates است و بیشتر اطلاعات مکان مورد نظر ما را دارد. هر قسمت از اطلاعات با کاما از هم جدا می شود:

سنسور GPS آردوینو GPRMC NMEA جمله

در اینجا جزئیات مربوط به هر بخش از جمله GPRMC آمده است:

  1. زمان کنونی در گرینویچ
  2. کد وضعیت اگر جمله NMEA معتبر باشد و GPS هنگام دریافت داده‌ها، یک ماهواره‌ Fix داشته باشد، برای فعال بودن “A” خواهد بود. اگر “V” باشد، داده های جمله NMEA باطل است و نباید استفاده شود.
  3. موقعیت عرض جغرافیایی در قالب DDMM.MMMM. دو رقم اول درجه، دو رقم دوم دقیقه و چهار رقم بعد از اعشار جزء کسری مقدار دقیقه است.
  4. جهت اصلی موقعیت عرض جغرافیایی. “N” در شمال استوا و “S” جنوب از استوا خواهد بود.
  5. موقعیت طول جغرافیایی در قالب DDDMM.MMMM. سه رقم اول درجه، دو رقم دوم دقیقه و چهار رقم بعد از اعشار قسمت کسری مقدار دقیقه است.
  6. جهت اصلی موقعیت طول جغرافیایی. “E” در شرق نصف النهار اول یا “W” در غرب نصف النهار اول خواهد بود.
  7. سرعت زمینی بر حسب گره.
  8. مسیری است که GPS در حال حرکت است.
  9. تاریخ fix ماهواره با فرمت DDMMYY.
  10. تغییرات مغناطیسی (انحراف مغناطیسی AKA) برای مکان فعلی شما. مقدار بر حسب درجه به همراه مقداری برای جهت اصلی است.
  11. جهت تغییرات مغناطیسی “E” برای شرق یا “W” برای غرب خواهد بود.
  12. چک جمع. برای بررسی اینکه جمله بدون خطا به آردوینو منتقل شده است استفاده می شود.

جمله GPVTG

جمله بعدی جمله GPVTG است:

جمله حسگر GPS آردوینو GPVTG NMEA

جمله GPVTG شامل مسیر ساخته شده و مقادیر سرعت زمین است.

جمله GPGGA

جمله بعد از آن جمله GPGGA است:

جمله GPGGA

جمله GPGGA حاوی داده‌هایی در مورد کیفیت fix و تعداد ماهواره‌های fix است.

جمله GPGSA

جمله آخر جمله GPGSA است:

جمله GPGSA

جمله GPGSA حاوی اطلاعات بیشتری در مورد کیفیت fix است. برای تبدیل جملات NMEA به قالبی که بتوانیم با آن کار کنیم، باید آنها را تجزیه کنیم.

کد راه اندازی ماژول GPS آردوینو

تجزیه به معنای خواندن متن و تبدیل آن به چیزی برای خواندن آسان تر است. اتصالات را مثل زیر انجام دهید. ما از کتابخانه Adafruit GPS برای برنامه ریزی سنسور استفاده خواهیم کرد.

اتصالات سنسور GPS به برد آردینو

کد کامل و کتابخانه مورد نیاز در انتهای صفحه برای دانلود قرار داده شده اند. در اینجا قسمت های مهم کد را بررسی میکنیم.

ابتدا کتابخانه‌های Adafruit GPS و Software Serial را فراخوانی میکنیم. کتابخانه Adafruit GPS تمام عملکردهای مورد نیاز برای تجزیه جملات NMEA را دارد. کتابخانه Software Serial یک پورت سریال جدید ایجاد می کند تا بتوانیم پین های GPS یعنی Tx و Rx را به هر پین دیجیتال آردوینو متصل کنیم.

سپس از کلاس SoftwareSerial یک شی به نام mySerial ایجاد می کنیم. دو پارامتر را به این شی ارسال می کنیم. اولین پارامتر پین آردوینو است که به پین ​​Rx در جی پی اس متصل است. پارامتر دوم پین آردوینو است که به پین ​​Tx در GPS متصل است.

سپس شی دیگری به نام GPS ایجاد می کنیم تا از توابع موجود در کتابخانه Adafruit GPS استفاده کنیم. ما باید شی mySerial را به شی GPS منتقل کنیم.

در ادامه متغیری به نام c با نوع داده char ایجاد می کنیم. هر جمله NMEA رشته ای از کاراکترها است، بنابراین متغیر c در حین خواندن، کاراکترهای جداگانه را در یک رشته نگه می دارد.

#include <Adafruit_GPS.h> 
#include <SoftwareSerial.h> 

SoftwareSerial mySerial(3, 2);
Adafruit_GPS GPS(&mySerial);

char c; 

در بخش setup() ما سریال مانیتور را مقداردهی اولیه می کنیم، سپس GPS را با تابع ()begin مقداردهی می کنیم. تابع begin() از طریق شی GPS فراخوانی می شود. تابع start() را با نرخ باود پیش‌فرض GPS که 9600 است، تعیین می‌کنیم.

سپس به حسگر می گوییم که کدام جملات NMEA را می خواهیم دریافت کنیم. کتابخانه Adafruit GPS تابعی به نام sendCommand() دارد. اگر از PMTK_SET_NMEA_OUTPUT_RMCGGA به عنوان پارامتر استفاده کنیم، GPS فقط جملات GPRMC و GPGGA را ارسال می کند:

GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);

GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA)؛

اگر فقط به جمله GPRMC نیاز دارید، پارامتر PMTK_SET_NMEA_OUTPUT_RMCONLY را جایگزین کنید:

GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);

اگر همه جملات را می خواهید، پارامتر را به PMTK_SET_NMEA_OUTPUT_ALLDATA تغییر دهید:

GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_ALLDATA)؛

سپس از تابع sendCommand() دوباره برای تنظیم نرخ به روز رسانی GPS استفاده می کنیم. نرخ به روز رسانی مشخص می کند که GPS با چه سرعتی اطلاعات مکان را به آردوینو ارسال می کند. استفاده از PMTK_SET_NMEA_UPDATE_1HZ به عنوان پارامتر، نرخ به روز رسانی را روی یک هرتز تنظیم می کند:

GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ)؛

با استفاده از PMTK_SET_NMEA_UPDATE_5HZ می توانید نرخ به روز رسانی را به 5 هرتز تغییر دهید:

GPS.sendCommand(PMTK_SET_NMEA_UPDATE_5HZ)؛

یا می توانید با استفاده از PMTK_SET_NMEA_UPDATE_10HZ آن را روی 10 هرتز تنظیم کنید:

GPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ)؛

void setup() {
  Serial.begin(9600);
  GPS.begin(9600);

  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);

  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
  delay(1000);
}

روشن شدن سنسور و اجرای این دستورات مدتی طول می‌کشد، بنابراین ۱۰۰۰ میلی‌ثانیه تأخیر ایجاد میکنیم تا قبل از شروع خواندن جملات NMEA، به GPS اجازه دهیم مقداردهی اولیه شود.

قبل از خواندن مجموعه ای از جملات NMEA، باید بافر سریال را پاک کنیم تا مطمئن شویم که هیچ داده قدیمی در آن وجود ندارد. در بخش loop() تابع clearGPS() بافر سریال را برای مجموعه بعدی جملات NMEA پاک می کند.

جملات NMEA از GPS با نرخ 1 هرتز یا یک بار در ثانیه خروجی خواهند شد. بنابراین باید به آردوینو بگوییم که صبر کند تا یک جمله معتبر NMEA برای خواندن آماده شود. ما این کار را با while (!GPS.newNMEAreceived()) انجام می دهیم. این حلقه while منتظر می ماند تا یک جمله NMEA برای خواندن آماده شود.

تابع newNMEAreceived() یک مقدار واقعی را زمانی که مجموعه جدیدی از جملات NMEA دریافت می شود، و زمانی که هیچ جمله NMEA دریافت نشده است، مقدار false را برمی گرداند. کاراکترها در متغیر c ذخیره می شوند. اگر یک جمله NMEA آماده باشد، تابع newNMEAreceived() مقدار واقعی را برمی گرداند.

هنگامی که یک جمله معتبر NMEA از GPS دریافت شد، می‌توانیم آن را با تابع parse() تجزیه کنیم. تابع lastNMEA() آخرین جمله NMEA دریافتی را برمی گرداند. بنابراین اگر از lastNMEA() به عنوان پارامتر در تابع parse() استفاده کنیم، طرح آخرین جمله NMEA دریافتی را می گیرد و آن را تجزیه می کند.

اکنون که تمام جملات NMEA تجزیه شده اند، می توانیم داده ها را در مانیتور سریال چاپ کنیم.

void loop() {

  clearGPS();

  while (!GPS.newNMEAreceived()) {
    c = GPS.read();
  }

  GPS.parse(GPS.lastNMEA());

  Serial.print("Time: ");
  Serial.print(GPS.hour, DEC);
  Serial.print(':');
  Serial.print(GPS.minute, DEC);
  Serial.print(':');
  Serial.print(GPS.seconds, DEC);
  Serial.print('.');
  Serial.println(GPS.milliseconds);

  Serial.print("Date: ");
  Serial.print(GPS.day, DEC);
  Serial.print('/');
  Serial.print(GPS.month, DEC);
  Serial.print("/20");
  Serial.println(GPS.year, DEC);

  Serial.print("Fix: ");
  Serial.print(GPS.fix);
  Serial.print(" quality: ");
  Serial.println(GPS.fixquality);
  Serial.print("Satellites: ");
  Serial.println(GPS.satellites);

  if (GPS.fix) {
    Serial.print("Location: ");
    Serial.print(GPS.latitude, 4);
    Serial.print(GPS.lat);
    Serial.print(", ");
    Serial.print(GPS.longitude, 4);
    Serial.println(GPS.lon);
    Serial.print("Google Maps location: ");
    Serial.print(GPS.latitudeDegrees, 4);
    Serial.print(", ");
    Serial.println(GPS.longitudeDegrees, 4);

    Serial.print("Speed (knots): ");
    Serial.println(GPS.speed);
    Serial.print("Heading: ");
    Serial.println(GPS.angle);
    Serial.print("Altitude: ");
    Serial.println(GPS.altitude);
  }
  Serial.println("-------------------------------------");
}

void clearGPS() {
  while (!GPS.newNMEAreceived()) {
    c = GPS.read();
  }
  GPS.parse(GPS.lastNMEA());

  while (!GPS.newNMEAreceived()) {
    c = GPS.read();
  }
  GPS.parse(GPS.lastNMEA());
}

هنگامی که سنسور GPS را به آردوینو وصل کردید و طرح را آپلود کردید، منتظر بمانید تا LED FIX شروع به چشمک زدن کند تا fix ماهواره را نشان دهد. در صورت عدم fix ماهواره، یک بار در ثانیه و زمانی که fix وجود دارد، هر 15 ثانیه یک بار چشمک می زند.

برای بهترین نتیجه، جی پی اس را در جایی که نمای واضحی از آسمان وجود دارد، ببرید. بسته به جایی که هستید، ممکن است حدود یک دقیقه یا بیشتر طول بکشد تا fix شود. هنگامی که GPS در چند ماهواره fix شد، داده هایی مانند این را خواهید دید که در مانیتور سریال چاپ می شوند:

خروجی NMEA تجزیه شده توسط GPS آردوینو

اگر سؤالی دارید یا در تنظیم آن مشکل دارید، حتماً در زیر نظر بگذارید!

موارد موجود در فایل : سورس کامل و کتابخانه

دانلود فایل های پروژه

5/5 - (1 امتیاز)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.
تصویر از محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

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

نشانی ایمیل شما منتشر نخواهد شد.