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

آموزش اتصال ماژول GPS NEO-M8N به آردوینو

در این راهنما یاد می‌گیرید چگونه برد Arduino را به ماژول GPS مدل NEO-M8N متصل کنید. همچنین نحوه سیم‌کشی ماژول به برد و برنامه‌نویسی آن برای دریافت داده‌های GPS شامل latitude، longitude، altitude، زمان UTC، تعداد ماهواره‌های قابل مشاهده و سایر اطلاعات مرتبط را خواهید آموخت.

Arduino با ماژول GPS مدل NEO-M8N

در این آموزش موارد زیر را یاد خواهید گرفت:

  • سیم‌کشی ماژول NEO-M8N GPS به Arduino از طریق ارتباط سریال؛
  • دریافت داده‌های خام GPS؛
  • پردازش داده‌های خام برای استخراج اطلاعات قابل‌خواندن GPS با استفاده از کتابخانه TinyGPSPlus.

معرفی ماژول GPS مدل NEO-M8N

ماژول NEO-M8N GPS یکی از محبوب‌ترین گیرنده‌های GPS برای استفاده با میکروکنترلرها در پروژه‌های ناوبری و ردیابی است. این ماژول قادر است اطلاعاتی مانند latitude، longitude، altitude و time را دریافت کند.

معرفی ماژول GPS مدل NEO-M8N

این ماژول از چندین سیستم ماهواره‌ای از جمله GPS، Galileo، GLONASS و BeiDou پشتیبانی می‌کند. در مقایسه با مدل NEO-6M، عملکرد بهتری در ردیابی ماهواره‌ها ارائه می‌دهد و در شرایط محیطی چالش‌برانگیز، پایدارتر و قابل‌اعتمادتر عمل می‌کند.

بر اساس دیتاشیت رسمی، این ماژول دارای دقت موقعیت‌یابی افقی بین 2.5 تا 4 متر است و زمان راه‌اندازی سریعی دارد (1 ثانیه برای Hot Start و بین 26 تا 57 ثانیه برای Cold Start — در صورتی که نزدیک ساختمان‌ها باشید ممکن است زمان بیشتری نیاز باشد).

این ماژول مجهز به باتری پشتیبان، حافظه EEPROM داخلی و نشانگر LED است که پس از دستیابی به موقعیت (Position Fix) به صورت چشمک‌زن عمل می‌کند.

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

ماژول GPS مدل NEO-M8N

ماژول NEO-M8N GPS از طریق پروتکل ارتباطی Serial با میکروکنترلر ارتباط برقرار می‌کند و از جملات استاندارد NMEA استفاده می‌کند. NMEA مخفف National Marine Electronics Association است و در دنیای GPS به‌عنوان یک فرمت استاندارد داده شناخته می‌شود که توسط تولیدکنندگان گیرنده‌های GPS پشتیبانی می‌شود.

مدار ماژول NEO-M8N GPS به آردوینو

برای برقراری ارتباط با ماژول NEO-6M GPS از Software Serial استفاده می‌کنیم، بنابراین می‌توانید از هر پین در دسترس استفاده کنید. در این آموزش از Pin 5 (TX → اتصال به RX ماژول) و Pin 6 (RX → اتصال به TX ماژول) استفاده می‌شود.

مدار ماژول NEO-M8N GPS به آردوینو

NEO-M8N GPS Module Arduino
VCC 5V
RX Pin 5
TX Pin 6
GND GND

دریافت داده‌های خام GPS

برای دریافت داده‌های خام GPS، باید یک ارتباط سریال با ماژول GPS برقرار کرده و داده‌های در دسترس را بخوانید.

دریافت داده‌های خام GPS

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

کد کامل در فایل دانلودی انتهای صفحه قرار گرفته است.

نحوه کار کد دریافت داده GPS خام

این اسکچ فرض می‌کند که از Pin 6 و Pin 5 به‌عنوان پین‌های RX و TX برای برقراری ارتباط سریال با ماژول GPS استفاده می‌کنید. در صورت استفاده از پین‌های دیگر، باید مقادیر زیر را ویرایش کنید:

static const int RXPin = 6, TXPin = 5;

همچنین اگر ماژول شما از نرخ Baud پیش‌فرضی غیر از 9600 bps استفاده می‌کند، باید مقدار خط زیر را تغییر دهید:

static const uint32_t GPSBaud = 9600;

سپس یک نمونه از SoftwareSerial روی پین‌های تعریف‌شده با نام gpsSerial ایجاد می‌کنیم تا ارتباط با ماژول GPS برقرار شود.

در تابع setup()، ابتدا Serial Monitor را با نرخ 9600 مقداردهی اولیه می‌کنیم.

Serial.begin(9600);

سپس ارتباط سریال با ماژول GPS را راه‌اندازی می‌کنیم.

gpsSerial.begin(GPSBaud);

در تابع loop()، کد به پورت سریال GPS گوش می‌دهد و هر زمان داده‌ای از ماژول دریافت شود، آن را در Serial Monitor نمایش می‌دهد.

تست کد دریافت داده خام از ماژول جی پی اس

کد را روی برد Arduino خود آپلود کنید.

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

تست کد دریافت داده خام از ماژول جی پی اس

LED آبی ماژول پس از دستیابی به موقعیت (Position Fix) شروع به چشمک‌زدن می‌کند.

در Serial Monitor جملات NMEA شامل داده‌های GPS نمایش داده می‌شوند (اطمینان حاصل کنید که نرخ Baud در Serial Monitor روی 9600 تنظیم شده است).

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

دریافت داده‌های خام GPS با Arduino و NEO-M8N

در Serial Monitor مجموعه‌ای از داده‌ها را در قالب زبان استاندارد GPS یعنی NMEA مشاهده خواهید کرد. هر خطی که دریافت می‌کنید یک جمله NMEA محسوب می‌شود.

NMEA مخفف National Marine Electronics Association است و در حوزه GPS یک فرمت استاندارد داده به شمار می‌رود که توسط تولیدکنندگان گیرنده‌های GPS پشتیبانی می‌شود.

جملات NMEA

جملات NMEA با کاراکتر $ آغاز می‌شوند و هر فیلد داده با کاما از دیگری جدا می‌شود.

انواع مختلفی از جملات NMEA وجود دارد. نوع پیام توسط کاراکترهای قبل از اولین کاما مشخص می‌شود.

عبارت GN بعد از $ نشان‌دهنده داده موقعیت GPS است. جمله $GNGGA پیام پایه GNSS در قالب NMEA است که اطلاعات موقعیت سه‌بعدی و داده‌های دقت را ارائه می‌دهد.

در جمله زیر:

$GNGGA,110827.00,4114.32485,N,00831.79799,W,1,10,0.93,130.6,M,50.1,M,,*5F

ساختار فیلدها برای ماژول M8N به شکل زیر است:

  • $GNGGA: داده موقعیت جهانی GNSS
  • 110827.00: زمان به‌صورت UTC (11:08:27)
  • 4114.32485,N: Latitude
  • 00831.79799,W: Longitude
  • 1: کیفیت Fix (1 = GPS Fix، 2 = DGPS و غیره)
  • 10: تعداد ماهواره‌های ردیابی‌شده (در M8N معمولاً بیشتر از NEO-6M است)
  • 0.93: Horizontal Dilution of Precision یا HDOP (هرچه کمتر باشد بهتر است)
  • 130.6,M: ارتفاع نسبت به سطح متوسط دریا بر حسب متر
  • 50.1,M: ارتفاع ژئوئید نسبت به بیضوی WGS84
  • *5F: Checksum محاسبه‌شده برای NEO-M8N

سایر جملات NMEA اطلاعات تکمیلی ارائه می‌دهند:

  • $GNRMC – داده‌های ضروری GNSS شامل Position، Velocity و Time
  • $GNVTG – اطلاعات سرعت و مسیر حرکت
  • $GNGGA – اطلاعات Fix مربوط به GNSS
  • $GNGSA – اطلاعات DOP و ماهواره‌های فعال
  • $GLGSV – اطلاعات دقیق ماهواره‌ها (GLONASS)
  • $GNGLL – Latitude و Longitude جغرافیایی

با این حال، ساده‌ترین و حرفه‌ای‌ترین روش برای دریافت و تفسیر داده‌های GPS موردنیاز، پردازش مستقیم جملات NMEA در داخل کد است. برای این منظور می‌توان از کتابخانه TinyGPSPlus استفاده کرد که متدهای آماده‌ای برای استخراج داده‌های موردنظر از جملات NMEA فراهم می‌کند.

پردازش جملات NMEA با کتابخانه TinyGPSPlus

کتابخانه TinyGPSPlus فرآیند دریافت داده‌های GPS را در قالبی قابل‌فهم و ساختاریافته بسیار ساده می‌کند. برای دریافت اطلاعات بیشتر درباره کتابخانه TinyGPSPlus می‌توانید به مستندات رسمی آن مراجعه کنید.

پردازش جملات NMEA با کتابخانه TinyGPSPlus

نصب کتابخانه TinyGPSPlus

در نرم‌افزار Arduino IDE به مسیر Sketch > Include Library > Manage Libraries بروید یا روی آیکون Library Manager در نوار کناری سمت چپ کلیک کنید.

عبارت TinyGPSPlus را جستجو کرده و کتابخانه ارائه‌شده توسط Mikal Hart را نصب کنید.

دریافت داده‌ GPS با ماژول NEO-6M و کتابخانه TinyGPSPlus

کد زیر نحوه دریافت داده‌های GPS با استفاده از کتابخانه TinyGPSPlus را نشان می‌دهد. در این مثال اطلاعاتی مانند date، time، speed، altitude، تعداد ماهواره‌های قابل مشاهده و HDOP (معیاری برای سنجش دقت سیگنال) استخراج می‌شود.

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

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

ابتدا کتابخانه TinyGPSPlus و SoftwareSerial را به پروژه اضافه می‌کنیم.

سپس پین‌های مورد استفاده برای RX و TX و همچنین نرخ Baud ماژول GPS را تعریف می‌کنیم.

static const int RXPin = 6, TXPin = 5;
static const uint32_t GPSBaud = 9600;

در ادامه یک شیء از نوع TinyGPSPlus ایجاد می‌کنیم:

TinyGPSPlus gps;

سپس یک نمونه از SoftwareSerial روی پین‌های تعریف‌شده ایجاد می‌شود:

SoftwareSerial gpsSerial(RXPin, TXPin);

در تابع setup()، ابتدا Serial Monitor مقداردهی اولیه شده و سپس ارتباط سریال با ماژول GPS آغاز می‌شود.

در تابع loop() فرآیند دریافت و پردازش اطلاعات انجام می‌شود. داده‌های دریافتی از ماژول GPS با استفاده از متد encode() به شیء gps منتقل می‌شوند:

while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}

پس از پردازش داده‌ها، می‌توان بررسی کرد که آیا اطلاعات جدیدی دریافت شده است یا خیر:

if (gps.location.isUpdated()) {

در صورت به‌روزرسانی داده‌ها، اطلاعات به شکل زیر قابل استخراج هستند:

  • Latitude → gps.location.lat()
  • Longitude → gps.location.lng()
  • Speed (km/h) → gps.speed.kmph()
  • Altitude (meters) → gps.altitude.meters()
  • HDOP → gps.hdop.value()
  • تعداد ماهواره‌های قابل مشاهده → gps.satellites.value()
  • Year → gps.date.year()
  • Month → gps.date.month()
  • Day → gps.date.day()
  • Hour → gps.time.hour()
  • Minutes → gps.time.minute()
  • Seconds → gps.time.second()

در کد نمونه، تمامی این اطلاعات دریافت شده و در Serial Monitor نمایش داده می‌شوند تا بتوانید موقعیت مکانی، سرعت، ارتفاع، تعداد ماهواره‌های فعال و زمان UTC را مشاهده کنید.

تست کد

کد را روی برد Arduino خود آپلود کنید. سپس Serial Monitor را با نرخ Baud برابر با 9600 باز کنید. اطمینان حاصل کنید که ماژول GPS در فضای باز یا کنار پنجره قرار دارد تا بتواند سیگنال ماهواره‌ها را دریافت کند.

دریافت داده‌ GPS با ماژول NEO-6M و کتابخانه TinyGPSPlus

توجه: ممکن است چند ثانیه تا چند دقیقه طول بکشد تا ماژول به موقعیت‌یابی (Position Fix) برسد.

پس از دریافت Fix، اطلاعاتی شامل موقعیت فعلی، سرعت، ارتفاع، تعداد ماهواره‌های قابل مشاهده، مقدار HDOP و زمان در Serial Monitor نمایش داده می‌شود.

HDOP مخفف Horizontal Dilution of Precision است و معیاری برای سنجش دقت تعیین موقعیت محسوب می‌شود. هرچه مقدار HDOP بیشتر باشد، دقت تعیین موقعیت کمتر خواهد بود. در حالت ایده‌آل، مقدار HDOP باید کمتر از 2 باشد. مقدار پایین‌تر نشان‌دهنده دقت بالاتر است.

در این راهنما با نحوه استفاده از ماژول NEO-M8N GPS همراه با Arduino آشنا شدید. این ماژول از نظر ساختار عملکرد مشابه NEO-6M است، اما از چندین سیستم ماهواره‌ای پشتیبانی می‌کند و محدود به GPS نیست. همچنین نحوه دریافت اطلاعات مربوط به موقعیت مکانی و زمان به‌صورت دقیق و ساختاریافته بررسی شد.

موارد موجود در فایل : سورس کامل

4.3 (3 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

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

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